【发布时间】:2018-02-08 02:00:40
【问题描述】:
我正在学习 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;
}
我将不胜感激任何有关此问题的帮助。感谢您的时间。
【问题讨论】:
-
您的循环无效。如果在列表中插入或删除,它会使迭代器无效。
-
@Barmar 不,std::list::insert 不会使迭代器无效,并且对于
erase,OP 已使用从erase返回的迭代器重新分配it。