目录
1.unordered_ map特性
2. 常用接口的使用
1.insert
2.find
3.erase
4.operator[ ]
3.迭代器的有效性
1.unordered_ map特性
1. unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与
其对应的value。
2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此
键关联。键和映射值的类型可能不同。
3. 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内
找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭
代方面效率较低。
5. unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问
value。
6. 它的迭代器至少是前向迭代器。
2. 常用接口的使用
1.insert
向unordered_map中插入新元素。每个元素的键与容器中其他元素的键不相等时才会被插入(unordered_map中的键是唯一的)。
插入元素的数量会有效地增加容器的大小。
插入范围:[first, last),范围包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<string, double> myrecipe, mypantry = { {"milk",2.0},{"flour",1.5} };
pair<string, double> myshopping("baking powder", 0.3);
myrecipe.insert(myshopping);
myrecipe.insert(make_pair<string, double>("eggs", 6.0));
myrecipe.insert(mypantry.begin(), mypantry.end());
myrecipe.insert({ {"sugar",0.8},{"salt",0.1} });
cout << "myrecipe contains:" << endl;
for (auto& x : myrecipe)
cout << x.first << ": " << x.second << endl;
cout << endl;
return 0;
}
2.find
获取元素的迭代器
在容器中搜索键为k的元素,如果找到则返回指向该元素的迭代器,否则返回指向unordered_map::end(容器末尾之后的元素)的迭代器。
也可以使用or operator[]的成员函数直接访问映射后的值。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<std::string, double> mymap = {
{"mom",5.4},
{"dad",6.1},
{"bro",5.9} };
string input;
cout << "who? ";
getline(cin, input);
unordered_map<string, double>::const_iterator got = mymap.find(input);
if (got == mymap.end())
cout << "not found";
else
cout << got->first << " is " << got->second;
cout << endl;
return 0;
}
3.erase
从unordered_map容器中删除单个元素或一组元素[first,last)。
返回一个迭代器,指向最后一个被擦除的元素之后的位置。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<string, string> mymap;
// 填充容器
mymap["U.S."] = "Washington";
mymap["U.K."] = "London";
mymap["France"] = "Paris";
mymap["Russia"] = "Moscow";
mymap["China"] = "Beijing";
mymap["Germany"] = "Berlin";
mymap["Japan"] = "Tokyo";
// 进行删除
mymap.erase(mymap.begin()); // 通过迭代器删除
mymap.erase("France"); // 通过key删除
mymap.erase(mymap.find("China"), mymap.end()); // 通过范围进行删除
for (auto& x : mymap)
cout << x.first << ": " << x.second << endl;
return 0;
}
4.operator[ ]
访问元素
如果k与容器中元素的键匹配,则该函数返回其映射值的引用。
如果k与容器中任何元素的键都不匹配,该函数将插入一个具有该键的新元素,并返回其映射值的引用。注意,即使没有映射值给元素(元素是使用其默认构造函数构造的),这样做也会使容器大小增加1。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<string, string> mymap;
mymap["Bakery"] = "Barbara"; // 插入新元素
mymap["Seafood"] = "Lisa";
mymap["Produce"] = "John";
string name = mymap["Bakery"];
mymap["Seafood"] = name;
mymap["Bakery"] = mymap["Produce"];
name = mymap["Deli"];
mymap["Produce"] = mymap["Gifts"];
for (auto& x : mymap) {
cout << x.first << ": " << x.second << endl;
}
return 0;
}
文章来源:https://www.toymoban.com/news/detail-704778.html
3.迭代器的有效性
在大多数情况下,插入后容器中的所有迭代器仍然有效。唯一的例外是当此函数插入新元素时,这将强制重新散列(rehash)。在这种情况下,容器中的所有迭代器都失效。如果插入操作后的新容器大小超过其容量阈值则强制进行重新散列。文章来源地址https://www.toymoban.com/news/detail-704778.html
到了这里,关于C++:关联式容器:unordered_map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!