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;
}
你可以存儲的shared_ptr對象,而不是簡單的字符串,這樣你可以在相同的字符串存儲在unordered_map和定時器隊列兩者,仍然會有各只有一個字符串拷貝到內存中。 –