由于最近要用单链表和双向链表所以这里总结一些常用的操作。
1.单链表
forward_list<int> a;//创建一个单向链表
cout << a.max_size() << endl;//单链表保存的最大元素数目
for (int i = 0; i < 10; i++)
{
a.push_front(i);//给单链表的首部添加元素,单链表不支持push_back
}
forward_list<int>::iterator be = a.begin();//获取迭代器
forward_list<int>::iterator en = a.end();
for (int i = 0; i < 9; i++)
{
cout << *be << endl;
if (i == 5)
{
auto c=a.erase_after(be);//返回的迭代器指向删除元素的下一个
cout << *be << endl;//be迭代器指向删除元素的前一个
cout << *c << endl;
}//删除一个元素
be++;
}
//a.pop_front(),单链表只支持删除首项元素
2.双链表
list<int> a;
for (int i = 0; i < 10; i++)
{
a.push_back(i);//双链表支持放置在后面
}
auto be = a.begin();
auto en = a.end();
//en--;双链表支持尾后迭代器--
be++;
auto c=a.erase(be);
//cout << *be << endl;//删除完元素后迭代器失效
cout << *c << endl;//指向下一个元素
a.pop_back();//删除尾元素
a.pop_front();//删除首元素
a.resize(15);//改变容器的大小
2019 6.10补充
在for循环里依靠迭代器删除删除双链表的元素时要牢记迭代器失效,例如下面这段代码
就会导致程序崩溃
for (auto be = e.begin(); be != e.end(); be++)//e是双向链表
{
if ((*be).a == 3)
{
e.erase(be);
}
}
我们可以使用以下的方式删除
for (auto be = e.begin(); be != e.end(); be++)//e是双向链表
{
if ((*be).a == 3)
{
auto c=e.erase(be);
cout << (*c).a << endl;
be = c;
}
}
至于单链表的话,这个容器有自己的erase_after操作,不会使迭代器失效
for (auto be = e.begin(); be != e.end(); be++)//e是单向向链表
{
if ((*be).a == 4)
{
e.erase_after(be);
}
}