从C ++ std::vector<std::string>
删除重复项的最简单方法是什么?我希望保留订单。
例如:
std::vector<std::string> container;
container.push_back("z");
container.push_back("y");
container.push_back("x");
container.push_back("z");
最后,我只想让我的矢量包含(按顺序):z,y,x。
为了删除重复项,我可以简单地将每个矢量项添加到set / unordered_set中,但它会根据默认比较对象的标准修改顺序。
答案 0 :(得分:1)
一种简单的方法是迭代向量,同时跟踪遇到的元素,并删除之前遇到过的元素。
这是一段完全符合这一要求的代码。
std::unordered_set<std::string> encounters;
for (auto i = 0u; i < container.size(); ++i) {
if (!encounters.insert(container[i]).second) {
// The string was already in encounters
container.erase(container.begin() + i);
--i;
}
}
它可能是优化的,例如,当所有元素都是重复时删除元素的范围,或者可以通过用当前的第一个副本交换每个新元素,最后删除包含所有元素的向量的整个末尾。重复。
答案 1 :(得分:-1)
你可以创建set然后遍历vector,将set中的元素复制到vector中,然后从已经复制的set中删除每个元素。例如:
std::vector<int> v{1,1,2,2,3,3};
std::set<int> s(v.begin(), v.end());
vector<int> v2(s.size()); // v2 will contain unique elements
// from v in the same order
for (int i = 0, j=0; i < v.size(); ++i) {
if (s.find(v[i]) != s.end()) {
v2[j++] = v[i];
s.erase(v[i]);
}
}
v.assign(v2.begin(), v2.end());