C ++中的std :: map <key,data =“”>是否支持像Structures?</key,>这样的本机数据类型

时间:2010-09-29 20:35:07

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

如何将键映射到结构等本机数据类型?

我写了这个剪辑但我无法编译它。您对如何修复它有什么想法吗?

#include <map>
#include <iostream>

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

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

6 个答案:

答案 0 :(得分:4)

map驻留在std :: namespace中。解决这个问题的两种可能方法:

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

std::map<int, list> test_map;

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

在相关的说明中,除了必须是可复制/可分配的事实以及密钥类型必须具有&lt;之外,对于您可以放在地图中的内容没有实际限制。运算符(或者您也可以提供比较器仿函数)。

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

答案 1 :(得分:2)

在必要时添加了std

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

现在在VS2008中编译好了。

#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<)。

答案 2 :(得分:1)

这里有很多问题:

  • 您缺少using::stdstd::map,因此编译器不知道map<int,list>的含义。

  • 假设您有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;
}

答案 3 :(得分:0)

你好像是来自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;
}

答案 4 :(得分:0)

map<int, _list> test_map;或者不要使用list(更好)作为结构名称。 (你可能还有

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

代码中的某处。

答案 5 :(得分:0)

我会尽量避免使用键盘。

我已经对您的代码进行了几次测试,似乎

  • 它正在添加隐式(和不需要的)using namespace std - 它不要求您限定mapcoutendl
  • 它(可能)包含比您想要的更多标准标题,包括#include <list>

这意味着当编译器查看代码时,它会看到两个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;

但那段代码错误