创建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;
}

参考

1.c++之unordered_map用法例子
2.C++ STL unordered_map容器用法详解

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐