📅  最后修改于: 2023-12-03 14:59:46.874000             🧑  作者: Mango
在C++ STL中,unordered_map是一种关联容器,它存储键值对,并允许通过键快速地访问值。在unordered_map中,键是唯一的,因此一个特定的键只能映射到一个值。
擦除是unordered_map中常用的操作之一,它允许从unordered_map中删除特定的键值对。擦除操作在unordered_map中非常高效,时间复杂度是O(1)。
下面是一个简单的示例程序,展示了unordered_map的基本用法和如何进行擦除操作。
#include <iostream>
#include <unordered_map>
int main() {
// 创建unordered_map对象
std::unordered_map<std::string, int> my_map = {{"apple", 1}, {"orange", 2}, {"banana", 3}};
// 输出unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 擦除特定的键值对
my_map.erase("orange");
// 确认键值对已被擦除
if (my_map.find("orange") == my_map.end()) {
std::cout << "orange is no longer in the unordered_map!" << std::endl;
}
// 输出更新后的unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
}
输出:
apple: 1
orange: 2
banana: 3
orange is no longer in the unordered_map!
apple: 1
banana: 3
在这个程序中,我们首先创建了一个unordered_map对象,并初始化了三个键值对。然后,我们使用一个for循环输出了unordered_map中的所有键值对。
接下来,我们使用erase()函数删除了orange键值对。然后我们使用find()函数来确保orange键值对已被删除。如果键值对已被删除,find()函数返回unordered_map中的end迭代器。
最后,我们再次输出了更新后的unordered_map中的键值对,发现orange键值对已被删除。
我们还可以使用erase()函数批量删除unordered_map中的多个键值对。以下是一个简单的示例:
#include <iostream>
#include <unordered_map>
int main() {
// 创建unordered_map对象
std::unordered_map<std::string, int> my_map = {{"apple", 1}, {"orange", 2}, {"banana", 3}};
// 输出unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 擦除多个键值对
my_map.erase({"apple", "banana"});
// 输出更新后的unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
}
输出:
apple: 1
orange: 2
banana: 3
orange: 2
在这个程序中,我们使用erase()函数批量删除了"apple"和"banana"键值对。注意,我们使用了一个花括号括起来的列表来指定要删除的键值对。这是C++11中的新语法。
unordered_map的erase()函数默认使用键类型的析构函数来删除键值对。如果我们使用的键类型没有正确的析构函数,那么会导致未定义行为。
为了避免这种情况,我们可以提供自定义的删除器,在调用erase()函数时使用。以下是一个示例:
#include <iostream>
#include <unordered_map>
// 自定义删除器类
class MyDeleter {
public:
void operator()(std::string* str_ptr) const {
std::cout << "Deleting key: " << *str_ptr << std::endl;
delete str_ptr;
}
};
int main() {
// 创建unordered_map对象,使用自定义删除器
std::unordered_map<std::string*, int, std::hash<std::string*>, std::equal_to<std::string*>, MyDeleter> my_map;
my_map.emplace(new std::string("apple"), 1);
my_map.emplace(new std::string("orange"), 2);
my_map.emplace(new std::string("banana"), 3);
// 输出unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << *pair.first << ": " << pair.second << std::endl;
}
// 擦除特定的键值对,使用自定义删除器
std::string* str_ptr = new std::string("orange");
my_map.erase(str_ptr);
delete str_ptr;
// 确认键值对已被擦除
if (my_map.find(str_ptr) == my_map.end()) {
std::cout << "orange is no longer in the unordered_map!" << std::endl;
}
// 输出更新后的unordered_map中的所有键值对
for (auto const& pair: my_map) {
std::cout << *pair.first << ": " << pair.second << std::endl;
}
}
输出:
apple: 1
orange: 2
banana: 3
Deleting key: orange
orange is no longer in the unordered_map!
apple: 1
banana: 3
在这个程序中,我们创建了一个使用自定义删除器的unordered_map对象。我们的自定义删除器是一个函数对象,它接受一个std::string*指针并释放它。
注意,我们在emplace()函数中使用new运算符为std::string分配内存,并将它作为键插入unordered_map中。然后我们尝试从unordered_map中删除一个键值对,并用delete运算符释放与它相关联的std::string对象。我们在删除器中使用std::cout输出了删除的键。
unordered_map是C++ STL中一个非常有用的数据结构。它对于快速访问和修改键值对非常高效。
擦除操作是unordered_map中的一个核心操作,使用erase()函数可以快速删除一个或多个键值对。我们可以提供自定义的删除器,以便在擦除操作中释放与键相关联的资源。
希望这篇文章能够帮助你更好地了解C++ STL中的unordered_map擦除操作。