如何更有效地插入到std::map中
how i insert into std::map more efficiently
我有类似这样的代码:
struct Record{
std::string key;
// ...
};
void push_record(Record &out, std::map<std::string, int> &vmap){
const auto &it = vmap.find(out.key);
long pos;
if (it != vmap.end()){
pos = it->second;
}else{
pos = calculate_pos(out);
vmap.insert( Record(std::move(out.key), pos) ); // here move
}
// use pos
}
如何使代码更高效?
目前,代码不是很有效,因为它查找到map两次。第一次是检查值,第二次是插入
我也想使用std::move(out.key)
,这就是为什么我没有使用vmap[out.key]
之类的东西。
我看到你可以把建议传递给insert
,但我找不到好的例子。
std::map
有一个方法upper_bound
,您可以使用它来查找大于的第一个元素:
const auto it = vmap.upper_bound(out.key);
由于映射不能包含重复的键,并且这是第一个较大的元素,因此具有给定键的值只能位于前一个迭代器位置,或者根本不在映射中:
// Begin iterator means it definitely isn't in map
if(vmap.empty() || it == vmap.begin()) {
// Perform insert...
} else {
if((--it)->first != out.key)) {
// Doesn't exist, perform insert with hint.
// Note it will be inserted just prior to this (C++11).
vmap.insert(++it, ...);
} else {
// It's in the map, do stuff with it
}
}
正如其他人所说,这可能充其量只是一个微优化。这也使代码更难看,更难阅读,所以我强烈建议在使用这样的东西之前进行分析。
相关文章:
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏