[c++]-unordered_map用法及成员方法
创建C++ unordered_map容器的方法1)通过调用 unordered_map 模板类的默认构造函数,可以创建空的 unordered_map 容器。比如:std::unordered_map<std::string, std::string> umap;由此,就创建好了一个可存储 <string,string> 类型键值对的 unordered_map 容器。2
创建C++ unordered_map容器的方法
1)
通过调用 unordered_map 模板类的默认构造函数,可以创建空的 unordered_map 容器。比如:
std::unordered_map<std::string, std::string> umap;
由此,就创建好了一个可存储 <string,string> 类型键值对的 unordered_map 容器。
2)
当然,在创建 unordered_map 容器的同时,可以完成初始化操作。比如:
std::unordered_map<std::string, std::string> umap{
{"Python教程","http://csdn/python/"},
{"Java教程","http://csdn/java/"},
{"Linux教程","http://csdn/linux/"} };
通过此方法创建的 umap 容器中,就包含有 3 个键值对元素。
3)
另外,还可以调用 unordered_map 模板中提供的复制(拷贝)构造函数,将现有 unordered_map 容器中存储的键值对,复制给新建 unordered_map 容器。
例如,在第二种方式创建好 umap 容器的基础上,再创建并初始化一个 umap2 容器:
std::unordered_map<std::string, std::string> umap2(umap);
由此,umap2 容器中就包含有 umap 容器中所有的键值对。
除此之外,C++ 11 标准中还向 unordered_map 模板类增加了移动构造函数,即以右值引用的方式将临时 unordered_map 容器中存储的所有键值对,全部复制给新建容器。例如:
//返回临时 unordered_map 容器的函数
std::unordered_map <std::string, std::string > retUmap(){
std::unordered_map<std::string, std::string>tempUmap{
{"Python教程","http://c.biancheng.net/python/"},
{"Java教程","http://c.biancheng.net/java/"},
{"Linux教程","http://c.biancheng.net/linux/"} };
return tempUmap;
}
//调用移动构造函数,创建 umap2 容器
std::unordered_map<std::string, std::string> umap2(retUmap());
注意,无论是调用复制构造函数还是拷贝构造函数,必须保证 2 个容器的类型完全相同。
4)
当然,如果不想全部拷贝,可以使用 unordered_map 类模板提供的迭代器,在现有 unordered_map 容器中选择部分区域内的键值对,为新建 unordered_map 容器初始化。例如:
//传入 2 个迭代器,
std::unordered_map<std::string, std::string> umap2(++umap.begin(),umap.end());
通过此方式创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。
C++ unordered_map迭代器
unordered_map容器的迭代器指向此value_type的元素。
因此,对于一个指向map元素的迭代器来说,它的键和映射值可以分别通过以下方式访问:
unordered_map<Key,T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)
当然,任何其他直接访问操作符,如->或[]都可以使用,例如:
it->first; // same as (*it).first (the key value)
it->second; // same as (*it).second (the mapped value)
键值
// 得到键值
int value = umap[key];
// 修改键值
umap[key] = 123;
C++ unordered_map容器的常见成员方法
成员方法 | 功能 |
---|---|
empty() | 若容器为空,则返回 true;否则 false,umap.empty() |
size() | 返回当前容器中存有键值对的个数umap.size() |
at(key) | 返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常umap.at(key) |
find(key) | 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(找不到就返回umap.end() ),umap.find(key) |
count(key) | 在容器中查找以 key 键的键值对的个数umap.count(key) |
emplace() | 向容器中添加新键值对,效率比 insert() 方法高umap.emplace("key", 123) |
insert() | 向容器中添加新键值对umap.insert(std::make_pair("key", 123)) |
erase() | 删除指定键值对umap.erase(key) or umap.erase(iter) |
clear() | 清空容器,即删除容器中存储的所有键值对umap.clear() |
例子
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
//创建空 umap 容器
unordered_map<string, string> umap;
//向 umap 容器添加新键值对
umap.emplace("Python教程", "http://c.biancheng.net/python/");
umap.emplace("Java教程", "http://c.biancheng.net/java/");
umap.emplace("Linux教程", "http://c.biancheng.net/linux/");
//输出 umap 存储键值对的数量
cout << "umap size = " << umap.size() << endl;
//使用迭代器输出 umap 容器存储的所有键值对
for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;
}
return 0;
}
参考
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)