C++ STL map容器迭代器用法详解

5个月前 (04-27)
无论是前面学习的序列式容器,还是关联式容器,要想实现遍历操作,就必须要用到该类型容器的迭代器。当然,map 容器也不例外。

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

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

表 1 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 容器键值对,因此该范围最多包含一个键值对)。


表 1 中多数的成员方法,诸如 begin()、end() 等,在学习序列式容器时已经多次使用过,它们的功能如图 2 所示。


C++ STL map部分成员方法示意图

图 2 表 1 部分成员方法的功能示意图

注意,图中 Ei 表示的是 pair 类对象,即键值对。对于 map 容器来说,每个键值对的键的值都必须保证是的。

下面程序以 begin()/end() 组为例,演示了如何遍历 map 容器:

#include <iostream>

#include <map> // pair

#include <string> // string

using namespace std;

int main() {

//创建并初始化 map 容器

std::map<std::string, std::string>myMap{ {"STL教程","http://c.biancheng网站站点" rel="nofollow" /> C语言教程 http://c.biancheng网站站点" rel="nofollow" />

#include <iostream>

#include <map> // pair

#include <string> // string

using namespace std;

int main() {

//创建并初始化 map 容器

std::map<std::string, std::string>myMap{ {"STL教程","http://c.biancheng网站站点" rel="nofollow" /> Java教程 http://c.biancheng网站站点" rel="nofollow" /> <"C语言教程","http://c.biancheng网站站点" rel="nofollow" />

#include <iostream>

#include <map> // pair

#include <string> // string

using namespace std;

int main() {

//创建并初始化 map 容器

std::map<std::string, std::string>myMap{ {"STL教程","http://c.biancheng网站站点" rel="nofollow" /> lower:Java教程 http://c.biancheng网站站点" rel="nofollow" />

#include <iostream>

#include <utility> //pair

#include <map> // map

#include <string> // string

using namespace std;

int main() {

//创建并初始化 map 容器

std::map<string, string>myMap{ {"STL教程","http://c.biancheng网站站点" rel="nofollow" />

C语言教程 http://c.biancheng网站站点" rel="nofollow" />