很抱歉,我知道有些人会问如何删除重复项,但我认为这需要一个新线程,因为我的编译器会出现一些奇怪的东西。
vector<string> removeDuplicates(vector<string> vector)
{
for (vector<string>:: const_iterator it = vector.begin(); it != vector.end(); ++it)
{
for (vector<string>:: const_iterator sit = vector.begin(); sit != vector.end(); ++sit)
{
if(it != sit)
{
if(*it == *sit)
{
vector.erase(it);
}
}
}
}
return vector;
}
我不明白为什么它会给我错误。我是C ++的新手,所以问题可能听起来有点愚蠢。是因为我在同一个向量上循环吗?
答案 0 :(得分:4)
您不想一次删除1个项目。使用删除 - 擦除模式将删除一次应删除的所有元素,而不是几次擦除调用。在这种情况下(因为您似乎想要删除所有重复的元素),您可以将矢量复制到std::set
(不允许复制),然后将其分配回来。
错误消息似乎显示您的实施中存在错误。 std::vector::erase
应该能够使用const_iterator
(请参阅下面标准中的引用),但是您看到的错误消息表明您的实现没有以这种方式定义。
§23.3.6.5
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);
您的当前实现也会得到未定义的行为,因为迭代器在擦除后会失效,因此it++
在循环条件下无效。
如果切换到更有效的删除方法,这也可能解决了这个问题。
设置方法
std::vector<std::string> vec;
// fill vector with duplicates
std::set<std::string> sVec(vec.begin(), vec.end()); // copies the vector into a set, duplicates removed
vec.assign(sVec.begin(), sVec.end()); // pushes the data in the set back to the vector
删除/唯一删除方法(假设顺序无关紧要)
std::vector<std::string> vec;
// fill vector with duplicates
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
答案 1 :(得分:1)
我认为,条件应该是:
if(it != sit)
{
if(*it == *sit)
{
sit = vector.erase(sit)
}
else
{
++sit;
}
}
并且不要继续进行循环
删除正在擦除的迭代器的常量。将sit设为vector :: iterator。
答案 2 :(得分:1)
当擦除向量中的项时,使用erase()返回的有效迭代器。
比如,iterator = vector.erase(iterator)
另外,当您碰巧擦除向量中的最后一项时,执行++迭代器将无效。
此链接可能有助于vector erase iterator
答案 3 :(得分:-1)
这样做:
it = vector.erase(it);