【问题标题】:How to insert a pair of std::pair inside another std::pair?如何在另一个 std::pair 中插入一对 std::pair?
【发布时间】:2011-04-18 08:30:15
【问题描述】:

我声明一个字符串映射到一对如下:

std::map<std::wstring, 
         std::pair<std::pair<long, long>, 
                   std::pair<long, long>>> reference;

我将其初始化为:

reference.insert(L"First", 
                 std::pair<std::pair<long, long>, 
                           std::pair<long, long>>(std::pair<long, long>(-1, -1),
                           std::pair<long, long>(0, 0)));

但是,Visual C++ 给我错误“C2664,没有构造函数可以采用源类型,或者构造函数重载决议不明确”。

我是使用模板和 STL 的新手,我不知道我做错了什么。

【问题讨论】:

  • 请使用 typedef 和 std::make_pair 使其清晰易读。
  • 我对其进行了重新格式化,使其更易于阅读。
  • 除了嵌套所有这些std::pair 之外,你不能切换到使用std::tr1::tuple 吗? Boost 也有一个元组实现。
  • 哟哟道格。听说你喜欢std::pair,所以我在你的....中放了一个std::pair。
  • 据我了解,元组并非由所有供应商实现。在转到 Boost 之前,我会尝试先学习 STL。

标签: c++ templates stl


【解决方案1】:

&gt;&gt;&gt; 无法正确解析(除非您有 C++0x 编译器)。

更改为&gt; &gt; &gt;

这个:

reference.insert("First",

应该是:

reference.insert(L"First",
                ^^^

还有一个实用函数可以使对的构造更容易:

std::pair<std::pair<long, long>, std::pair<long, long>>(std::pair<long, long>(-1, -1), std::pair<long, long>(0, 0))

可以是:

std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L))

试试这个:

reference[L"First"]
    = std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L));

【讨论】:

  • 感谢您的帮助。我编辑了我的问题,将 L"" 添加到我的 wstring 中,以使问题更容易“解析”。
  • 比我的更好的答案,但请注意,使用reference[key] = value 插入可能会给reference.insert(make_pair(key,value)) 带来不同的行为;使用 [] 将覆盖现有元素,而 insert 不会。
【解决方案2】:

当您关闭模板时,C++ 会被连续的“>”弄糊涂,因为它会将其解释为移位运算符。

在关闭模板之间添加空格,将 >>> 改为 > > >

【讨论】:

    【解决方案3】:

    map::insert 本身采用单个 std::pair 参数,而不是两个参数。您可以使用std::make_pair(从函数参数推断模板参数)来整理代码,以获得类似:

    reference.insert(std::make_pair("First", 
                                    std::make_pair(std::make_pair(-1L,-1L),
                                                   std::make_pair(0L,0L))));
    

    【讨论】:

      【解决方案4】:

      在调试这类事情时使用 typedef 很有帮助。

      // test1.cpp : Defines the entry point for the console application.
      //
      
      #include "stdafx.h"
      
      #include <map>
      #include <string>
      
      int _tmain(int argc, _TCHAR* argv[])
      {
          typedef std::pair<long, long> ElementType;
          typedef std::pair<ElementType, ElementType> ValueType;
          typedef std::wstring KeyType;
          std::map<KeyType, ValueType> reference;
      
          KeyType key = L"First";
          reference[key] = ValueType(ElementType(-1, -1), ElementType(0, 0));
      
          return 0;
      }
      

      【讨论】:

      • 没有像 OP 尝试使用的 insert() 函数,即使您 #include &lt;string&gt;。您发布的示例代码有效并且可读性很强,但是因为您替换了insert(),而不是因为您似乎说的包含...
      • 如果你删除“你只需要&lt;string&gt;”部分,我认为这有点误导,我会认为它有帮助并会赞成。
      • 好的,你明白了。我不知道您是否意识到您在答案中编写了“用于插入结果的运算符 [] 使代码更易于阅读”。正如你所说,插入不存在!
      • 是的,我意识到这一点,我在发布我的答案后看到了你的答案,并认为“谁对此投了反对票,运营商 [] 是要走的路!”。然后我对&lt;string&gt; 的东西感到困惑,然后开始尝试是否可能实际上缺少wstring(const char*) 的构造函数,或者这样会产生类似于问题中的错误消息。不过,我无法复制类似的东西,所以我决定发表评论。 (+1)
      【解决方案5】:

      您可以通过创建一个辅助函数来创建对,类似于标准库中提供的std::make_pair 辅助函数来简化您的代码。还使用地图operator[] 进行插入会更容易阅读代码:

      template<typename T, typename U, typename V, typename W>
      std::pair< std::pair<T,U>, std::pair<V,W> > make_pair_pair(T t, U u, V v, W w) {
         // using std::make_pair instead of the constructor for better readability
         return std::make_pair(std::make_pair(t, u), std::make_pair(v, w));
      }
      
      reference[L"First"] = make_pair_pair(1,2,3,4);
      

      【讨论】:

        猜你喜欢
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2013-03-08
        • 2011-01-01
        相关资源
        最近更新 更多