【问题标题】:Does std::map<key, data> in C++ support native data types like Structures?C++ 中的 std::map<key, data> 是否支持结构等原生数据类型?
【发布时间】:2010-09-29 20:35:06
【问题描述】:

如何将键映射到结构等原生数据类型?

我写了这个片段,但我无法编译它。您对如何解决它有任何想法吗?

#include <map>
#include <iostream>

typedef struct _list
{
  int a,b;
}list;
map<int,list> test_map;

int main(void)
{
  cout <<"Testing"<< endl;
}

【问题讨论】:

  • 您是否尝试过阅读编译器要说的内容?
  • 您好!要获得有关此类问题的更好答案,请提供您的编译器给您的确切错误(以及您使用的编译器)。
  • 第 8 行:错误:对“列表”的引用是由于 -Wfatal-errors 而终止的模棱两可的编译。
  • typedef struct -- 你好,80 年代!
  • 第 8 行:错误:对“列表”的引用是由于 -Wfatal-errors 而终止的模棱两可的编译。

标签: c++ dictionary std stdmap c++-standard-library


【解决方案1】:

map 位于 std:: 命名空间中。解决此问题的两种可能方法:

using namespace std;
// ...
map<int, list> test_map;

std::map<int, list> test_map;

我更喜欢第二种方法,但这纯粹是个人选择。

在相关说明中,除了它们必须是可复制/可分配的,并且键类型必须具有

编辑:似乎&lt;list&gt; 包含在某处,在&lt;iostream&gt;(不太可能)或&lt;map&gt;(奇怪但并非不可能)中。 using namespace std 将导致 std::list 与您自己的结构冲突。解决方案:重命名您的结构,或删除 using 命名空间并将 std:: 放在需要的位置。

【讨论】:

  • 第 8 行:错误:对“列表”的引用是由于 -Wfatal-errors 而终止的模棱两可的编译。
  • 哦,对了,我忘了说你还需要在 cout 和 endl 之前添加 std::。
【解决方案2】:

在需要的地方添加了std

将列表重命名为 mylist 以避免与 std::list 冲突。避免使用与常用用法冲突的类型名和变量名。

现在在VS2008中编译OK了。

#include <map>
#include <iostream>

typedef struct _list
{
    int a,b;
} mylist;

std::map<int,mylist> test_map;

int main(void)
{
    std::cout <<"Testing"<< std::endl;
    return 0;
}

在 STL 容器中使用您的结构没有问题,只要它可以干净地复制(复制构造函数)、可分配(实现 operator=)和可比较(实现 operator&lt;)。

【讨论】:

  • 但是如何将值插入到我的 test_map 中。例如如何为 test_map[0] 插入 a=1,b=2
  • @skokal01 - 在 mylist 上定义一个需要 2 个整数的构造函数,然后像这样插入到地图中:test_map[0] = mylist(int1, int2);
  • @skokal01 - 计划熟悉您的 STL 文档。如果您以有针对性的方式进行搜索,则此论坛上也有大量建议。例如,您还可以使用 insert(make_pair) 插入地图。 [] 插入的语义很有趣,可能不直观,看看吧。
【解决方案3】:

这里有很多问题:

  • 您缺少using::stdstd::map,因此编译器不知道map&lt;int,list&gt; 的含义。

  • 假设您有一个 using namespace std 声明,您的 typedef list 可能会与同名的 STL 集合发生冲突。更改名称。

  • 您的 typedef struct _tag {...} tag; 构造是 80 年代的古老保留。这不是必需的,坦率地说相当愚蠢。它什么也得不到。

您的代码已修复:

#include <map>
#include <iostream>

struct MyList
{
  int a,b;
};

std::map<int,MyList> test_map;

int main(void)
{
  std::cout <<"Testing"<< std::endl;
  return 0;
}

【讨论】:

    【解决方案4】:

    map&lt;int, _list&gt; test_map; 或者不要使用list(更好)作为结构的名称。 (你可能也有

    #include <list>
    ...
    using namespace std;
    

    在你的代码中。

    【讨论】:

      【解决方案5】:

      我会尽量避免使用键盘。

      我已经用你的代码做了几个测试,似乎

      • 它添加了一个隐含的(和不需要的)using namespace std——它不需要您限定mapcoutendl
      • 它(可能)包含比您想要的更多的标准标题,包括#include &lt;list&gt;

      这意味着当编译器查看代码时,它会看到两个list、您的版本和std 中的一个。由于 using 指令,两者都在您创建映射的行的范围内,编译器无法确定使用哪个。

      您可以做两件简单的事情:将简单测试的类型名称更改为 list 以外的名称(哎呀!强制您选择命名的工具!)或完全限定使用:

      #include <map>
      struct list {
         int a,b;
      };
      std::map< int, ::list > the_map;
      // ...
      

      注意 codepad 是自己添加 include 和 using 指令,所以它也会编译:

      struct list {
         int a,b;
      };
      map<int,::list> the_map;
      

      但是那段代码是错误的

      【讨论】:

        【解决方案6】:

        你似乎来自 C。试试这个:

        #include <map>
        #include <iostream>
        
        struct list
        {
          int a,b;
        };
        
        std::map<int,list> test_map;
        
        int main(void)
        {
          std::cout <<"Testing"<< std::endl;
          return 0;
        }
        

        【讨论】:

        • 你的意思是说“你似乎来自 C”?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-17
        • 2023-04-07
        相关资源
        最近更新 更多