C++ 在C++;
抱歉,我知道有些人会问如何删除重复项,但我认为这需要一个新线程,因为我的编译器中出现了一些奇怪的东西C++ 在C++;,c++,loops,vector,iterator,C++,Loops,Vector,Iterator,抱歉,我知道有些人会问如何删除重复项,但我认为这需要一个新线程,因为我的编译器中出现了一些奇怪的东西 vector<string> removeDuplicates(vector<string> vector) { for (vector<string>:: const_iterator it = vector.begin(); it != vector.end(); ++it) { for (vector<string&
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;
}
vector removeDuplicates(vector-vector)
{
for(vector::const_迭代器it=vector.begin();it!=vector.end();++it)
{
for(vector::const_迭代器sit=vector.begin();sit!=vector.end();++sit)
{
如果(它!=坐)
{
如果(*it==*sit)
{
矢量。擦除(它);
}
}
}
}
返回向量;
}
我不明白为什么它会给我错误。我对C++有点新,所以这个问题听起来可能有点愚蠢。是因为我在同一个向量上循环吗
请执行以下操作:
it = vector.erase(it);
这样做:
it = vector.erase(it);
我认为,条件应该是:
if(it != sit)
{
if(*it == *sit)
{
sit = vector.erase(sit)
}
else
{
++sit;
}
}
不要坐在循环中
删除要删除的迭代器的常量。将sit设置为vector::iterator。我认为,条件应该是:
if(it != sit)
{
if(*it == *sit)
{
sit = vector.erase(sit)
}
else
{
++sit;
}
}
不要坐在循环中
删除要删除的迭代器的常量。将sit设置为vector::iterator。当向量中的某个项被擦除时,请使用erase()返回的有效迭代器。 比如,
iterator=vector.erase(迭代器)
此外,当您碰巧删除向量中的最后一项时,使用++迭代器将不起作用
此链接可能有助于删除向量中的项目时,使用erase()返回的有效迭代器。 比如,
iterator=vector.erase(迭代器)
此外,当您碰巧删除向量中的最后一项时,使用++迭代器将不起作用
此链接可能有助于您不希望一次删除一个项目。使用remove erase模式,该模式将一次性擦除所有应移除的元素,而不是多次擦除调用。在这种情况下(因为您似乎希望删除所有重复的元素),可以将向量复制到
std::set
(不允许复制),然后将其分配回
错误消息似乎显示了实现中的错误std::vector::erase
应该能够接受一个const_迭代器
(请参阅下面标准中的引用),但是您看到的错误消息表明您的实现没有这样定义它
§23.3.6.5
在当前实现中,您还将获得未定义的行为,因为迭代器一旦被删除就会失效,因此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::向量向量向量机;
//用重复项填充向量
std::set sVec(vec.begin(),vec.end());//将向量复制到集合中,删除重复项
vec.assign(sVec.begin(),sVec.end());//将集合中的数据推回向量
删除/唯一擦除方法(假设顺序无关紧要)
std::向量向量向量机;
//用重复项填充向量
排序(vec.begin(),vec.end());
vec.erase(std::unique(vec.begin()、vec.end()、vec.end());
您不希望一次删除一项。使用remove erase模式,该模式将一次性擦除所有应移除的元素,而不是多次擦除调用。在这种情况下(因为您似乎希望删除所有重复的元素),可以将向量复制到std::set
(不允许复制),然后将其分配回
错误消息似乎显示了实现中的错误std::vector::erase
应该能够接受一个const_迭代器
(请参阅下面标准中的引用),但是您看到的错误消息表明您的实现没有这样定义它
§23.3.6.5
在当前实现中,您还将获得未定义的行为,因为迭代器一旦被删除就会失效,因此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::向量向量向量机;
//用重复项填充向量
std::set sVec(vec.begin(),vec.end());//将向量复制到集合中,删除重复项
vec.assign(sVec.begin(),sVec.end());//将集合中的数据推回向量
删除/唯一擦除方法(假设顺序无关紧要)
std::向量向量向量机;
//用重复项填充向量
排序(vec.begin(),vec.end());
vec.erase(std::unique(vec.begin()、vec.end()、vec.end());
在迭代过程中擦除向量上的元素本身是危险的,如果不是非法的话。您得到的确切错误是什么?为什么要检查它,然后在表示它们不相等的块中检查是否相等。你是不是想检查一下它的位置?马克·加西亚,你有什么建议吗?这是我想到的最简单的解决方案…哦,是的,它是*它==*在迭代时在向量上定位元素本身是危险的,如果不是非法的话。你得到的确切错误是什么?为什么你要检查它,然后坐在表示它们不相等的块中求相等。你是不是想检查一下它的位置?马克·加西亚,你有什么建议吗?这是我想到的最简单的解决方案…哦,是的,它是*它==*为什么要将向量放入迭代器中?@OnTheFlyerase
返回迭代器,而不是向量。为什么要将向量放入迭代器中?@OnTheFlyerase
返回迭代器,不是向量。为什么要使用else++sit?如果*it和*sit不相等,那么就使用下一个sit。但是如果它们相等,我们应该删除当前的sit元素,并使用erase返回的迭代器。我们不应该增加