STL array迭代器

STL array迭代器教程

array 容器是 C++ 11 标准中新增的 序列容器,同时,STL 也为 array 容器配备了随机访问迭代器,可以用来随机访问 array 容器中的元素。

STL array迭代器详解

成员函数列表

成员函数 功能
begin() 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。
end() 返回指向容器最后一个元素之后一个位置的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配使用。
rbegin() 返回指向最后一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器。
rend() 返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配使用。
cbegin() 和 begin() 功能类似,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。
cend() 和 end() 功能相同,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。
crend() 和 rend() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。

说明

除此之外,C++ 11 标准新增的 begin() 和 end() 函数,当操作对象为 array 容器时,也和迭代器有关,其功能分别和上面的 begin()、end() 成员函数相同。

技术细节

根据它们的功能并结合实际场景的需要,这些成员函数通常是成对使用的,即 begin()/end()、rbegin()/rend()、cbegin()/cend()、crbegin()/crend() 各自成对搭配使用。

不仅如此,这 4 对中 begin()/end() 和 cbegin()/cend()、rbegin()/rend() 和 crbegin()/crend() 的功能大致是相同的,唯一的区别就在于其返回的迭代器能否用来修改元素值。

值得一提的是,以上函数在实际使用时,其返回值类型都可以使用 auto 关键字代替,编译器可以自行判断出该迭代器的类型。

案例

begin和end迭代器

使用 begin 和 end 迭代器访问元素

#include <iostream> #include <array> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; array<int, 5> arr; int v = 1; auto first = arr.begin(); auto last = arr.end(); while (first != last) { *first = v; ++first; v++; } first = arr.begin(); while (first != last) { cout << *first << " "; ++first; } cout << "\n"; return 0; }

因为,这里需要使用 C++ 11,因此,我们在 Linux 下使用 g++ 进行编译,具体命令如下:

g++ array.cpp -std=c++11

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

03_C STL array迭代器.png

我们看到,我们首先使用了迭代器对数组的元素进行了赋值,接着,我们再次使用了迭代器访问了数组的所有元素。

cbegin和cend迭代器

使用 cbegin 和 cend 迭代器访问元素

#include <iostream> #include <array> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; array<int, 5> arr{10, 20, 30, 40, 50}; auto first = arr.cbegin(); auto last = arr.cend(); while (first != last) { cout << *first << " "; ++first; } cout << "\n"; return 0; }

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

04_C STL array迭代器.png

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

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

STL array迭代器教程

array 容器是 C++ 11 标准中新增的序列容器,同时,STL 也为 array 容器配备了随机访问迭代器,可以用来随机访问 array 容器中的元素。