首页 > 代码库 > STL序列式容器之list
STL序列式容器之list
一,list容器基本概念
1.list容器基本知识
- list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素。
- list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作。要获取元素,必须从头到尾遍历。
- 使用list容器必须引入头文件# include<list>。
二,list容器构造函数
1.无参构造函数
// 无参构造函数list<string> l1;
2.有参构造函数
// 有参构造函数,10个字符‘A‘来初始化容器list<char> l2(10, ‘A‘);// 有参构造函数,用上面的容器初始化下面的容器list<char> l3(l2.begin(), l2.end());
3.拷贝构造函数
// 有参构造函数list<char> l1(10, ‘A‘);// 拷贝构造函数list<char> l2 = l1;
4.析构函数
list的析构函数用来释放容器中元素所占用的内存。
三,list容器的操作符重载
1.赋值操作符
// 定义链表容器l1list<string> l1(10, "HelloWorld");// 定义链表容器l2list<string> l2;// 赋值操作符重载l2 = l1;
四,list容器的成员函数
1.头部插入和删除元素
// 定义容器list<string> l1;// 在容器头部添加元素l1.push_front("Hello");l1.push_front("World");l1.push_front("C++");// 移除容器头部元素l1.pop_front();
2.尾部插入和删除元素
// 定义容器list<string> l1;// 在容器尾部添加元素l1.push_back("Oracle");l1.push_back("IBM");l1.push_back("Microsoft");// 移除容器尾部元素l1.pop_back();
3.容器的头部和尾部元素
// 定义容器list<string> l1;// 在容器头部添加元素l1.push_front("Hello");l1.push_front("World");l1.push_front("C++");// 获取容器的头部和尾部元素string first = l1.front();string last = l1.back();
4.容器的大小
// 定义容器list<string> l1;// 在容器头部添加元素l1.push_front("Hello");l1.push_front("World");l1.push_front("C++");// 获取容器的大小int size = l1.size();
5.容器的清空
// 定义容器list<string> l1(10,"HelloWorld");// 容器的清空l1.clear();
6.容器是否为空
// 定义容器list<string> l1(10,"HelloWorld");// 容器是否为空bool isEmpty = l1.empty();
7.容器的插入元素
// 定义容器l2list<string> l2(5, "HelloWorld");// 在容器第二个位置插入"HelloC++",list只支持++和--,不支持具体的加几和减几,因为底层是链表l2.insert(++l2.begin(), "HelloC++");// 基于list容器的特征,经常配合迭代器来插入for (list<string>::iterator it = l2.begin(); it != l2.end(); it++){ l2.insert(it, "H");}
8.容器的删除元素
// 定义容器l2list<string> l2(5, "HelloWorld");// 删除容器的所有元素l2.erase(l2.begin(), l2.end());// 根据容器元素的值删除l2.remove("HelloC++");
9.容器的遍历
// 定义容器list<string> l2(10,"HelloWorld");// 增强for遍历for (string tmp : l2){ cout << tmp << " " ;}cout << endl;// 正向遍历for (list<string>::iterator it = l2.begin(); it != l2.end(); it++){ cout << *it << " ";}cout << endl;// 反向遍历for (list<string>::reverse_iterator it = l2.rbegin(); it != l2.rend(); it++){ cout << *it << " ";}cout << endl;
10.容器的反转
// 定义容器list<string> l1;// 在容器头部添加元素l1.push_front("Hello");l1.push_front("World");l1.push_front("C++");// 容器的反转l1.reverse();
11.list的遍历删除
# include<iostream># include<list>using namespace std;int main(){ // 定义容器 list<int> v; // 添加数据 v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); // 这里注意不需要++it for (list<int>::iterator it = v.begin(); it != v.end();) { // 删除偶数 if (*it % 2 == 0) { // erase删除该元素后返回下一个元素的迭代器 it = v.erase(it); } else { it++; } } // 遍历 for (int tmp : v) { cout << tmp << " "; } cout << endl; return 0;}
五,list容器注意事项
1.存储自定义数据类型的注意
要存储的自定义类型必须提供拷贝构造函数,因为容器是通过值的复制方式将元素存入到容器中的。
2.list容器的访问
list容器不支持随机存取元素,即不支持索引下标的方式访问和修改元素,要想访问元素必须通过迭代器进行遍历,遍历到要找到的位置。
3.list容器的迭代器
- list容器的迭代器不支持具体数据的加减,只支持++和--操作。
- list的erase函数删除迭代器指向的元素后返回下一个迭代器。
STL序列式容器之list
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。