本文主要是介绍C++容器之无序映射(std::unordered_map),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1 概述
- 2 使用实例
- 3 接口使用
- 3.1 construct
- 3.2 assigns
- 3.3 iterators
- 3.4 capacity
- 3.5 access
- 3.6 find/count/equal_range
- 3.7 emplace
- 3.8 emplace_hint
- 3.9 insert
- 3.10 erase
- 3.11 clear
- 3.12 swap
- 3.13 bucket_count
- 3.14 max_bucket_count
- 3.15 bucket_size
- 3.16 bucket
- 3.17 load_factor
- 3.18 max_load_factor
- 3.19 rehash
- 3.20 reserve
- 3.21 hash_function
- 3.22 key_eq
- 3.23 get_allocator
1 概述
无序映射是一种关联容器,用于存储由键值和映射值组合而成的元素,并允许基于其键快速检索单个元素。
在无序映射中,键值通常用于唯一标识元素,而映射的值是一个对象,其内容与该键相关联。键和映射值的类型可能不同。
在内部,无序映射中的元素不按任何特定的顺序相对于其键值或映射值进行排序,而是根据其哈希值组织到桶中,以允许直接通过其键值快速访问各个元素(平均具有恒定的平均时间复杂度)。
无序映射容器比映射容器更快地通过关键字访问单个元素,尽管它们通常在通过元素子集进行范围迭代时效率较低。
无序映射实现了直接访问运算符(运算符[]),该运算符允许使用映射值的键值作为参数直接访问映射值。
容器中的迭代器至少是前向迭代器。
容器特性:
- 关联性 关联容器中的元素由它们的键(Key)引用,而不是由它们在容器中的绝对位置引用。
- 无序性 无序容器使用哈希表来组织其元素,哈希表允许通过其键快速访问元素。
- 映射性 每个元素都将一个键与映射值相关联:键用于标识其内容为映射值的元素。
- 唯一性 容器中没有两个元素可以具有等效的键。
- 分配器感知 容器使用分配器对象来动态处理其存储需求。
- 其类图如下:
2 使用实例
void UnorderedMapSuite::rehash()
{std::unordered_map<std::string, std::string> a;a.rehash(12);TEST_ASSERT_EQUALS(true, a.bucket_count() > 12)a.insert({ "apple", "red" });a.insert({ "pear", "yellow" });a.insert({ "banana", "yellow" });a.insert({ "banana", "yellow" });uint32_t bucket_count = a.bucket_count();a.rehash(11);TEST_ASSERT_EQUALS(bucket_count, a.bucket_count())a.rehash(5);TEST_ASSERT_EQUALS(true, a.bucket_count() < bucket_count)
}
3 接口使用
3.1 construct
template<class T>
T merge_map(T const & a, T const& b)
{T t(a);t.insert(b.begin(), b.end());return t;
}void UnorderedMapSuite::construct()
{std::unordered_map<std::string, std::string> a;std::unordered_map<std::string, std::string> b({ { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana", "yellow" } });std::unordered_map<std::string, std::string> c({ { "mango", "yellow" }, { "strawberry", "red" } });std::unordered_map<std::string, std::string> d(b);std::unordered_map<std::string, std::string> e(merge_map(b, c));std::unordered_map<std::string, std::string> f(e.begin(), e.end());TEST_ASSERT_EQUALS(true, a.empty())TEST_ASSERT_EQUALS(3, b.size())TEST_ASSERT_EQUALS(2, c.size())TEST_ASSERT_EQUALS(3, d.size())TEST_ASSERT_EQUALS(5, e.size())TEST_ASSERT_EQUALS(5, f.size())
}
3.2 assigns
void UnorderedMapSuite::assigns()
{std::unordered_map<std::string, std::string> a;std::unordered_map<std::string, std::string> b;std::unordered_map<std::string, std::string> c;std::unordered_map<std::string, std::string> d;a = { { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana", "yellow" } };b = { { "mango", "yellow" }, { "strawberry", "red" } };c = merge_map(a, b);d = c;TEST_ASSERT_EQUALS(3, a.size())TEST_ASSERT_EQUALS(2, b.size())TEST_ASSERT_EQUALS(5, c.size())TEST_ASSERT_EQUALS(5, d.size())
}
3.3 iterators
void UnorderedMapSuite::iterators()
{std::unordered_map<std::string, std::string> names = { { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana&#
这篇关于C++容器之无序映射(std::unordered_map)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!