C++ 中的 unordered_map begin() 函数
在 C++ 中,unordered_map
是一种关联容器,可以在其中存储键/值对,从而实现快速的查找和访问。在 unordered_map 中,begin()
函数是常用的函数之一。它的作用是返回 unordered_map
中第一个元素的位置(或迭代器)。
begin() 函数的用法
begin()
函数返回 unordered_map
容器中第一个元素的地址,可以将其用作其他算法中的起始点,例如遍历 map 中的所有元素。unordered_map
中的元素是以键/值对的形式存储的,因此 begin()
函数返回的是 unordered_map
迭代器,需要用迭代器来访问下一个元素。
下面是一个使用 begin()
函数的示例代码:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
// 创建 unordered_map 容器,存储姓名和年龄
unordered_map<string, int> namesToAges = {
{"Alice", 23},
{"Bob", 25},
{"Charlie", 26},
{"Dave", 27}
};
// 使用迭代器循环遍历 unordered_map 容器
for(auto it = namesToAges.begin(); it != namesToAges.end(); it++) {
cout << it->first << " is " << it->second << " years old." << endl;
}
return 0;
}
上面的代码首先创建了一个 unordered_map
容器,里面存储了一些姓名和年龄的键/值对。然后使用迭代器 it
循环遍历 unordered_map
容器,输出每个元素的键和值。
unordered_map 迭代器的属性
在上面的代码中,我们使用了 auto
关键字来定义迭代器类型。实际上,unordered_map
的迭代器类型是一个结构体,包含指向键/值对的指针和一些其他属性。以下是 unordered_map
迭代器的属性:
it->first
:指向键的指针;it->second
:指向值的指针;++it
:迭代器自增,指向下一个元素;it == umap.end()
:判断迭代器是否到达 unordered_map 的末尾。
在迭代器使用中必须小心,it++
得到的值始终是当前位置的元素。而在 it++
的操作之后,迭代器 it
才会指向下一个元素。具体可以查看下面的代码:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> umap = {
{"Alice", 23},
{"Bob", 25},
{"Charlie", 26},
{"Dave", 27}
};
auto it = umap.begin(); // it 指向 "Alice"
cout << "First element: " << it->first << " is " << it->second << " years old." << endl;
it++; // it 指向 "Bob"
cout << "Second element: " << it->first << " is " << it->second << " years old." << endl;
++it; // it 指向 "Charlie"
cout << "Third element: " << it->first << " is " << it->second << " years old." << endl;
return 0;
}
迭代器的类型和 const
unordered_map
迭代器类型有两种:iterator
和 const_iterator
。前者可以修改元素,后者不能修改元素。
如果需要在 C++ 中访问一个容器中的元素,但不希望对其进行更改,则可以使用 const_iterator
。换句话说,只要你写的函数不修改 unordered_map 容器中的元素,则可以将参数声明为 const unordered_map<string, int> & umap
,这样即可将一个不可变的 unordered_map
容器传递给该函数。代码如下:
void printAge(const unordered_map<string, int> & umap) {
for(auto it = umap.cbegin(); it != umap.cend(); it++) {
cout << it->first << " is " << it->second << " years old." << endl;
}
}
int main() {
unordered_map<string, int> umap = {
{"Alice", 23},
{"Bob", 25},
{"Charlie", 26},
{"Dave", 27}
};
printAge(umap);
return 0;
}
这里的 cbegin()
和 cend()
函数分别返回一个指向 const
的迭代器,以便在函数中禁止对容器进行写操作。
另外,在 C++11 中还引入了 emplace()
函数,可以直接在 unordered_map 容器中插入新元素。这个函数比 insert()
更高效,因为它可以避免不必要的元素拷贝。emplace()
的使用方式与 insert()
函数类似,具体可以查看以下示例代码:
unordered_map<string, int> umap;
umap.emplace("Alice", 23);
umap.emplace("Bob", 25);
umap.emplace("Charlie", 26);
umap.emplace("Dave", 27);
结论
begin()
函数是 C++ 中 unordered_map
容器的常用函数之一,它可以返回容器中第一个元素的地址,可以用来循环遍历容器中的所有元素,或作为其他算法中的起始点。在 unordered_map
容器中,元素是以键/值对的形式存储的,因此 begin()
函数返回的是一个迭代器。在迭代器使用中,需要注意其属性和类型,以及在修改时是否需要使用 const
。在 C++11 中也引入了 emplace()
函数,可以用于插入新元素。