减少冗长:在地图中插入元素
Decreasing verbosity: inserting elements into map
我最近对C++11很熟悉,auto
关键字很棒!打字:
for (auto bar : bars) {
太令人满意了。保持代码可读性和美观性。仍然感觉它阻止了你所有的动力的是:
foo.insert(std::pair<std::string, bar>("soVerbose", baz));
// As opposed to simply:
foo.insert("soVerbose", baz);
有充分的理由这样吗?有没有什么巧妙的方法可以让它不那么冗长?我知道[]
操作符可以用于在映射中插入元素,但功能略有不同。
使用模板函数:
#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';
}
}
您可以使用std::make_pair()
,这至少使它更好:
foo.insert(std::make_pair("soVerbose", baz));
事实上,我不完全确定这是否有效,但我认为确实有效(我不太确定的原因是"soVerbose"
可以推断为char const[10]
,而类型char const[10]
是不可复制的;至少在某些实现中,这是一个错误)。我还没有足够使用C++11,但我认为你也可以使用
foo.insert({ "notSoVerbose", baz });
(代码当然是用gcc和clang编译的)。
我看到其他人已经提到了它,但实际上,你真的会使用:
foo.emplace("pretty cool", baz);
您可以使用make_pair,它将推断出对元素的类型,而不必如此冗长地陈述它们:
foo.insert(std::make_pair("soVerbose", baz));
但是,同样,如果您使用的是C++11(例如,最近的visual studio),您应该更喜欢使用模板:
foo.emplace("soVerbose", baz);
要减少冗长,请编写
foo.emplace("soVerbose", baz);
相关文章:
- 将一对插入地图并增加计数?
- 当我将其插入无序地图时,矢量的容量为 0
- 如何将元素插入到标准::地图的共享指针中?
- 无法插入到标准地图
- 为什么不插入地图?
- 为什么emplace_hint比插入地图慢?
- 地图插入(const_iterator提示,值)用法
- 无法将智能指针插入地图
- 插入到地图中,以对作为键并列出作为值
- 地图插入不明确
- VS 2017 错误 C2664 地图插入尝试
- 为什么通用参考概念不适用于函数指针的地图插入
- 地图插入将替换以前输入的值
- 地图插入密钥,但没有值
- 如何在CPU和内存中优化C 中的重型地图插入
- 我如何将MPL地图插入
- 地图::插入正在中断
- 我不明白地图插入上的此错误
- C++ 多重地图插入功能
- 地图插入返回错误答案的地图