std::auto_ptr
является устаревшим и удален из стандартной библиотеки начиная со стандарта C++17.std::unique_ptr
.std::auto_ptr
мог следить только за памятью одного экземпляра. Передать туда память массива можно, но деструктор будет вызван только у первого экземпляра массива. В общем смысле это означает утечку памяти.std::unique_ptr
, наоборот, способен контролировать память как единичного экземпляра, так и массива экземпляров. Еще в отличии от своего устаревшего товарища, std::unique_ptr
способен спокойно передавать свое состояние, не создавая возможность двойного освобождения памяти. В дополнение, std::unique_ptr
еще способен пользоваться нестандартными деструкторами, что очень кстати при работе, например, с COM-объектами или нестандартной схемой аллокации памяти.main
.На данный момент обучаюсь программированию по книге "You don't know Javascript"обучаться программированию (читай - учиться программировать) на JS - тоже самое, что обучаться водить легковой автомобиль с помощью бульдозера. JS совсем не подходит для обучения программированию.
стоит ли мне сейчас действительно вдумчиво изучатьнет
ptd = (double *) calloc(sizeof(double), 10);
что значить Звёздочка после типа?
Для чего после double стоит *, ведь это символ разыменования, а что мы разыменуем?
Зачем перед malloc стоит (double*)
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <string>
#include <fstream>
#include <cmath>
#include <functional>
using namespace std;
class Finder
{
public:
list<vector<double>> lines; //список, в котором информация
vector<double> input = {0, 0}; //массив, который вводит пользователь
string path; //путь к файлу
Finder(string path, string numbs) //конструктор открывает файл и создает входной массив
{
this->path = path;
int l = numbs.size();
vector<double> input;
for (int i = 0; i < l; i++)
{
string buffer = "";
if (numbs[i] != ' ')
{
buffer += numbs[i];
}
else
{
input.push_back(stod(buffer));
buffer = "";
}
}
this->input = input;
cout << "Initialization was successful" << endl;
}
void GetData() //да, загружать из файла в память обязательно
{
ifstream fin(path);
string line;
while (getline(fin, line))
{
int l = line.size();
string buffer = "";
vector<double> numbers;
for (int i = 0; i < l; i++)
{
if (line[i] != ' ')
{
buffer += line[i];
}
else
{
numbers.push_back(stod(buffer));
buffer = "";
}
}
this->lines.push_back(numbers);
}
fin.close();
cout << lines.size();
}
double GetDistance(vector<double> a) //расчет расстояним между точками
{
int l = this->input.size();
double sum = 0;
for (int i = 0; i < l; i++)
{
double el_i = this->input.at(i);
double el_a = a.at(i);
sum += pow((el_i - el_a), 2);
}
return sqrt(sum);
}
bool compareTo(vector<double> a, vector<double> b) //компаратор
{
return GetDistance(a) < GetDistance(b);
}
void ShowHeigbor() //для пользователя
{
using namespace std::placeholders; // for _1, _2, _3...
this->lines.sort(std::bind(&Finder::compareTo, this, _1, _2));
}
};
int main()
{
string inp;
cout << "Input vector: ";
cin >> inp;
Finder f{"data.txt", inp};
f.GetData();
//f.ShowHeigbor();
}
void screen_function(); // объявление
// ...
void loop(){
screen_function(); // первое использование
}
// ...
void screen_function()
{
// ... определение
}
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 128
int name_pc(char* buf) {
FILE *p = popen("hostname", "r");
if (p == NULL)
return 0;
int r = 1;
if (!fgets(buf, BUF_SIZE, p))
r = 0;
pclose(p);
return r;
}
int main(int argc, char* argv[]) {
char hostname[BUF_SIZE];
if (!name_pc(hostname)) {
fputs("Error!", stderr);
return EXIT_FAILURE;
}
printf("%s\n", hostname);
return EXIT_SUCCESS;
}
Node root = {T{}, nullptr, nullptr};
Node root{T{}, nullptr, nullptr};