我正在学习c ++,我正在以双链表的方式工作,但当我试图从列表中删除元素时,我发现了一些非常奇怪的东西。
问题:我在列表中的值2之前插入一个元素,数字,然后我试图删除任何值为1的元素。
预期:在我的第一个循环中的条件语句中调用erase()后,我的列表中的数字应该被调整。数字应该包含的唯一值应该包含0,1234,2,3。
观察:我的列表编号包含值0,1,1234,2,3。好像什么都没有被删除。
代码示例:
#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_front(0);
list<int>::iterator it = numbers.begin();
it++;
numbers.insert(it, 100);
cout << "Element: " << *it << endl;
list<int>::iterator eraseIt = numbers.begin();
eraseIt++;
eraseIt = numbers.erase(eraseIt);
cout << "Element: " << *eraseIt << endl;
for (list<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
{
if (*it == 2)
{
numbers.insert(it, 1234);
}
if (*it == 1)
{
it = numbers.erase(it);
}
else
{
it++;
}
}
for (list<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
{
cout << *it << endl;
}
return 0;
}
我非常感谢对此问题的任何帮助。感谢您的时间。
答案 0 :(得分:5)
您应该删除it++
循环声明末尾的for
,因为它也可能会在for
循环内增加;当它被两次增加时,一些元素将被跳过。即。
for (list<int>::iterator it = numbers.begin(); it != numbers.end(); )
答案 1 :(得分:0)
在当前位置进行任何删除/插入之前,记住下一个迭代器值就足够了。这将帮助您不断地对您的修改具体和何时进行具体操作。
list<int>::iterator it = numbers.begin();
while (it != numbers.end()) {
{
list<int>::iterator next_it = it;
++next_it;
// Do your insertion or deletion here
it = next_it;
}