如果您需要加快该特定操作,那么可能std::map
不是容器的正确选择。话虽如此,它也可能是正确的选择,所以下一个问题是该功能有哪些需要优化的地方,该功能的更高成本是多少?是查找吗?创建新元素的成本?
如果更高的成本是数据的复制,那么您可能需要考虑在算法中避免复制。您可以跳过中间副本,而不是从容器复制到局部变量,然后再做一个额外的副本插入到目标中:
insert(std::make_pair(new_key,it->value));
erase(it);
如果value
复制成本很高但可以移动(右值引用移动,或者默认构造很便宜并且您可以交换内容),您可以利用它:
insert(std::make_pair(new_key,std::move(it->value)));
// alternatively in C++03, for example for large strings or std::vector<> values
value_type& x = *insert(std::make_pair(new_key,ValueType())).first;
swap(x,it->value);
注意事情是如何变得更加复杂和难以理解/维护的。
您可以改进的另一件事是查找。目前,您对容器进行了三次查找:两次确定旧键和新键的存在,第三次插入。你可以减少它。如果您尝试插入并且密钥已经存在,则不会对其进行修改,因此您可以这样做:
using std::swap;
iterator it = find(old_key);
if (it == end()) return false;
std::pair<bool, iterator> ins_res = insert(std::make_pair(new_key,ValueType()));
if (!ins_res.second) return false;
swap(it->second,ins_res.first->second); // swap contents
erase(it);
但是,请考虑 a 是否std::map
是您的数据结构的正确选择......例如,如果查找成本高且排序不重要,那么std::unordered_map
它可能具有更好的查找性能。