4

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

for (auto bar : bars) {

太令人满意了。保持代码的可读性和美观性。仍然感觉它阻止了你所有的动力如下:

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

// As opposed to simply:

foo.insert("soVerbose", baz);

它是这样的有充分的理由吗?是否有一些巧妙的方法可以让它不那么冗长?我知道[]运算符可用于将元素插入地图,但功能略有不同。

4

4 回答 4

15

使用安放功能:

#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';
    }
}
于 2013-12-11T22:49:51.477 回答
11

您可以使用std::make_pair()which 使其至少更好一点:

foo.insert(std::make_pair("soVerbose", baz));

实际上,我不完全确定这是否可行,但我认为它是(我不太确定的原因是"soVerbose"可以推断为char const[10]并且类型char const[10]不可复制;至少这是一个错误,在某些时候的某些实现中)。我还没有足够使用 C++11,但我认为你也可以使用

foo.insert({ "notSoVerbose", baz });

(代码当然用gccclang编译)。

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

foo.emplace("pretty cool", baz);
于 2013-12-11T22:47:05.890 回答
5

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

foo.insert(std::make_pair("soVerbose", baz));

但是,另外,如果您使用的是 C++11(例如最近的 Visual Studio),您应该更喜欢使用 emplace:

foo.emplace("soVerbose", baz);
于 2013-12-11T22:45:58.403 回答
0

为了减少冗长写

foo.emplace("soVerbose", baz);
于 2013-12-12T12:04:51.597 回答