我们要访问 STL 中的 list 容器必须要使用迭代器来访问,同时,list 也为我们提供了多种迭代器。
迭代器函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的双向迭代器(正向迭代器)。 |
end() | 返回指向容器中最后一个元素的双向迭代器(正向迭代器)。 |
rbegin() | 返回指向最后一个元素的反向双向迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的反向双向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,正向迭代器增加了 const 属性,即不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过在其基础上,正向迭代器增加了 const 属性,即不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,反向迭代器增加了 const 属性,即不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过在其基础上,反向迭代器增加了 const 属性,即不能用于修改元素。 |
除此之外,C++ 11 标准新增的 begin() 和 end() 函数,当操作对象为 list 容器时,也和迭代器有关,其功能分别和上面的 begin()、end() 成员函数相同。
根据它们的功能并结合实际场景的需要,这些成员函数通常是成对使用的,即 begin()/end()、rbegin()/rend()、cbegin()/cend()、crbegin()/crend() 各自成对搭配使用。
不仅如此,这 4 对中 begin()/end() 和 cbegin()/cend()、rbegin()/rend() 和 crbegin()/crend() 的功能大致是相同的,唯一的区别就在于其返回的迭代器能否用来修改元素值。
值得一提的是,以上函数在实际使用时,其返回值类型都可以使用 auto 关键字代替,编译器可以自行判断出该迭代器的类型。
使用 begin 和 end 迭代器访问元素
#include <iostream>
#include <list>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
list<int> list1{1, 3, 5, 7, 9};
auto first = list1.begin();
auto last = list1.end();
while (first != last)
{
cout << *first << " ";
++first;
}
cout << "\n";
return 0;
}
因为,这里需要使用 C++ 11,因此,我们在 Linux 下使用 g++ 进行编译,具体命令如下:
g++ list.cpp -std=c++11
编译后,我们直接运行生成的二进制文件 a.out
,如下图所示:
我们使用了 list 的迭代器,访问了 list 的所有元素。
使用 cbegin 和 cend 迭代器访问元素
#include <iostream>
#include <list>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
list<int> list1{10, 20, 30, 40, 50};
int v = 1;
auto first = list1.cbegin();
auto last = list1.cend();
while (first != last)
{
cout << *first << " ";
++first;
}
cout << "\n";
return 0;
}
编译后,我们直接运行生成的二进制文件 a.out
,如下图所示:
list 模板类还提供了 cbegin() 和 cend() 成员函数,它们和 begin()/end() 唯一不同的是,前者返回的是 const 类型的正向迭代器。
这就意味着,有 cbegin() 和 cend() 成员函数返回的迭代器,可以用来遍历容器内的元素,也可以访问元素,但是不能对所存储的元素进行修改。
STL 也为 list 容器配备了随机访问迭代器,可以用来随机访问 list 容器中的元素,其使用方式类似于 array 的迭代器。