c++ - 根据节点地址删除 unordered_map 中的节点

标签 c++

给定一个 unordered_map 对象,想知道是否可以通过节点的引用(或地址)删除节点。换句话说,在下面的代码片段中,想知道是否可以通过变量 x 的地址或类似的东西删除“UK”的节点。

std::unordered_map<std::string,int> mymap;

// populating container:
mymap["US"] = 10;
mymap["UK"] = 9;
mymap["US"] ++;
mymap["France"] = 8;
int &x = mymap["UK"];

这在应用程序中很有用,我需要在某个时间间隔(比如过去 3 小时)内跟踪各种字符串的频率。字符串的大小可以从几个字节到数千个字节。每次一个字符串过期(根据它的到达时间和时间间隔的大小),我都会降低这个字符串的频率。如果频率为 0,我将需要删除字符串的节点。不想分配空间来存储计时器队列中的字符串,那会浪费空间。

有什么想法吗?谢谢。

最佳答案

unordered_map 支持两个 erase 重载:

  • 按键
  • 通过迭代器

没有这样的“通过映射值的地址删除”。基本上你有两种方法:

int main() {
    unordered_map<string, int> data;

    data["UK"] = 10;
    data["UK"]++;
    data["US"] = 8;

    cout << data.size() << endl;
    auto it = data.find("UK");
    data.erase(it);
    cout << data.size() << endl;
    data.erase("US");
    cout << data.size() << endl;
    return 0;
}

使用迭代器更有效,因为您可以获得值(通过 second 成员)并一起删除它,而无需进行两次查找。

根据您的评论,您不能获取通过局部变量的值获得的迭代器的地址。在任何情况下这都会产生一个本地地址,但标准保证 unordered_map 中的迭代器在插入时不会失效,而在删除时只有受影响的迭代器失效,因此允许将它们存储在某个地方,有些东西喜欢:

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;
using map_type = unordered_map<string, int>;

map_type data;
vector<map_type::iterator> timer_queue;

void timeTick()
{
  for_each(begin(timer_queue), end(timer_queue), [](map_type::iterator& it) {
    --it->second;

    if (it->second == 0)
    {
      cout << "pair " << it->first << " has expired" << endl;
      data.erase(it);
      cout << "map size: " << data.size() << endl;
    }
  });
}

template<typename... Args> void addElement(Args... args)
{
  auto it = get<0>(data.emplace(args...));
  timer_queue.push_back(it);
}

int main() {

  addElement("IT", 5);
  addElement("US", 10);
  addElement("UK", 8);

  while (!data.empty())
  {
    cout << "time tick" << endl;
    timeTick();
  }

    return 0;
}

关于c++ - 根据节点地址删除 unordered_map 中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37030463/

相关文章:

c++ - 为什么定时锁在C++0x中不会抛出超时异常?

c++ - Arduino snprintf 在使用 float 时返回一个包含问号的字符串

c++ - std::list 对其分配器参数有何作用?

c++ - 如何在 std::shared_ptr<uint8_t> 之间设置/获取 unsigned char *?

c++ - DCMTK 中的 findAndGetString() 为标签返回 null

c++ - GUI 应用程序不允许访问 OSX 共享内存

C++ 简介 : self study

c++ - Access Violation Violation Location With Low Numbers

c++ - 实现一个数组类,作业麻烦

c++ - 重载解析不适用于运算符重载