【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)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
1天前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
4天前
|
算法 C++ 容器
模拟实现c++中的list模版
模拟实现c++中的list模版
|
26天前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
56 21
|
2月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
47 1
|
2月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
69 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
67 0
|
2月前
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
28 4
|
1天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。