C ++ - сопоставить и заменить элемент по значению в векторе пользовательских типов данных - PullRequest
0 голосов
/ 04 июля 2018

У меня есть вектор, который содержит данные для разных групп. Если я вставляю новые данные для группы в вектор, они должны заменить старые данные новыми для того же номера группы. Для этого конкретного примера std::replace дает ошибку std::replace': no matching overloaded function found

#include <iostream>
#include <vector>
#include <algorithm>

class data
{
    public:
        int group;
        bool condition;
        int time;
        friend bool operator==(const data& lhs, const data& rhs);
        data(int g, bool c, int t) 
        {
            group = g;
            condition = c;
            time = t;
        }
};

bool  operator==(const data& lhs, const data& rhs)
{
    return lhs.group == rhs.group;
}
int main(int argc, char**)
{
    data info_1(10, true , 1);
    data info_2(20, true, 1);
    data info_3(10, false, 4);

    std::vector<data> data_vector;

    data_vector.push_back(info_1);
    data_vector.push_back(info_2);

    std::replace(data_vector.begin(), data_vector.end(), data_vector ,info_3);

    std::cout << "vector size: " << data_vector.size() << "\n";
    for (int i = 0; i < data_vector.size(); i++)
    {
        std::cout << "group number: " << data_vector[i].group << std::boolalpha << " condition: " << data_vector[i].condition << "\n";
    }
    system("pause");
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Согласно https://en.cppreference.com/w/cpp/algorithm/replace третий параметр для std::replace() равен const T& old_value. Вы передаете весь вектор. Вот почему вы получаете no matching overloaded function found.

0 голосов
/ 04 июля 2018

Вы должны использовать std::map, где группа - это ключ, а остальные данные - это значение.

Таким образом, когда вы вставляете на карту новый элемент, он добавляется, если его номер группы уже существует, а затем заменяет существующий элемент.

class data
{
    public:
        bool condition;
        int time;
        friend bool operator==(const data& lhs, const data& rhs);
        data(bool c, int t) 
        {
            condition = c;
            time = t;
        }
};

и затем используйте std::map<int, Data> в качестве контейнера.

Вы также можете реализовать класс-оболочку, имеющий std::map<int, Data> в качестве закрытого члена, реализующий вставку и итерацию (и, возможно, удаление и т. Д.), А затем вы можете использовать вне его ExtendedData или что-то еще, что реализовано как вы реализовали Data вначале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...