list的常用操作
list的介绍
list是序列容器,它允许在常数范围O(1)进行插入和删除在这段序列的任意位置,并且可以双向遍历
它是弥补vector容器的缺点,与vector有互补的韵味,
这里我们可以将其进行与vector进行对比
vector
(1)可以在序列内的任意位置随机访问
(2)插入和删除需要挪动数据,效率被影响
list
(1)不支持在任意位置随机访问
(2)支持了在任意位置的插入和删除,并且是常数时间O(1)
list的常见使用
list的操作有很多,这里我们只介绍一些比较常用的操作
(1)包头文件
要使用list向将头文件包上
#include<iostream>
#include<list>
using namespace std;
(2)头插头删尾插尾删
list的底层是双向链表自然也就支持头插头删尾插尾删
建立list对象l后,我们就可以进行使用了
list <int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_front(0);
l.pop_back();
l.pop_front();
(3)list的打印
list的遍历不能使用operator[]+下标进行遍历,其根本的物理结构不相同
list的遍历使用迭代器或则范围for进行遍历,其中范围for是编译器自动替换为迭代器iterator进行打印
list<int>::iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
++it;
}
cout << endl;
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
打印(2)中的结果如下
(4)反向打印迭代器
list的底层是双向循环列表,支持反向遍历打印
list<int>::reverse_iterator rit = l.rbegin();
while (rit != l.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
运行结果如下
(5)修改
在迭代器以及范围for中我们可以修改list中的值,如下
list<int>::iterator it = l.begin();
while (it != l.end())
{
*it += 1;
cout << *it << " ";
++it;
}
cout << endl;
结果如下
(6)仅打印print_list
void print_list(const list<int>& l)
{
list<int>::const_iterator it = l.begin();
while (it != l.end())
{
//*it += 1;不能更改
cout << *it << " ";
++it;
}
cout << endl;
}
这里更改的话,编译器会提示错误,原因是const类型的迭代器仅能读,不能写
结果如下
(7)赋值运算符=
list<int> lt1;
lt1.push_back(10);
lt1.push_back(20);
lt1.push_back(30);
lt1.push_back(40);
l = lt1;
print_list(l);
打印结果为,可知l中的原值1,2,3被赋值为10,20,30,40
(8)查找,插入,删除
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
list<int>::iterator it = find(lt1.begin(),lt1.end(),3);
if (it != lt1.end())
{
lt1.insert(it, 30);
lt1.erase(it);
}
结果为,这里有的时候会涉及迭代器的失效,请期待下节
(9)排序
list<int> lt1;
lt1.push_back(3);
lt1.push_back(5);
lt1.push_back(1);
lt1.push_back(6);
lt1.push_back(2);
lt1.push_back(4);
print_list(lt1);
lt1.sort();
结果如下
到这里我们讲解完毕
如果对您有帮助的话点一个免费的赞和收藏叭!
由于作者水平不足,如有任何错误,请读者在评论区交流!