求教为什么输出是3

Prairial_0 2012-10-24 09:17:25

#include <vector>
#include <set>
#include <cstdio>

int numbers[10] = {1,2,3,2};

struct CMP{
bool operator() (std::vector<int>* const p1, std::vector<int>* const p2) const{
const std::vector<int> &v1 = *p1, &v2 = *p2;
bool flag = false;
for (int i = 0; i < v1.size() && !flag; ++i)
if (numbers[v1[i]] != numbers[v2[i]]) flag = true;
if (!flag) return false;
for (int i = 0; i < v1.size(); ++i)
if (v1[i] != v2[i]) return v1[i] < v2[i];
return false;
}
};

int main(){
std::vector<int> v1, v2, v3;
v1.push_back(1);
v2.push_back(2);
v3.push_back(3);
std::set<std::vector<int>*,CMP> set;
set.insert(&v1);
set.insert(&v2);
set.insert(&v3);
printf("%d\n", set.size());

return 0;
}


g++ 4.7.1编译。为什么输出是3不是2呢?
...全文
190 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Prairial_0 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

set的比较函数,是要定义出严格弱序来。你这写得比较复杂……
[/Quote]

其实回复后我大概就明白怎么回事了(昨天CSDN大姨妈了么。。。)。这个关系应该不是全序的。谢谢了。
zjs100901 2012-10-25
  • 打赏
  • 举报
回复
set的比较函数,是要定义出严格弱序来。你这写得比较复杂……
Prairial_0 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

能解释一下CMP的逻辑吗?
[/Quote]

比较两个相同大小的vector<int>
vector<int>保存了numbers的索引[0,n)
1. 如果两个vector保存的索引对应到numbers的值完全一样,则认为两个vector相等
2. 否则按照索引的字典序返回比较结果
zjs100901 2012-10-24
  • 打赏
  • 举报
回复
CMP
Prairial_0 2012-10-24
  • 打赏
  • 举报
回复

#include <vector>
#include <set>
#include <cstdio>

int numbers[10] = {1,2,3,2};

struct CMP{
bool operator() (std::vector<int>* const p1, std::vector<int>* const p2) const{
const std::vector<int> &v1 = *p1, &v2 = *p2;
bool flag = false;
for (int i = 0; i < v1.size() && !flag; ++i)
if (numbers[v1[i]] != numbers[v2[i]]) flag = true;
if (!flag) return false;
for (int i = 0; i < v1.size(); ++i)
if (v1[i] != v2[i]) return v1[i] < v2[i];
return false;
}
};

int main(){
std::vector<int> v1, v2, v3;
v1.push_back(1);
v2.push_back(2);
v3.push_back(3);
std::set<std::vector<int>*,CMP> set;
set.insert(&v1);
// set.insert(&v2);
set.insert(&v3);
printf("%d\n", set.size());

return 0;
}


另外注释掉一行就只有一个元素了

65,187

社区成员

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

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