【C++ STL】 --- list

简介: 【C++ STL】 --- list

1、list基本概念

功能:将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表的组成:链表由一系列结点组成

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

采用动态存储分配,不会造成内存浪费和溢出

链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

总结:STL中List和vector是两个最常被使用的容器,各有优缺点

2、list构造函数

功能描述:

创建list容器

函数原型:

1. list<T> lst;           //list采用采用模板类实现,对象的默认构造形式:
2. list(beg,end);         //构造函数将[beg, end)区间中的元素拷贝给本身。
3. list(n,elem);          //构造函数将n个elem拷贝给本身。
4. list(const list &lst); //拷贝构造函数
1. void printList(const list<int>& L) {
2. 
3.  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
4.    cout << *it << " ";
5.  }
6.  cout << endl;
7. }
8. 
9. void test01()
10. {
11.   list<int>L1;
12.   L1.push_back(10);
13.   L1.push_back(20);
14.   L1.push_back(30);
15.   L1.push_back(40);
16. 
17.   printList(L1);
18. 
19.   list<int>L2(L1.begin(),L1.end());
20.   printList(L2);
21. 
22.   list<int>L3(L2);
23.   printList(L3);
24. 
25.   list<int>L4(10, 1000);
26.   printList(L4);
27. }
28. 
29. int main() 
30. {
31.   test01();
32.   return 0;
33. }

总结:list构造方式同其他几个STL常用容器,熟练掌握即可

3、list 赋值和交换

功能描述:

给list容器进行赋值,以及交换list容器

函数原型:

1. assign(beg, end);                    //将[beg, end)区间中的数据拷贝赋值给本身。
2. assign(n, elem);                     //将n个elem拷贝赋值给本身。
3. list& operator=(const list &lst);    //重载等号操作符
4. swap(lst);                           //将lst与本身的元素互换
1. void printList(const list<int>& L) {
2. 
3.  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
4.    cout << *it << " ";
5.  }
6.  cout << endl;
7. }
8. 
9. //赋值和交换
10. void test01()
11. {
12.   list<int>L1;
13.   L1.push_back(10);
14.   L1.push_back(20);
15.   L1.push_back(30);
16.   L1.push_back(40);
17.   printList(L1);
18. 
19.   //赋值
20.   list<int>L2;
21.   L2 = L1;
22.   printList(L2);
23. 
24.   list<int>L3;
25.   L3.assign(L2.begin(), L2.end());
26.   printList(L3);
27. 
28.   list<int>L4;
29.   L4.assign(10, 100);
30.   printList(L4);
31. 
32. }
33. 
34. //交换
35. void test02()
36. {
37. 
38.   list<int>L1;
39.   L1.push_back(10);
40.   L1.push_back(20);
41.   L1.push_back(30);
42.   L1.push_back(40);
43. 
44.   list<int>L2;
45.   L2.assign(10, 100);
46. 
47.   cout << "交换前: " << endl;
48.   printList(L1);
49.   printList(L2);
50. 
51.   cout << endl;
52. 
53.   L1.swap(L2);
54. 
55.   cout << "交换后: " << endl;
56.   printList(L1);
57.   printList(L2);
58. 
59. }
60. 
61. int main() 
62. {
63.   //test01();
64.   test02();
65.   return 0;
66. }

4、list 大小操作

功能描述:

对list容器的大小进行操作

函数原型:

1. size();                 //返回容器中元素的个数
2. empty();                //判断容器是否为空
3. resize(num);            //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
4. //如果容器变短,则末尾超出容器长度的元素被删除。
5. resize(num, elem);      //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
6. //如果容器变短,则末尾超出容器长度的元素被删除
1. void printList(const list<int>& L) {
2. 
3.  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
4.    cout << *it << " ";
5.  }
6.  cout << endl;
7. }
8. 
9. //大小操作
10. void test01()
11. {
12.   list<int>L1;
13.   L1.push_back(10);
14.   L1.push_back(20);
15.   L1.push_back(30);
16.   L1.push_back(40);
17. 
18.   if (L1.empty())
19.   {
20.     cout << "L1为空" << endl;
21.   }
22.   else
23.   {
24.     cout << "L1不为空" << endl;
25.     cout << "L1的大小为: " << L1.size() << endl;
26.   }
27. 
28.   //重新指定大小
29.   L1.resize(10);
30.   printList(L1);
31. 
32.   L1.resize(2);
33.   printList(L1);
34. }
35. 
36. int main() 
37. {
38.   test01();
39.   return 0;
40. }

总结:

判断是否为空 --- empty

返回元素个数 --- size

重新指定个数 --- resize

5、list插入和删除

功能描述:

对list容器进行数据的插入和删除

函数原型:

1. push_back(elem);            //在容器尾部加入一个元素
2. pop_back();                 //删除容器中最后一个元素
3. push_front(elem);           //在容器开头插入一个元素
4. pop_front();                //从容器开头移除第一个元素
5. insert(pos,elem);           //在pos位置插elem元素的拷贝,返回新数据的位置
6. insert(pos,n,elem);         //在pos位置插入n个elem数据,无返回值。
7. insert(pos,beg,end);        //在pos位置插入[beg,end)区间的数据,无返回值。
8. clear();                    //移除容器的所有数据
9. erase(beg,end);             //删除[beg,end)区间的数据,返回下一个数据的位置。
10. erase(pos);                 //删除pos位置的数据,返回下一个数据的位置。
11. remove(elem);               //删除容器中所有与elem值匹配的元素
1. void printList(const list<int>& L) {
2. 
3.  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
4.    cout << *it << " ";
5.  }
6.  cout << endl;
7. }
8. 
9. //插入和删除
10. void test01()
11. {
12.   list<int> L;
13.   //尾插
14.   L.push_back(10);
15.   L.push_back(20);
16.   L.push_back(30);
17.   //头插
18.   L.push_front(100);
19.   L.push_front(200);
20.   L.push_front(300);
21. 
22.   printList(L);
23. 
24.   //尾删
25.   L.pop_back();
26.   printList(L);
27. 
28.   //头删
29.   L.pop_front();
30.   printList(L);
31. 
32.   //插入
33.   list<int>::iterator it = L.begin();
34.   L.insert(++it, 1000);
35.   printList(L);
36. 
37.   //删除
38.   it = L.begin();
39.   L.erase(++it);
40.   printList(L);
41. 
42.   //移除
43.   L.push_back(10000);
44.   L.push_back(10000);
45.   L.push_back(10000);
46.   printList(L);
47.   L.remove(10000);
48.   printList(L);
49. 
50. //清空
51.   L.clear();
52.   printList(L);
53. }
54. 
55. int main() 
56. {
57.   test01();
58.   return 0;
59. }

总结:

* 尾插   --- push_back

* 尾删   --- pop_back

* 头插   --- push_front

* 头删   --- pop_front

* 插入   --- insert

* 删除   --- erase

* 移除   --- remove

* 清空   --- clear

6、list 数据存取

功能描述:

对list容器中数据进行存取

函数原型:

1. front(); //返回第一个元素
2. back();  //返回最后一个元素
1. //数据存取
2. void test01()
3. {
4.  list<int>L1;
5.  L1.push_back(10);
6.  L1.push_back(20);
7.  L1.push_back(30);
8.  L1.push_back(40);
9. 
10. 
11.   //cout << L1.at(0) << endl;//错误 不支持at访问数据
12.   //cout << L1[0] << endl; //错误  不支持[]方式访问数据
13.   cout << "第一个元素为: " << L1.front() << endl;
14.   cout << "最后一个元素为: " << L1.back() << endl;
15. 
16.   //list容器的迭代器是双向迭代器,不支持随机访问
17.   list<int>::iterator it = L1.begin();
18.   //it = it + 1;//错误,不可以跳跃访问,即使是+1
19. }
20. 
21. int main() 
22. {
23.   test01();
24.   return 0;
25. }

总结:

list容器中不可以通过[]或者at方式访问数据

返回第一个元素 --- front

返回最后一个元素 --- back

7、list反转和排序

功能描述:

将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

1. reverse();      //反转链表
2. sort();         //链表排序
1. void printList(const list<int>& L) {
2. 
3.  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
4.    cout << *it << " ";
5.  }
6.  cout << endl;
7. }
8. 
9. bool myCompare(int val1 , int val2)
10. {
11.   return val1 > val2;
12. }
13. 
14. //反转和排序
15. void test01()
16. {
17.   list<int> L;
18.   L.push_back(90);
19.   L.push_back(30);
20.   L.push_back(20);
21.   L.push_back(70);
22.   printList(L);
23. 
24.   //反转容器的元素
25.   L.reverse();
26.   printList(L);
27. 
28.   //排序
29.   L.sort(); //默认的排序规则 从小到大
30.   printList(L);
31. 
32.   L.sort(myCompare); //指定规则,从大到小
33.   printList(L);
34. }
35. 
36. int main() 
37. {
38.   test01();
39.   return 0;
40. }
相关文章
|
1月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
95 10
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
50 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
69 5
|
1月前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
20 1
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
54 2
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
1月前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
21 0
|
1月前
|
C++
C++番外篇——list的实现
C++番外篇——list的实现
19 0