【问题标题】:How to put std::set into std::map如何将 std::set 放入 std::map
【发布时间】:2012-09-28 21:22:12
【问题描述】:

我在下面声明了 std: 地图:

std::map<std::string, std::set<unsigned char*>> FilesMap;

int InsertData(unsigned char* name)
{
  // here i try to insert pair with name above and clear std::set
   FilesMap.insert(std::pair<std::string, std::set<unsigned char*>>(std::string((char*)name), std::set<unsigned char*>()));
}

但我有很多错误,例如:

错误 16 错误 C2676: 二进制 '

我做错了什么?

【问题讨论】:

  • 我们是假设您使用的是 C++11 还是您的 &gt;&gt; 关闭令牌中确实有一个空格?
  • 它在我的机器上使用 VS2010 正确编译。好吧,假设你已经包含了&lt;string&gt;&lt;set&gt;&lt;map&gt;
  • @MarkB MSVC 在模板中理解&gt;&gt; 很长时间了。早在标准化之前。

标签: c++ stdmap stdset


【解决方案1】:

使用 std::map 的一个要求是键类型必须有一个 operator &lt; 。关于 std::string 没有此运算符,您似乎遇到了错误。确保您已包含字符串标题#include &lt;string&gt;

【讨论】:

    【解决方案2】:

    首先,这条可怕的长线

    FilesMap.insert(std::pair<std::string, std::set<unsigned char*>>(std::string((char*)name), std::set<unsigned char*>()));
    

    如果你使用 std::make_pair 函数可以简化,它会推导出模板参数。

    FilesMap.insert(std::make_pair(std::string(reinterpret_cast<char*>name)), std::set<unsigned char*>()));
    

    其次,您可以为您的集合创建一个 typedef 以进一步简化上述行

    typedef std::set<unsigned char*> mySetType;
    std::map<std::string, mySetType>> FilesMap;
     FilesMap.insert(std::make_pair(std::string(reinterpret_cast<char*>name)), MySetType()));
    

    最后,也是最重要的一点,我认为编译器无法为 std::string 找到合适的 operator &lt; 的原因是您忘记了 #include&lt;string&gt;

    【讨论】:

    • 你没有说明错误原因,他不想比较,是模板解析错误
    • 但是使用make_pair 的更简单的形式可以消除有问题的&gt;&gt;,并且应该仍然可以解决问题。
    • @jozefg:实际上,你错了,我是对的。错误是编译器找不到用于字符串的运算符 > ...
    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2012-06-10
    • 2021-05-30
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多