📜  C++ STL中的unordered_map擦除(1)

📅  最后修改于: 2023-12-03 14:59:46.874000             🧑  作者: Mango

C++ STL中的unordered_map擦除

简介

在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擦除操作。