C++ 中的 unordered_map begin() 函数

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 迭代器类型有两种:iteratorconst_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() 函数,可以用于插入新元素。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程