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