STL序列式容器之list
Posted 王刚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.赋值操作符
// 定义链表容器l1 list<string> l1(10, "HelloWorld"); // 定义链表容器l2 list<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.容器的插入元素
// 定义容器l2 list<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.容器的删除元素
// 定义容器l2 list<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的主要内容,如果未能解决你的问题,请参考以下文章