前段时间,我和同事讨论了如何在STL映射中插入值。I prefer map[key] = value;因为它让人感觉自然,读起来清晰,而他更喜欢地图。插入(std:: make_pair(关键字,值))。
我只是问了他,我们都不记得为什么插入更好,但我相信这不仅仅是一个风格偏好,而是有一个技术原因,如效率。SGI STL引用简单地说:“严格地说,这个成员函数是不必要的:它只是为了方便而存在。”
有人能告诉我原因吗,还是我只是在做梦?
前段时间,我和同事讨论了如何在STL映射中插入值。I prefer map[key] = value;因为它让人感觉自然,读起来清晰,而他更喜欢地图。插入(std:: make_pair(关键字,值))。
我只是问了他,我们都不记得为什么插入更好,但我相信这不仅仅是一个风格偏好,而是有一个技术原因,如效率。SGI STL引用简单地说:“严格地说,这个成员函数是不必要的:它只是为了方便而存在。”
有人能告诉我原因吗,还是我只是在做梦?
当前回答
关于std::map还有一点需要注意:
关联(nonExistingKey);将在map中创建一个新条目,键指向初始化为默认值的nonExistingKey。
当我第一次看到它时(当我的头撞到一个讨厌的遗留bug时),这把我吓坏了。没想到会这样。对我来说,这看起来像一个get操作,我没有预料到“副作用”。当从你的地图获取时,更倾向于map.find()。
其他回答
当你写作的时候
map[key] = value;
没有办法知道你是否替换了value for key,或者你是否用value创建了一个新键。
Map::insert()只创建:
using std::cout; using std::endl;
typedef std::map<int, std::string> MyMap;
MyMap map;
// ...
std::pair<MyMap::iterator, bool> res = map.insert(MyMap::value_type(key,value));
if ( ! res.second ) {
cout << "key " << key << " already exists "
<< " with value " << (res.first)->second << endl;
} else {
cout << "created key " << key << " with value " << value << endl;
}
对于我的大多数应用程序,我通常不关心我是在创建还是替换,所以我使用更容易阅读的map[key] = value。
关于std::map还有一点需要注意:
关联(nonExistingKey);将在map中创建一个新条目,键指向初始化为默认值的nonExistingKey。
当我第一次看到它时(当我的头撞到一个讨厌的遗留bug时),这把我吓坏了。没想到会这样。对我来说,这看起来像一个get操作,我没有预料到“副作用”。当从你的地图获取时,更倾向于map.find()。
如果默认构造函数的性能影响不是问题,看在上帝的份上,请使用可读性更好的版本。
:)
需要注意的是,您也可以使用Boost。分配:
using namespace std;
using namespace boost::assign; // bring 'map_list_of()' into scope
void something()
{
map<int,int> my_map = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
}
现在在c++11中,我认为在STL映射中插入一对的最好方法是:
typedef std::map<int, std::string> MyMap;
MyMap map;
auto& result = map.emplace(3,"Hello");
结果将是一对:
第一个元素(result.first),指向插入或指向的对 如果密钥已经存在,则使用此密钥对。 第二个元素(result.second),如果插入正确则为true 假装出了什么差错。
PS:如果你不关心顺序,你可以使用std::unordered_map;)
谢谢!