请教一下容器set的用法

beyondgirlzxm 2011-02-23 11:46:44
有定义:
struct FileInfo
{
int nNumber;
int nCount;
char szFile[128];
};
map<int, set<FileInfo>> mapFile;
FileInfo file1;
file1.nCount = 10;
file1.nNumber = 1;
sprintf_s(file1.szFile, 128, "zxm%d", 1);
mapFile[1].insert(file1);

为什么编译不过,要报一堆错error C2784: “bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)”: 无法从“const FileInfo”为“const std::basic_string<_Elem,_Traits,_Alloc> &”推导 模板 参数
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\string(150) : 参见“std::operator <”的声明

如果将set里的结构体换成存指针,就可以编译通过
map<int, set<FileInfo*>> mapFile;
FileInfo file1;
file1.nCount = 10;
file1.nNumber = 1;
sprintf_s(file1.szFile, 128, "zxm%d", 1);
mapFile[1].insert(&file1);

同样如果将set换成vector也是ok了,能顺利编译通过
map<int, vector<FileInfo>> mapFile;
FileInfo file1;
file1.nCount = 10;
file1.nNumber = 1;
sprintf_s(file1.szFile, 128, "zxm%d", 1);
mapFile[1].push_back(file1);
...全文
100 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2011-02-24
  • 打赏
  • 举报
回复
set需要排列数据,当使用set<FileInfo> 时,需要提供operator < 来帮助set确定排序规则
set<FileInfo*>之所以可以通过,是因为默认的排序准则可以帮助set确定存放顺序,而vector不要排序准则,因此也正确

另外:map<int, vector<FileInfo> >
—— 这2个大于号之间尽量加空格,防止被看成移位操作符,尽管vs已经支持写在一起了
AAA20090987 2011-02-24
  • 打赏
  • 举报
回复
该说的一楼都说完了
wei801516 2011-02-24
  • 打赏
  • 举报
回复
都被1楼说咯!~~~~ 1楼正确哈!
pengzhixi 2011-02-24
  • 打赏
  • 举报
回复
额,关联容器里面的元素都需要有严格的若排序规则的。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧