从字符串的有序向量中删除重复项
Remove duplicates from ordered vector of strings
从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。
为了删除重复项,我可以简单地将每个向量项添加到集合/unordered_set中,但它会根据默认比较对象的标准修改顺序。
一种简单的方法是遍历向量,同时跟踪遇到的元素,并删除以前遇到的元素。
这是一段代码,正是这样做的。
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;
}
}
住在科利鲁。
它可能会被优化,例如,当所有元素都是重复的时,通过删除元素范围,或者通过将每个新元素与当前的第一个副本交换,并在最后擦除包含所有重复项的向量的整个末端。
您可以创建 set,然后迭代 vector,将 set 中的元素复制到向量中,然后从 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());
相关文章:
- 从向量的向量中删除向量的组合
- C++ 如何删除向量中的节点
- 删除向量中的空元素
- 删除向量中的指针会导致错误
- 如何通过索引中删除向量中的2个元素的每个倍数
- 在迭代过程中删除向量的唯一元素?
- 删除向量而不删除数组
- 向量问题,如何删除向量中的数组?
- 使用迭代列表中删除向量中的元素
- 如何按顺序删除向量中的重复值
- 擦除范围从std :: vector删除向量的最佳方法
- 在循环中删除向量的一个元素
- 删除向量的第一个元素并将其大小减小 1
- 如何删除向量的指针
- 正确删除向量的元素
- 删除向量中数字的单次出现,当数字在反向遍历时出现多次时
- 删除向量的第一个元素并释放C++中的内存
- 在 c++ 中删除向量的单个元素时出现问题
- C++如何删除向量中的特定对象
- 当包含对象包含unique_ptr时,如何删除向量的元素