我有一个称为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 :(得分: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循环