STL unordered_map 无序的 map 容器

unordered_map 和 unordered_multimap 容器的内部和 map 容器一样,存储的都是键值对, 以 pair 类型存储。

  1. unordered_map 是无序映射容器,不会根据元素的 key 进行排序;
  2. unordered_map 的键值不允许修改,但是可以删除。但是,其实值是可以修改;
  3. unordered_map 和 unordered_set 容器一样,内部是以散列表(哈希表)数据结构来实现;
  4. unordered_map 和 unordered_multimap,前者不允许存储 key 相同的元素,后者是允许的
ostream& operator<<(ostream& os, const unordered_map<int, string>& m)
{
	for (auto p : m) cout << p.first << " " << p.second << endl;

	return os;
}

// 1. unordered_map 容器使用
void test01()
{
	// 创建空的容器
	unordered_map<int, string> m;
	// 创建并初始化容器
	// unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };


	// 元素插入
	m.insert(pair<int, string>(1, "aaa"));
	m.insert(make_pair(2, "bbb"));
	m.insert(unordered_map<int, string>::value_type(3, "ccc"));
	m.emplace(4, "ddd");
	m[5] = "eee";  // 能够使用下标并不能说明其是数组。


	// 如果 key 存在,则修改 key 对应的 value.
	m[1] = "ppp";
	// 如果 key 不存在,则创建一个键值为 key 的元素,实值为其类型默认值的 pair
	cout << m[6] << endl;


	cout << m << endl;
}

void test02()
{
	// 键值不能改, 但是实值可以改
	unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };
	auto it = m.begin();

	// it->first = 100;
	it->second = 200;

	// 容器中删除元素
	m.erase(m.begin());
	m.erase(m.begin(), m.end());
	m.erase(3);
	m.clear();
}

void test03()
{
	unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };
	// 1. count(key) : 查找某个 key 的元素的个数
	cout << m.count(2) << endl;
	// 2. find(key) : 根据 key 查找某个元素,查找到返回迭代器,查找失败返回 end 迭代器
	auto it = m.find(3);
	if (it == m.end())
	{
		cout << "查找失败" << endl;
	}
	else
	{
		cout << "查找成功" << endl;
	}
	// 3. lower_bound(key)、upper_bound(key)、equal_range(key)
	// 不支持 lower_bound(key)、upper_bound(key), 但是 equal_range 可以使用
	auto ret = m.equal_range(2);
	cout << ret.first->first << " " << ret.second->first << endl;
}

// 2. unordered_multimap 使用例子
void test04()
{
	unordered_multimap<int, int> m = { {1, 1}, {1, 2}, {2, 3}, {2, 4} };
	for (auto p : m)
		cout << p.first << " " << p.second << endl;
}
未经允许不得转载:一亩三分地 » STL unordered_map 无序的 map 容器
评论 (0)

6 + 2 =