ZetCode

C++ 列表

最后修改于 2022 年 9 月 7 日

在本文中,我们将展示如何在 C++ 中使用列表容器。

列表是一个保存一系列元素的容器。元素具有特定的类型。列表允许在序列中的任何位置高效地插入和删除元素。

列表没有随机访问运算符;也就是说,无法通过索引运算符 [] 从列表中获取值。(向量可用于元素的随机访问。)

C++ 列表大小

列表的大小由 size 确定。

main.cpp
#include <iostream>
#include <list>

using std::cout;
using std::list;

int main()
{
    list<int> vals({1, 2, 3, 4, 5, 6, 7});
    cout << "The list has " << vals.size() << " elements\n";
}

我们初始化一个整数列表并打印其大小。

list<int> vals({1, 2, 3, 4, 5, 6, 7});

我们使用列表初始化器创建一个整数值列表。列表的类型在 <> 括号之间指定。

cout << "The list has " << vals.size() << " elements\n";

我们打印一条消息,说明列表中有多少个元素。

$ ./main
The list has 7 elements

C++ 列表插入元素

以下示例插入新值。

main.cpp
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;
using std::string;

int main()
{
    list<string> words = {"sky", "car", "cup", "ocean", "war"};

    list<string>::iterator it = words.begin();
    words.insert(it, "falcon");

    words.push_back("world");
    words.push_front("water");

    for (auto word : words)
    {
        cout << word << endl;
    }
}

我们有一系列单词。

list<string>::iterator it = words.begin();
words.insert(it, "falcon");

我们创建一个指向列表开头的迭代器。我们将一个新元素插入到那里。

words.push_back("world");
words.push_front("water");

我们使用 push_back 在末尾添加一个新元素,并使用 push_front 在开头添加一个新元素。

$ ./main
water
falcon
sky
car
cup
ocean
war
world

C++ 列表删除元素

以下示例删除列表元素。

main.cpp
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;
using std::string;

int main()
{
    list<string> words = {"sky", "car", "cup", "ocean", "war"};

    words.remove("war");

    for (auto word : words)
    {
        cout << word << endl;
    }

    words.clear();

    cout << words.size() << endl;
}

我们使用 removeclear 删除元素。

words.remove("war");

我们使用 remove 删除指定的元素。

words.clear();

所有元素都使用 clear 删除。

$ ./main
sky
car
cup
ocean
0

C++ 循环列表

以下示例循环遍历列表。

classic_for.cpp
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;

int main()
{
    list<int> vals = {1, 2, 3, 4, 5, 6, 7};

    for (auto it = vals.cbegin(); it != vals.cend(); ++it)
    {
        std::cout << *it << endl;
    }

    for (auto val : vals)
    {
        cout << val << endl;
    }
}

我们使用类 for 循环和 foreach 循环遍历整数列表。

for (auto it = vals.cbegin(); it != vals.cend(); ++it)
{
    std::cout << *it << endl;
}

列表使用经典 for 循环进行迭代。cbegin 返回一个指向容器中第一个元素的常量迭代器。cend 返回一个指向容器末尾之后元素的常量迭代器。

for (auto val : vals)
{
    cout << val << endl;
}

foreach 循环是遍历容器的简便语法。

$ ./main
1
2
3
4
5
6
7
1
2
3
4
5
6
7

C++ 列表 remove_if

remove_if 函数删除所有满足给定谓词的元素。

main.cpp
#include <iostream>
#include <string>
#include <list>

using std::cout;
using std::endl;
using std::list;
using std::string;

int main()
{
    list<string> words = {"sky", "car", "cup", "ocean", "war"};

    words.remove_if([](const string& e) {
        return (e.starts_with("w"));
    });

    for (auto word : words)
    {
        cout << word << endl;
    }
}

在示例中,我们从列表中删除所有以 "w" 开头的单词。

$ clang++ main.cpp -o main -std=c++20
$ ./main
sky
car
cup
ocean

在本文中,我们使用了 C++ 中的列表容器。