Задать вопрос
BitNeBolt
@BitNeBolt

Не работает sort, но явную ошибку в коде не находит. Как исправить?

Решил написать что-то на подобии алгоритма k ближайших соседей, но столкнулся с проблемой функции sort.
Вот вкратце алгоритм действий:
  1. Пользователь вводит данные
  2. Уже имеющийся массив с информацией сортируется по увеличению расстояния до точки
  3. Пользователь может выбрать сколько соседей показать


Но при запуске программы компилятор выдает ошибку в файле list.tcc (не моем) в строке 385. Мне кажется, что то-то не так с компаратором, но не могу понять что.

Почему возникает эта проблема и как её исправить?

Вот код:
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <string>
#include <fstream>
#include <cmath>

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() //для пользователя
    {
        this->lines.sort(this->compareTo);
    }
};

int main()
{
    string inp;
    cout << "Input vector: ";
    cin >> inp;

    Finder f{"data.txt", inp};

    f.GetData();
    //f.ShowHeigbor();
}
  • Вопрос задан
  • 399 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@lorc
Вы бы хотя бы привели сообщение об ошибке.

Проблема в том, что ваш компаратор - это метод класса. Было бы странно использовать его без объекта. На что вам компилятор и намекает.

Вот исправленный вариант:

#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();
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы