相关疑难解决方法(0)

插入地图的首选/惯用方式

我已经确定了四种不同的插入方式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)

哪一种是首选/惯用的方式?(还有另一种我没想过的方法吗?)

c++ stl insert stdmap std-pair

91
推荐指数
5
解决办法
10万
查看次数

建议将元素插入地图的方法

可能重复:
在STL映射中,使用map :: insert比[]更好吗?

我想知道,当我将元素插入地图时,建议的方法是什么.我是不是该

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)

c++ stl stdmap

91
推荐指数
4
解决办法
17万
查看次数

在C++中unordered_map :: emplace和unordered_map :: insert有什么区别?

std::unordered_map::emplacestd::unordered_map::insertC++有什么区别?

c++ unordered-map c++11

26
推荐指数
1
解决办法
2万
查看次数

STL地图插入效率:[]与插入

地图插入有两种方式:

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)'

c++ stl insert map std-pair

16
推荐指数
2
解决办法
7788
查看次数

std :: map索引和插入调用之间的区别

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)

c++ stl hashmap map

12
推荐指数
3
解决办法
4979
查看次数

为什么map :: operator []设计缓慢?

问题:

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(),如果只需要(即元素不存在)

为什么不?

是否有一些其他问题可能是由于这种悲观的方法在建立一个新元素之前知道你需要它?

这是标准库,他们应该竭尽全力优化它.为什么不使用这种简单的方法?

c++ performance stl std libstdc++

3
推荐指数
1
解决办法
367
查看次数

插入std :: map的最佳方法

有:

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.那么......之间的竞争是:

  1. insert
  2. [ ](带if检查)
  3. [ ](带if检查和交换)

你更喜欢哪一个?

再次感谢

c++ stl stdmap c++03

1
推荐指数
2
解决办法
2329
查看次数

标签 统计

c++ ×7

stl ×6

stdmap ×3

insert ×2

map ×2

std-pair ×2

c++03 ×1

c++11 ×1

hashmap ×1

libstdc++ ×1

performance ×1

std ×1

unordered-map ×1