C++ STL入门教程(2) list双向链表使用方法(附程序代码)

2025-05-27 0 49

一、简介

“Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence.”

Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问)

在前一篇就提到过,list可以在头部进行添加删除操作,但vector不行。

下面是几个list特有的函数。(从另一方面说明list在删除操作方面的速度之快)

remove()从list删除元素
remove_if()按指定条件删除元素
reverse()把list的元素倒转
sort()给list排序
unique()删除list中重复的元素

二、完整程序代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101
/*请务必运行以下程序后对照阅读*/

#include <list>

#include <iostream>

#include <algorithm>

using namespace std;

void print(int num)

{

cout << num << " ";

}

bool IsOdd(int i)

{

return ((i & 1) == 1);

}

int main()

{

//1. 初始化

list<int> v;

list<int>::iterator iv;

v.assign(10, 2);//将10个值为2的元素赋到list中

cout << v.size() << endl; //返回list实际含有的元素数量

cout << endl;

//2. 添加

v.push_front(666);

for (int i = 0; i < 10; i++)

v.push_back(i);

for_each(v.begin(), v.end(), print);//需要#include <algorithm>

cout << endl;

cout << v.size() << endl;

cout << endl;

//3. 插入及遍历、逆遍历和倒转

v.insert(v.begin() , 99);//不能+和-了

v.insert(v.end() , 99);

for_each(v.begin(), v.end(), print);

cout << endl;

for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素

cout << endl;

//一般遍历写法

for(iv = v.begin(); iv != v.end(); ++iv)

cout << *iv << " ";

cout << endl;

v.reverse();

for_each(v.begin(), v.end(), print);

cout << endl;

for_each(v.rbegin(), v.rend(), print);

cout << endl;

cout << endl;

//4. 排序

v.sort();//为链表排序,默认是升序。

for_each(v.begin(), v.end(), print);

cout << endl;

cout << endl;

//5. 删除

v.erase(v.begin());

for_each(v.begin(), v.end(), print);

cout << endl;

v.insert(v.begin() , 99);//还原

//删掉链表中所有重复的元素

v.unique();

for_each(v.begin(), v.end(), print);

cout << endl;

//去掉所有含2的元素

v.remove(2);

for_each(v.begin(), v.end(), print);

cout << endl;

//删掉所有奇数

v.remove_if(IsOdd);

for_each(v.begin(), v.end(), print);

cout << endl;

v.pop_front();

v.pop_back();

for_each(v.begin(), v.end(), print);

cout << endl;

cout << endl;

//6. 查询

cout << v.front() << endl;

cout << v.back() << endl;

//7. 清空

v.clear();

cout << v.size() << endl;//0

for_each(v.begin(), v.end(), print); //已经clear,v.begin()==v.end(),不会有任何结果。

return 0;

}

当然,我们也可以用动态数组作为保存的数据类型:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
#include<iostream>

#include<string>

#include<list>

using namespace std;

int main()

{

list<char *> li;

list<char *>::iterator iter;

li.push_back("123");

li.push_back("456");

li.push_back("789");

for (iter = li.begin(); iter != li.end(); ++iter)

cout << *iter << endl;

return 0;

}

三、补充

对比vector和list在查询(随机检索)和维护(插入和删除)上的区别:

a) 查询

vector:由于vector中的元素是连续存储的,所以我们能够直接的访问第n个元素。

list:由于list中的元素不是在内存中连续存储的,下一个元素的内存地址保存在前一个元素中,所以我们必须一个一个的访问前面的元素,最后才能访问第n个元素。

当然,对于顺序访问就二者就差不多了。

b) 维护

vector:在vector中插入/删除一个元素的话,我们需要移动插入/删除位置之后的所有元素。如果在vector插入/删除元素后有大量元素的情况下,显而易见,这些移动和删除操作会大量的消耗CPU时间。

list:使用list进行这些操作的时候,其仅仅是修改插入/删除元素之前的元素到后一个元素的指针则可以完成这些操作,这样可以节约大量的CPU时间。

参考网站:http://www.cplusplus.com/reference/list/list/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++ STL入门教程(2) list双向链表使用方法(附程序代码) https://www.kuaiidc.com/73731.html

相关文章

发表评论
暂无评论