在C++ STL中使用unordered_map swap
概述
unordered_map
是C++标准库中的一个关联容器,其底层实现基于哈希表,因此能够提供高效的元素查找和插入操作。本文将讨论使用STL的unordered_map
中的swap
函数进行容器元素交换的方法,同时介绍一些相关的基本操作和使用技巧。
基础操作
在介绍unordered_map
的swap
函数之前,先来介绍一下该容器的一些基础操作。
定义和初始化
与大多数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_map
的swap
函数可以在两个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_map
的swap
函数进行容器元素交换的方法。同时也讲解了该容器的基本操作和注意事项。unordered_map
是C++开发中常用的关联容器之一,在处理大规模数据和高效查找方面具有显著的优势。掌握swap
函数的使用,能够快速进行容器元素交换,提高代码的可读性和执行效率。