unordered_map中迭代器的使用
std::unordered_map
的迭代器(iterator)是一种可以遍历容器中所有元素的对象。可以使用迭代器来访问、修改或删除unordered_map
中的元素。迭代器就像是指向容器中元素的指针或引用。
以下是如何使用std::unordered_map
迭代器的几个基本示例:
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, int> myMap = {{1, 10}, {2, 20}, {3, 30}};
// 使用迭代器遍历unordered_map
for (std::unordered_map<int, int>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
}
// 使用基于范围的for循环遍历unordered_map(C++11及更高版本)
for (const auto& pair : myMap) {
std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
}
return 0;
在这个例子中,我们使用了两种遍历unordered_map
的方法:
- 使用传统的迭代器(
it
)和begin()
、end()
成员函数。在循环内部,我们使用it->first
和it->second
来分别访问键和值。 - 使用基于范围的for循环(C++11及以上版本),它更简洁易读。通过
const auto& pair
,我
们可以直接访问每个键值对。
unordered_map中方括号的使用
在std::unordered_map
中,方括号[]
操作符被重载以提供对容器中元素的访问,同时还能够在键不存在时自动插入新元素。使用方括号时,如果请求的键已经存在于unordered_map
中,它会返回该键对应的值;如果键不存在,unordered_map
会插入一个新元素,其键为请求的键,值默认为该类型的默认值(对于基本类型如int
,默认值为0
)。
这里有一些std::unordered_map
中方括号的使用示例:
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> myMap;
// 使用方括号插入元素
myMap["apple"] = 5;
myMap["banana"] = 10;
// 使用方括号访问已存在的元素
std::cout << "Number of apples: " << myMap["apple"] << std::endl;
// 尝试访问不存在的元素,会自动插入该元素,值为int类型的默认值0
std::cout << "Number of oranges (default value): " << myMap["oranges"] << std::endl;
// 此时myMap中包含了键为"oranges"的元素,其值为0
// 修改已存在的元素的值
myMap["banana"] = 20;
std::cout << "New number of bananas: " << myMap["banana"] << std::endl;
return 0;
}
在上面的代码中,我们首先创建了一个std::unordered_map
,其键类型为std::string
,值类型为int
。我们使用方括号[]
来插入元素,并给它们赋值。当我们尝试访问一个不存在的键时(例如"oranges"
),unordered_map
会自动插入这个键,并将其值初始化为int
类型的默认值0
。
需要注意的是,由于方括号操作符在键不存在时会插入新元素,因此如果你只是想检查一个键是否存在而不希望改变unordered_map
的内容,你应该使用find
成员函数或者count
成员函数,或者使用at
成员函数(但at
会在键不存在时抛出std::out_of_range
异常)。
这里是一个使用find
检查键是否存在的示例:
if (myMap.find("oranges") != myMap.end()) {
std::cout << "Oranges exist in the map." << std::endl;
} else {
std::cout << "Oranges do not exist in the map." << std::endl;
}
在这个例子中,find
函数返回一个迭代器,如果找到了键,则返回指向该键的迭代器;如果没有找到,则返回end()
迭代器。通过比较返回的迭代器与end()
迭代器,我们可以确定键是否存在。
其他基本操作
map.size();
map.erase();
map.insert();
it = map.find(); if(it != map.end());