STL list迭代器

STL list迭代器教程

我们要访问 STL 中的 list 容器必须要使用迭代器来访问,同时,list 也为我们提供了多种迭代器。

STL 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 关键字代替,编译器可以自行判断出该迭代器的类型。

案例

list begin和end迭代器

使用 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,如下图所示:

63_C STL list迭代器.png

我们使用了 list 的迭代器,访问了 list 的所有元素。

list cbegin和cend迭代器

使用 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,如下图所示:

64_C STL list迭代器.png

list 模板类还提供了 cbegin() 和 cend() 成员函数,它们和 begin()/end() 唯一不同的是,前者返回的是 const 类型的正向迭代器。

这就意味着,有 cbegin() 和 cend() 成员函数返回的迭代器,可以用来遍历容器内的元素,也可以访问元素,但是不能对所存储的元素进行修改。

STL list迭代器教程

STL 也为 list 容器配备了随机访问迭代器,可以用来随机访问 list 容器中的元素,其使用方式类似于 array 的迭代器。