我正在使用std::map,并且其中有大量的元素。如果我需要清空map,我可以直接调用clear()函数。但是这可能需要一些时间来清空,特别是在多线程环境下,在锁定状态下执行此操作可能会阻塞其他调用。为了避免调用clear(),我尝试了以下方法:
std::mutex m;
std::map<int, int> my_map; // the map which I want to clear
void func()
{
std::map<int, int> temp_map;
{
std::lock_guard<std::mutex> l(m);
temp_map = std::move(my_map);
}
}
这将在锁的保护下将my_map移动到temp_map中,将其清空。当函数结束时,temp_map将被销毁。
这是一种更好的方法以防止长时间获取锁吗?有任何性能影响吗?
my_map.clear()
。因为根据我所记,一个被移动过的标准容器会被置于“不确定但有效”的状态 -- 因此唯一安全的方法是调用那些没有前置条件的函数,而clear()
没有前置条件,并且可以确保映射的状态是确定的。 - cdhowiemap::swap
成员函数来交换非空和空的映射。 - Richard Crittenstd::swap
,因为它有适用于std::map
的特化版本。 - Blastfurnacemove
的复杂度为0,只是一个到map&&
的转换。你所引用的线性复杂度是operator=(map&&)
,但它是目标映射大小的线性,而在OP中它只是被创建,因此是常数(0)。移动构造函数map(map&&)
具有预期的常数复杂度(除非你使用分配器玩得很奇怪,当然)。 - rodrigo