C++ 减少冗余:将元素插入地图

C++ 减少冗余:将元素插入地图,c++,c++11,verbosity,code-formatting,C++,C++11,Verbosity,Code Formatting,最近我对C++11越来越熟悉,而且auto关键字非常棒!打字: for (auto bar : bars) { 哦,太令人满意了。保持代码可读性和美观。以下几点仍然让人感觉到它会让你失去动力: foo.insert(std::pair<std::string, bar>("soVerbose", baz)); // As opposed to simply: foo.insert("soVerbose", baz); foo.insert(std::pair(“soVerbo

最近我对C++11越来越熟悉,而且
auto
关键字非常棒!打字:

for (auto bar : bars) {
哦,太令人满意了。保持代码可读性和美观。以下几点仍然让人感觉到它会让你失去动力:

foo.insert(std::pair<std::string, bar>("soVerbose", baz));

// As opposed to simply:

foo.insert("soVerbose", baz);
foo.insert(std::pair(“soVerbose”,baz));
//而不是简单地:
foo.插入(“soVerbose”,baz);

这有什么好的理由吗?有没有什么好办法让它不那么冗长?我知道可以使用
[]
操作符将元素插入到地图中,但功能略有不同。

您可以使用make\u pair,它将推断出元素对的类型,而不必如此详细地说明它们:

foo.insert(std::make_pair("soVerbose", baz));
但是,如果您使用的是C++11(例如,最近的visual studio),您应该更喜欢使用emplace:

foo.emplace("soVerbose", baz);

您可以使用
std::make_pair()
,这至少会使它更好一些:

foo.insert(std::make_pair("soVerbose", baz));
事实上,我不完全确定这是否有效,但我认为是的(我不太确定的原因是,
“soVerbose”
可以推断为
char const[10]
,并且类型
char const[10]
不可复制;至少在某些实现中,这是一个错误)。我还没有充分使用C++11,但我认为您也可以使用

foo.insert({ "notSoVerbose", baz });
(代码当然是用and编译的)

我看到其他人已经提到了这一点,但实际上,您确实会使用:

foo.emplace("pretty cool", 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';
    }
}
#包括
#包括
#包括
int main()
{
std::map m;
//使用pair的复制构造函数
m、 安放(std::make_pair(std::string(“a”)、std::string(“a”));
//使用pair的转换副本构造函数
m、 炮位(标准:制造双(“b”、“abcd”);
//使用pair的模板构造函数
m、 安置(“d”、“ddd”);
//使用pair的分段构造函数
m、 侵位(标准::分段构造,
std::转发作为元组(“c”),
std::forward_as_tuple(10,'c');
用于(常数自动和p:m){

std::cout以减少冗长的写入

foo.emplace("soVerbose", baz);

您可以
typedef std::pair tDataPair;
这将使代码的可读性稍微提高,如
foo.insert(tDataPair(“soVerbose”,baz)) >我同意 Audio/Cord>可以不负责任地使用,但我不认为使用它来避免为一个容易推断的数据类型写一个长声明类型是有害的。@ EdCurr:使用C++告诉我开发人员根本不考虑汇编。我没有看到问题。你实际上打算写的是COD。e> foo.insert(标准::make_pair(“soVerbose”,baz))
无论如何。如果您使用
emplace
,为什么要
进行配对呢?
emplace
可以转发ctor参数。@LightnessRacesinOrbit就在我键入编辑时:)不错:)顺便说一句,即使是最新的Visual Studio CTP也有点可怜的C++11支持。Clang或GCC 4.8可能是更好的例子。@LightnessRacesinOrbit“可怜”这个词是错误的,尤其是在谈论这个问题中的特征时(考虑到你对“最近”匹配我的定义)引用你的资料是很礼貌的。逐字逐句。@Polkadtcadaver:是的,我在答案中已经有一个指向该页的链接。
std::make_pair
对参数执行
decay_copy
,将数组变成指针。