矢量擦除迭代

问题描述:

我有这样的代码:矢量擦除迭代

int main() 
{ 
    vector<int> res; 
    res.push_back(1); 
    vector<int>::iterator it = res.begin(); 
    for(; it != res.end(); it++) 
    { 
     it = res.erase(it); 
     //if(it == res.end()) 
     // return 0; 
    } 
} 

“一个随机访问迭代指向的元素的新位置,然后该函数调用擦除的最后一个元素,这是如果操作该载体端擦除序列中的最后一个元素。“

此代码崩溃,但如果我使用if(it == res.end()),然后返回它的作品。怎么来的? for循环现金的res.end()所以不等于运营商失败?

+1

为什么不使用`res.clear()`? – Benoit 2011-01-10 10:25:11

+0

相似问题:http://*.com/questions/347441/erasing-elements-from-a-vector – Naveen 2011-01-10 10:29:01

+6

因为这只是代码的简化,我并不是要删除真实代码中的所有元素 – hidayat 2011-01-10 10:37:21

res.erase(it)总是返回下一个有效的迭代器,如果你删除最后一个元素,它会指向.end()

在循环++it始终调用结束,所以你增加.end()这是不允许的。

简单的.end()检查仍留有一个bug不过,因为你总是(从.erase()由环it被“递增”通过回,然后再)跳过每次迭代的元素

你可能想要的东西像:

while (it != res.end()) { 
     it = res.erase(it);  
} 

删除每个元素

(的完整性:我想这是一个简单的例子,如果你只是想每一个元素去无夏晖以执行对其的操作(例如,删除),你应该简单地调用res.clear()

当你只有有条件地删除元素,你可能要像

for (; it != res.end();) { 
    if (condition) { 
    it = res.erase(it); 
    } else { 
    ++it; 
    } 
} 
+0

好吧,所以它首先增量,并在增加后比较 – hidayat 2011-01-10 10:30:29

+0

不,hidayat;你的代码试图逐个删除向量中的所有元素。要做到这一点,你应该从`res.begin()`开始,然后永远不要推进迭代器,而是检索擦除元素时返回的迭代器(对于所有STL容器也是如此)。增量本身就是错误的部分。 – Mephane 2011-01-10 10:35:23

不要删除,然后递增迭代器。没有必要增加,如果你的向量有一个奇怪的(甚至,我不知道)数量的元素,你会错过向量的结尾。

it ++指令在块的末尾完成。因此,如果你正在擦除最后一个元素,那么你尝试增加指向一个空集合的迭代器。

您在for循环的循环表达式的(空)容器末尾增加it

for(; it != res.end();) 
{ 
    it = res.erase(it); 
} 

,或者更一般:

for(; it != res.end();) 
{ 
    if (smth) 
     it = res.erase(it); 
    else 
     ++it; 
} 

下也似乎工作:

for (vector<int>::iterator it = res.begin(); it != res.end(); it++) 
{ 
    res.erase(it--); 
} 

不知道是否有任何缺陷在这?

if(allPlayers.empty() == false) { 
    for(int i = allPlayers.size() - 1; i >= 0; i--) 
    { 
     if(allPlayers.at(i).getpMoney() <= 0) 
      allPlayers.erase(allPlayers.at(i)); 
    } 
} 

这适用于我。并且不需要考虑索引已经被擦除。

作为修改crazylammer的回答,我经常使用:

your_vector_type::iterator it; 
for(it = res.start(); it != res.end();) 
{ 
    your_vector_type::iterator curr = it++; 
    if (something) 
     res.erase(curr); 
} 

这样做的好处是,你不必担心忘记增加你的迭代器,使其不太错误容易,当你有复杂的逻辑。在循环内部,curr永远不会等于res.end(),并且它将在下一个元素处,无论您是否从矢量中删除它。