gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:07:12 25 4
gpt4 key购买 nike

给定一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com