我最近熟悉了C ++ 11,auto
关键字很棒!打字:
for (auto bar : bars) {
非常令人满意。保持代码可读性和漂亮性。还有什么感觉它会阻止你的所有动力如下:
foo.insert(std::pair<std::string, bar>("soVerbose", baz));
// As opposed to simply:
foo.insert("soVerbose", baz);
这是一个很好的理由吗?是否有一些简洁的方法使它不那么冗长?我知道[]
运算符可用于将元素插入到地图中,但功能略有不同。
答案 0 :(得分:14)
使用emplace功能:
#include <iostream>
#include <utility>
#include <map>
int main()
{
std::map<std::string, std::string> m;
// uses pair's copy-constructor
m.emplace(std::make_pair(std::string("a"), std::string("a")));
// uses pair's converting copy constructor
m.emplace(std::make_pair("b", "abcd"));
// uses pair's template constructor
m.emplace("d", "ddd");
// uses pair's piecewise constructor
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));
for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}
答案 1 :(得分:10)
你可以使用std::make_pair()
,这至少会更好一点:
foo.insert(std::make_pair("soVerbose", baz));
实际上,我不完全确定这是否有效但我认为是(我不太确定"soVerbose"
可以推断为char const[10]
的类型和类型char const[10]
不可复制;至少在某些实现中,这是一个错误)。我还没有使用C ++ 11,但我认为你也可以使用
foo.insert({ "notSoVerbose", baz });
我看到其他人已经提到过了,但实际上,你真的会使用:
foo.emplace("pretty cool", baz);
答案 2 :(得分:5)
你可以使用make_pair,它会推断出这对元素的类型,而不必如此冗长地说明:
foo.insert(std::make_pair("soVerbose", baz));
但是,如果你正在使用C ++ 11(例如最近的视觉工作室),你应该更喜欢使用emplace:
foo.emplace("soVerbose", baz);
答案 3 :(得分:0)
减少冗长写
foo.emplace("soVerbose", baz);