高分求教向STL容器:multiset中插入元素失败问题。

archimedes_zht 2007-10-02 12:30:31
问题1:
在下面的代码中我定义了一个仿函数SortCriterion用来指定PairSet的排序规则。
但是 SortCriterion 不仅起不到应有的作用,而且好多元素都会插入失败(如果用默认的排序规则,所有的元素都会插入成功)。
请问各位大侠错在哪里?

#include <iostream>
#include <set>
#include <algorithm>
#include <iomanip>
#include <fstream>
#include <utility>
using namespace std;

class SortCriterion
{
public:
bool operator() (const pair<int, int>& p1, const pair<int, int>& p2) const
{
return (p1.first / p1.second) > (p2.first / p2.second);
};
};

int main()
{
typedef multiset<pair<int, int>, SortCriterion> PairSet;

fstream cin("data.txt");

int max;
PairSet Set;

int vi, wi;
while (cin >> vi >> wi)
{
Set.insert(pair<int, int>(vi, wi));
}

for (PairSet::iterator it = Set.begin(); it != Set.end(); ++it)
{
cout << setw(5) << it->first << setw(5) << it->second << endl;
}

return 0;
}

问题2:
还有就是如果在for语句上面加上
sort(Set.begin(), Set.end());
就会出线六个莫名其妙的编译错误。
请问各位大侠是为什么?



...全文
162 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
archimedes_zht 2007-10-02
  • 打赏
  • 举报
回复
我看了一下STL的参考书,set和multiset都是自动排序的。自动排序的主要优点在于使二叉树在搜寻元素时具有良好性能。但是自动排序造成set和multiset一个重要的限制:你不能直接改变元素值,因为这会打乱原本正确的顺序。因此要改变元素值,你必须先删除旧元素,再插入新元素。

上面的话是不是就说明了:set不能用sort排序。
archimedes_zht 2007-10-02
  • 打赏
  • 举报
回复
谢谢,我使用float时,插入和排序都很正常了。
现在就剩下第二个问题了,难道set不能用sort排序吗?
Supper_Jerry 2007-10-02
  • 打赏
  • 举报
回复
关注,友情帮顶,不知道问题所在,但是排序的时候使用整型相除,会存在截断误差。
yshuise 2007-10-02
  • 打赏
  • 举报
回复
看能不能用标准库的sort(),归根结底看是否支持随机访问迭器。
而容器的迭代器是由这个容器的数据结构限制的。
ddc 2007-10-02
  • 打赏
  • 举报
回复
说错了,set是关联容器。
ddc 2007-10-02
  • 打赏
  • 举报
回复
1.set是序列行容器,底层一般是RBtree,本身就是排序的,所以不需要排序。
2.sort()要求是RandomAccessIter,set是BiDirectonalIter,所以编译不过。像list之类也不能sort(),如果对其排序必须用自带的成员函数sort(),原因一样。

64,666

社区成员

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

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