Удаление повторяющихся элементов из вектора структур (C ++) - PullRequest
0 голосов
/ 07 августа 2020

У меня есть вектор структуры под названием ParsedFlag;

struct ParsedFlag {
    std::string flag, value;

    ParsedFlag init(std::string f, std::string v)
    {
        flag = f;
        value = v;

        return *this;
    }
}

Теперь у меня есть повторяющиеся записи, которые выглядят так:

(gay, yes)
(verbose, haha ok)
(desc, yeah okay)
(desc, yeah okay)
(a, 2)
(a, 2)
(c, c)
(f, f)
(g, 1)
(a, a)
(b, b)
(c, 1)

, и моя цель - удалить все дубликаты уже существующих: (desc, yeah okay), (a, 2).

Как это сделать?

1 Ответ

0 голосов
/ 07 августа 2020

Самое простое решение проблемы - перегрузить оператор «==». То, что было сделано на шаге 1. Шаг 2 предназначен только для удобства (перегрузка оператора «<<» для метода cout). Удаление дубликатов выполняется на шаге 3. После перезагрузки оператора «==» достаточно простого для l oop и сравнения двух итераторов. </p>

#include <iostream>
#include <vector>
using namespace std;

struct ParsedFlag {
    std::string flag, value;

ParsedFlag init(std::string f, std::string v)
{
    flag = f;
    value = v;

    return *this;
}
};

//1)
inline bool operator==(const ParsedFlag& lhs, const ParsedFlag& rhs)
{
    return lhs.flag == rhs.flag and lhs.value == rhs.value;
}

//2
ostream& operator<<(ostream& os, const ParsedFlag& fl)
{
    os << fl.flag << ' ' << fl.value;
    return os;
}

int main() {
    std::vector<ParsedFlag> vec
    {
        {"gay", "yes"},
        {"gay", "yes"},
        {"verbose", "haha ok"},
        {"desc", "yeah okay"},
        {"desc", "yeah okay"}
    };
    
    for(const auto& fl : vec)
    {
        cout << fl << endl;
    }

    //3
    auto prev_it = vec.begin();
    for (auto it = vec.begin() + 1; it != vec.end(); ) 
    {
        if (*it == *prev_it)
        {
            it = vec.erase(it);
        } else 
        {
            ++it;
            ++prev_it;
        }
    }
    
    cout << "--- after---" <<endl;
    for(const auto& fl : vec)
    {
        cout << fl << endl;
    }
    return 0;
}

Другим решением может быть использование std :: функция find_if и for_each l oop

...