【问题标题】:Decreasing verbosity: inserting elements into map减少冗长:将元素插入地图
【发布时间】:2013-12-30 03:41:24
【问题描述】:

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

for (auto bar : bars) {

真是太满足了。保持代码的可读性和美观性。仍然感觉它会阻止你所有的动力是:

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

// As opposed to simply:

foo.insert("soVerbose", baz);

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

【问题讨论】:

  • 你可以typedef std::pair&lt;std::string, bar&gt; tDataPair; 让代码更易读,就像foo.insert(tDataPair("soVerbose", baz));
  • 我同意 auto 可以不负责任地使用,但我不认为使用它来避免为可以很容易推断。
  • @EdHeal:使用 C++ 告诉我,开发人员根本没有考虑汇编。我没有看到问题。
  • 反正你写的是foo.insert(std::make_pair("soVerbose", baz));

标签: c++ c++11 verbosity code-formatting


【解决方案1】:

使用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';
    }
}

【讨论】:

【解决方案2】:

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

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);

【讨论】:

  • std::make_pair 对参数执行decay_copy,将数组转换为指针。
【解决方案3】:

你可以使用make_pair,它会推断出pair的元素的类型,而你不必那么冗长地说明它们:

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

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

foo.emplace("soVerbose", baz);

【讨论】:

  • 如果您使用的是emplace,为什么要使用make_pairemplace 可以转发 ctor 参数。
  • @LightnessRacesinOrbit 就在我输入编辑时:)
  • Nice :) 顺便说一句,即使是最新的 Visual Studio CTP 也有一些可怜的 C++11 支持。可以说,Clang 或 GCC 4.8 会是更好的例子。
  • @LightnessRacesinOrbit "pathetic" 将是错误的词,尤其是在谈论此问题中的功能时(并且考虑到您对 “最近”的定义 i> 匹配我的)。
【解决方案4】:

为了减少冗长的写法

foo.emplace("soVerbose", baz);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多