📅  最后修改于: 2023-12-03 14:39:52.317000             🧑  作者: Mango
在介绍 begin()
和 end()
函数前,先来简单介绍一下 unordered_multimap
。unordered_multimap
是 C++ STL 中的关联式容器之一,它允许存储多个具有相同关键字的键值对,并不保证键值对的顺序。unordered_multimap
使用哈希表实现,因此可以在平均 O(1) 的时间内进行插入、删除和查找操作。
unordered_multimap
的定义如下:
template< class Key, // unordered_map::key_type
class T, // unordered_map::mapped_type
class Hash = hash<Key>, // unordered_map::hasher
class Pred = equal_to<Key>, // unordered_map::key_equal
class Alloc = allocator<pair<const Key,T>> // unordered_map::allocator_type
> class unordered_multimap;
其中,Key
为键的类型,T
为值的类型,Hash
为哈希函数类型,默认为 std::hash<Key>
,Pred
为判断键是否相等的二元谓词类型,默认为 std::equal_to<Key>
,Alloc
为存储键值对的分配器类型,默认为 std::allocator<std::pair<const Key,T>>
。
unordered_multimap
的用法和 unordered_map
类似,主要有插入、查找、删除、遍历等操作。
unordered_multimap
提供了 begin()
和 end()
函数,用于返回指向容器第一个元素和最后一个元素之后位置的迭代器。
begin()
函数的定义如下:
iterator begin() noexcept;
const_iterator begin() const noexcept;
const_iterator cbegin() const noexcept;
begin()
返回一个迭代器,指向容器中第一个元素,如果容器为空,则返回的迭代器等同于 end()
。cbegin()
返回的也是指向容器中第一个元素的迭代器,但它是一个常量迭代器,不能修改容器中元素的值。
end()
函数的定义如下:
iterator end() noexcept;
const_iterator end() const noexcept;
const_iterator cend() const noexcept;
end()
返回一个迭代器,指向容器中最后一个元素之后的位置,如果容器为空,则返回的迭代器等同于 begin()
。cend()
返回的也是指向容器中最后一个元素之后位置的迭代器,但它是一个常量迭代器,不能修改容器中元素的值。
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_multimap<int, int> umap;
umap.insert({1, 2});
umap.insert({1, 3});
umap.insert({2, 4});
// 遍历 unordered_multimap
std::cout << "umap contains:\n";
for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
std::cout << iter->first << ": " << iter->second << std::endl;
}
return 0;
}
输出结果为:
umap contains:
1: 2
1: 3
2: 4
在这个例子中,我们使用 unordered_multimap
存储多个具有相同关键字的键值对。然后,我们使用 begin()
和 end()
函数遍历 unordered_multimap
中的元素,并输出它们的键和值。可以看到,例如 {1, 2}
和 {1, 3}
这两个键值对具有相同的键 1
,它们被存储在 unordered_multimap
中并按照插入的顺序分别输出。