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());


在迭代过程中擦除向量上的元素本身是危险的,如果不是非法的话。您得到的确切错误是什么?为什么要检查它,然后在表示它们不相等的块中检查是否相等。你是不是想检查一下它的位置?马克·加西亚,你有什么建议吗?这是我想到的最简单的解决方案…哦,是的,它是*它==*在迭代时在向量上定位元素本身是危险的,如果不是非法的话。你得到的确切错误是什么?为什么你要检查它,然后坐在表示它们不相等的块中求相等。你是不是想检查一下它的位置?马克·加西亚,你有什么建议吗?这是我想到的最简单的解决方案…哦,是的,它是*它==*为什么要将向量放入迭代器中?@OnTheFly
erase
返回迭代器,而不是向量。为什么要将向量放入迭代器中?@OnTheFly
erase
返回迭代器,不是向量。为什么要使用else++sit?如果*it和*sit不相等,那么就使用下一个sit。但是如果它们相等,我们应该删除当前的sit元素,并使用erase返回的迭代器。我们不应该增加