我已经确定了四种不同的插入方式std::map:
std::map<int, int> function;
function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));
Run Code Online (Sandbox Code Playgroud)
哪一种是首选/惯用的方式?(还有另一种我没想过的方法吗?)
我想知道,当我将元素插入地图时,建议的方法是什么.我是不是该
map[key] = value;
Run Code Online (Sandbox Code Playgroud)
要么
map.insert(std::pair<key_type, value_type>(key, value));
Run Code Online (Sandbox Code Playgroud)
我做了以下快速测试:
#include <map>
#include <string>
#include <iostream>
class Food {
public:
Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; }
Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; }
Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; }
Food() { std::cout << "default" << std::endl; }
std::string name;
};
int main() { …Run Code Online (Sandbox Code Playgroud) std::unordered_map::emplace和std::unordered_map::insertC++有什么区别?
地图插入有两种方式:
m[key] = val;
Run Code Online (Sandbox Code Playgroud)
要么
m.insert(make_pair(key, val));
Run Code Online (Sandbox Code Playgroud)
我的问题是,哪个操作更快?人们通常说第一个较慢,因为如果'key'在map中不存在,STL Standard首先'插入'一个默认元素,然后将'val'分配给默认元素.
但由于'make_pair',我没有看到第二种方式更好.make_pair实际上是一种方便的方式来制作'对' pair<T1, T2>(key, val).无论如何,他们都做了两个任务,一个是将'key'分配给'pair.first',两个分配'val'给'pair.second'.完成配对后,map将插入由'pair.second'初始化的元素.
所以第一种方式是1.' default construct of typeof(val)'2.分配第二种方式是1.赋值2.' copy construct of typeof(val)'
index重载运算符和std :: map的insert方法调用之间有什么区别?
即:
some_map["x"] = 500;
Run Code Online (Sandbox Code Playgroud)
与
some_map.insert(pair<std::string, int>("x", 500));
Run Code Online (Sandbox Code Playgroud) Peope抱怨这个: 在STL地图中,使用map :: insert比[]更好吗?
访问时
std::map<Key, ExpensiveDefaultConstructorValue> data;
data[key1] // <-- Calls default constructor each time it is called,
// even when the element is there
Run Code Online (Sandbox Code Playgroud)
实现简单而优雅,但效率很低(从unordered_map中获取).
_Tp& operator[](const key_type& __key)
{ return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
Run Code Online (Sandbox Code Playgroud)
_Tp& operator[](const key_type& __key)
{ return _M_ht.find_or_insert_default(key_type(__key)).second; }
Run Code Online (Sandbox Code Playgroud)
哪里find_or_insert_default会打电话_Tp(),如果只需要(即元素不存在)
是否有一些其他问题可能是由于这种悲观的方法在建立一个新元素之前知道你需要它?
这是标准库,他们应该竭尽全力优化它.为什么不使用这种简单的方法?
有:
std::map<const std::string,A > cache;
Run Code Online (Sandbox Code Playgroud)
你将如何插入这个容器(可以重复尝试):
cache.insert(std::make_pair(id,ps));
cache.insert(std::pair<std::string,A>(id,ps));
if(cache.find(id) == cache.end()){
cache[id] = ps;
}
Run Code Online (Sandbox Code Playgroud)
为什么??(在时间和记忆方面)
你有更好的解决方案吗?
更新:我没有使用C++ 11
Update-2: 好的,到目前为止我们意识到:
make_pair并且pair<>是类似的.
insert和[ ](有或没有if检查)都会调用copy.那么......之间的竞争是:
insert [ ](带if检查)[ ](带if检查和交换)你更喜欢哪一个?
再次感谢