向STL容器:multiset中插入元素失败有关问题

高分求教向STL容器:multiset中插入元素失败问题。
问题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()); 
就会出线六个莫名其妙的编译错误。
请问各位大侠是为什么?





------解决方案--------------------
关注,友情帮顶,不知道问题所在,但是排序的时候使用整型相除,会存在截断误差。
------解决方案--------------------
1.set是序列行容器,底层一般是RBtree,本身就是排序的,所以不需要排序。
2.sort()要求是RandomAccessIter,set是BiDirectonalIter,所以编译不过。像list之类也不能sort(),如果对其排序必须用自带的成员函数sort(),原因一样。

------解决方案--------------------
说错了,set是关联容器。
------解决方案--------------------
看能不能用标准库的sort(),归根结底看是否支持随机访问迭器。
而容器的迭代器是由这个容器的数据结构限制的。