在C++ STL中使用unordered_map swap

在C++ STL中使用unordered_map swap

概述

unordered_mapC++标准库中的一个关联容器,其底层实现基于哈希表,因此能够提供高效的元素查找和插入操作。本文将讨论使用STL的unordered_map中的swap函数进行容器元素交换的方法,同时介绍一些相关的基本操作和使用技巧。

基础操作

在介绍unordered_mapswap函数之前,先来介绍一下该容器的一些基础操作。

定义和初始化

与大多数STL容器一样,使用unordered_map需要先包含对应的头文件<unordered_map>C++11支持),并指定命名空间std

定义unordered_map的语法格式如下:

std::unordered_map<key_type, mapped_type> name;

其中,key_type为关键字类型,mapped_type为映射值类型,name为该容器的名称。使用name作为unordered_map的对象名,可以调用该容器的相关成员函数。

初始化unordered_map可以使用以下方式:

std::unordered_map<int, std::string> umap{
    {1, "apple"},
    {2, "banana"},
    {3, "cherry"}
};

通过{key, value}的形式插入多个元素,可以快速初始化一个unordered_map对象。也可以通过迭代器、复制、移动等方式进行初始化。

插入元素

可以通过以下方式向unordered_map中插入元素:

std::unordered_map<int, std::string> umap;
umap.insert({1, "apple"});
umap.insert(std::make_pair(2, "banana"));
umap[3] = "cherry";

插入一个元素的语法格式为umap.insert({key, value}),其中key为关键字,value为映射值。如果关键字已存在,则该操作不会进行任何改变。

如果需要同时插入多个元素,可以使用umap.insert({{key1, value1}, {key2, value2}, ...})的方式。

也可以使用umap.emplace(key, value)的方式插入元素,该方式比insert更加高效。

最后,可以使用umap[key] = value的方式插入或更新一个元素。如果关键字不存在,则该操作会插入一个新元素;否则,该操作会使用指定的映射值覆盖原有映射值。

访问元素

可以使用以下方式访问unordered_map中的元素:

std::unordered_map<int, std::string> umap{
    {1, "apple"},
    {2, "banana"},
    {3, "cherry"}
};
std::cout << umap[1] << std::endl; // apple
std::cout << umap.at(2) << std::endl; // banana

使用[]运算符可以根据关键字访问对应的映射值,并在关键字不存在时插入新元素。使用at成员函数也可以访问对应的映射值,但会抛出std::out_of_range异常,以防止访问不存在的关键字。

删除元素

可以使用以下方式从unordered_map中删除元素:

std::unordered_map<int, std::string> umap{
    {1, "apple"},
    {2, "banana"},
    {3, "cherry"}
};

umap.erase(2);

for (auto& element : umap) {
    std::cout << element.first << " - " << element.second << std::endl;
}

/*
1 - apple
3 - cherry
*/

使用erase(key)成员函数可以删除指定关键字的元素。如果该关键字不存在,则该操作不会进行任何改变。

查找元素

可以使用以下方式从unordered_map中查找元素:

std::unordered_map<int, std::string> umap{
    {1, "apple"},
    {2, "banana"},
    {3, "cherry"}
};

auto iterator = umap.find(1);

if (iterator != umap.end()) {
    std::cout << "Found: " << iterator->first << " - " << iterator->second << std::endl;
} else {
    std::cout << "Not found" << std::endl;
}

使用find(key)成员函数可以查找指定关键字的元素,返回一个指向该元素的迭代器。如果该关键字不存在,则返回指向容器尾部的迭代器umap.end()

swap函数介绍

unordered_mapswap函数可以在两个unordered_map之间交换元素。该函数的语法格式为:

void swap(unordered_map& other) noexcept;

即将当前容器中的元素与另一个容器other中的元素进行交换。在完成交换后,两个容器的元素和大小都会互相交换。同时,交换操作不会引起内存分配和释放,因此非常高效。

swap函数示例

下面演示如何使用swap函数完成两个unordered_map之间的元素交换。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> umap1{
        {1, "apple"},
        {2, "banana"},
        {3, "cherry"}
    };

    std::unordered_map<int, std::string> umap2{
        {4, "durian"},
        {5, "elderberry"}
    };

    std::cout << "Before swap:" << std::endl;
    std::cout << "umap1 :" << std::endl;
    for (auto& element : umap1) {
        std::cout << element.first << " - " << element.second << std::endl;
    }

    std::cout << "umap2 :" << std::endl;
    for (auto& element : umap2) {
        std::cout << element.first << " - " << element.second << std::endl;
    }

    umap1.swap(umap2);

    std::cout << "After swap:" << std::endl;
    std::cout << "umap1 :" << std::endl;
    for (auto& element : umap1) {
        std::cout << element.first << " - " << element.second << std::endl;
    }

    std::cout << "umap2 :" << std::endl;
    for (auto& element : umap2) {
        std::cout << element.first << " - " << element.second << std::endl;
    }
    return 0;
}

运行结果如下:

Before swap:
umap1 :
1 - apple
2 - banana
3 - cherry
umap2 :
4 - durian
5 - elderberry
After swap:
umap1 :
4 - durian
5 - elderberry
umap2 :
1 - apple
2 - banana
3 - cherry

可以看到,使用swap函数可以快速将两个unordered_map对象的元素进行交换。

注意事项

在使用swap函数时,需要注意以下几点:

  • 使用swap函数需要保证两个unordered_map对象的关键字类型和映射值类型相同。
  • swap函数交换的是容器中的元素,而不是容器对象本身的其他属性(如存储空间、大小等)。因此,在交换元素之后,容器对象的其他属性也会变为另一个容器对象的属性。
  • 在交换元素之后,原有的迭代器、指针和引用可能仍然指向原有的元素或变成未定义状态。

结论

本文介绍了在C++ STL中使用unordered_mapswap函数进行容器元素交换的方法。同时也讲解了该容器的基本操作和注意事项。unordered_map是C++开发中常用的关联容器之一,在处理大规模数据和高效查找方面具有显著的优势。掌握swap函数的使用,能够快速进行容器元素交换,提高代码的可读性和执行效率。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程