减少详细程度:将元素插入到地图中

Fau*_*ult 5 c++ code-formatting verbosity c++11

我最近熟悉了C++ 11,auto关键字很棒!打字:

for (auto bar : bars) {
Run Code Online (Sandbox Code Playgroud)

哦,太令人满意了.保持代码可读性和漂亮性.还有什么感觉它会阻止你所有的动力如下:

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

// As opposed to simply:

foo.insert("soVerbose", baz);
Run Code Online (Sandbox Code Playgroud)

这是一个很好的理由吗?是否有一些简洁的方法使它不那么冗长?我知道[]运算符可以用于将元素插入到地图中,但功能略有不同.

dal*_*lle 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';
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @polkadotcadaver:是的,我已经在答案中找到了该页面的链接. (2认同)

Die*_*ühl 10

你可以使用std::make_pair()它,至少,更好一点:

foo.insert(std::make_pair("soVerbose", baz));
Run Code Online (Sandbox Code Playgroud)

实际上,我不完全确定这是否有效,但我认为它是(我不太确定的原因是"soVerbose"可以推断出来char const[10]的类型char const[10]是不可复制的;至少,这是一个错误,在一些实施中的某些方面).我还没有使用C++ 11,但我认为你也可以使用

foo.insert({ "notSoVerbose", baz });
Run Code Online (Sandbox Code Playgroud)

(代码肯定会用gccclang编译).

我看到其他人已经提到了它,但实际上,你真的使用过:

foo.emplace("pretty cool", baz);
Run Code Online (Sandbox Code Playgroud)


pol*_*ver 5

您可以使用make_pair,它将推断出对的元素的类型,而不必如此冗长地说明它们:

foo.insert(std::make_pair("soVerbose", baz));
Run Code Online (Sandbox Code Playgroud)

但是,如果你正在使用C++ 11(例如最近的视觉工作室),你应该更喜欢使用emplace:

foo.emplace("soVerbose", baz);
Run Code Online (Sandbox Code Playgroud)