信奥竞赛

系列

剑指信奥 | C++ 之 STL - list

剑指信奥 | C++ 之 STL - list

强大的 list

今天的 STL 内容, 我们将学习容器中常用并高效的一个模板类 — list

list 一般被称为 列表,说它强大,一是因为 list 有非常多的函数支持对数据的各种操作,二是因为大多数操作的速度都非常快。

现在,我们就从初始化开始,学习 STL 列表。

list 的初始化

我们先看一份 list 初始化的代码:

#include <iostream>
#include <list>

using namespace std;

int main() {

// 空的 list
list<int> li;

// 指定元素的 list
list<double> ld = {1.2, 3.4};

// 指定数量的 list
list<string> ls{10};

// 指定数量和初始值
list<bool> lb(20, false);

cout << "size of li: " << li.size() << endl;
cout << "size of ld: " << ld.size() << endl;
cout << "size of ls: " << ls.size() << endl;
cout << "size of lb: " << lb.size() << endl;

return 0;
}

/*
output:
size of li: 0
size of ld: 2
size of ls: 10
size of lb: 20
*/

以上代码中,我们演示了四种常用的 list 初始化方式,参看注释,都比较好理解。size() 仍然是获取当前容器数据量的函数。

list 的 CRUD

list, 提供了很多的方法来支持对数据的各种操作,我们先来看存取数据:

#include <iostream>
#include <list>

using namespace std;

int main() {

list<int> li = {1, 2, 3};

li.push_front(0);
li.push_back(4);

cout << "front: " << li.front() << endl;
cout << "back: " << li.back() << endl;

cout << "size of li: " << li.size() << endl;

return 0;
}


/*
output:
front: 0
back: 4
size of li: 5
*/

list 的内部实现是双向链表,所以可以在表头和表尾实现添加数据和访问数据的功能,函数分别为:

  1. push_front() 添加表头元素
  2. push_back() 添加表尾元素
  3. front() 访问表头元素
  4. back() 访问表尾元素

再来看 list 的修改和删除操作:

#include <iostream>
#include <list>

using namespace std;

int main() {

list<int> li = {1, 2, 3};

// 删除表头元素
li.pop_front();

// 删除表尾元素
li.pop_back();

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

// 插入 2 个 3
li.insert(++li.begin(), 2, 3);

// 循环输出
for (const auto &item : li) {
cout << item << "\t";
}

// 清空列表
li.clear();

if (li.empty()) { // 判断列表是否为空
cout << endl << "列表为空" << endl;
}

return 0;
}


/*
output:
1
2 3 3
列表为空
*/

这段代码中,出现了多个与修改元素有关的函数,它们的作用分别是:

  1. pop_front() 删除表头元素
  2. pop_back() 删除表尾元素
  3. insert() 插入元素
  4. clear() 清空元素
  5. empty() 判空