从结构向量中删除重复的元素(C ++)

时间:2020-08-07 06:30:55

标签: c++ vector struct compare

我有一个称为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}}。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

最简单的解决方法是重载“ ==”运算符。在第1步中完成的操作。第2步仅出于方便目的(对于cout方法,重载了“ <<”运算符)。在步骤3中删除重复项。通过重新加载“ ==”运算符,简单的for循环和两个迭代器的比较就足够了。

#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循环