【发布时间】:2020-12-18 11:48:53
【问题描述】:
我想从向量中删除重复元素,同时保持向量的当前顺序。
下面我有一个建议的实现。首先,这样安全吗?
其次,从“使用 C++ 算法而不是重新发明轮子”的角度来看,是否有更好的方法可以更有效或更好地做到这一点。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
int main()
{
using namespace std;
std::vector<int> v= {1, 7, 2, 3, 8, 4, 5, 3, 2, 3, 2, 6, 2, 3, 2, 9, 10, 1, 2, 2, 1};
std::vector<int>::iterator finalEnd = v.end();
for (auto vIter = v.begin(); vIter != v.end(); ++vIter) {
for (auto nextvIter = vIter + 1; nextvIter != v.end(); ++nextProjIter) {
if (*vIter == *nextvIter)
finalEnd = std::remove(vIter, finalEnd, *nextvIter);
}
}
v.erase(finalEnd, v.end());
for(auto p : v)
cout << p << " ";
//Should return: 1 7 2 3 8 4 5 6 9 10
return EXIT_SUCCESS;
}
【问题讨论】:
-
不,恐怕显示的逻辑存在致命缺陷,并且在某些极端情况下会失败。而且,是的,要回答被问到的问题,是的,有一种更好的方法可以做到这一点,使用 set 或 unordered_set 来跟踪重复项。只使用一个循环,应该需要大约一半的代码,并且要简单得多。有关使用集合和其他关联容器的更多信息,请参阅 C++ 教科书。
-
尽可能使用 std::set。元素是有序的,并且不可能重复(至少对于从头开始的 POD 类型)。