STL map迭代器

STL map迭代器教程

C++ STL 标准库为 map 容器配备的是双向迭代器(bidirectional iterator)。这意味着,map 容器迭代器只能进行 ++pp++--pp--*p 操作,并且迭代器之间只能使用 == 或者 != 运算符进行比较。

值得一提的是,相比序列式容器,map 容器提供了更多的成员方法,通过调用它们,我们可以轻松获取具有指定含义的迭代器。

STL map迭代器详解

成员函数列表

成员方法 功能
begin() 返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
end() 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
rbegin() 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
rend() 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
find(key) 在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
lower_bound(key) 返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
upper_bound(key) 返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
equal_range(key) 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。

案例

map begin和end迭代器

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

#include <iostream> #include <map> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; map<int, string> map1{{1, "Mon"}, {2, "Thu"}, {3, "Wed"}}; for(auto iter = map1.begin(); iter != map1.end(); ++iter) { cout << iter->first << " " << iter->second << endl; } return 0; }

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

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

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

06_STL map迭代器.png

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

map crbegin和crend迭代器

使用 crbegin 和 crend 迭代器访问元素

#include <iostream> #include <map> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; map<int, string> map1{{1, "Mon"}, {2, "Thu"}, {3, "Wed"}}; for(auto iter = map1.crbegin(); iter != map1.crend(); ++iter) { cout << iter->first << " " << iter->second << endl; } return 0; }

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

07_STL map迭代器.png

我们使用了 crbegin 和 crend 反向迭代器,遍历了 map 的所有元素。

STL map迭代器教程

C++ STL 标准库为 map 容器配备的是双向迭代器(bidirectional iterator)。这意味着,map 容器迭代器只能进行 ++pp++--pp--*p 操作,并且迭代器之间只能使用 == 或者 != 运算符进行比较。