【发布时间】:2019-06-18 09:02:44
【问题描述】:
我试图找出您为std::sort 和std::priority_queue 定义不同的自定义比较函数的原因。
例如,
对于std::sort,我可以这样做:
bool compare(const vector<int>& a, const vector<int>& b)
{
return a[0] < b[0];
}
class foo
{
public:
vector<vector<int>> f(vector<vector<int>> list)
{
std::sort(list.begin(), list.end(), compare);
return list;
}
};
int main()
{
vector<vector<int>> t = { {2,1},{1,0},{3,7} };
foo n;
auto ans = n.f(t);
for (vector<int> x : ans)
{
printf("x[0]: %d , x[1]: %d \n", x[0], x[1]);
}
return 0;
}
运行代码后的结果是:
x[0]: 1 , x[1]: 0
x[0]: 2 , x[1]: 1
x[0]: 3 , x[1]: 7
但是,如果我像这样在foo 中定义另一个函数:
vector<vector<int>> f1(vector<vector<int>> list)
{
std::priority_queue<vector<int>, vector<vector<int>>, compare> pq;
}
编译器不允许我这样做。我解决这个问题的简单方法是在类中创建一个结构,如下所示:
struct Compare
{
bool operator()(const vector<int>& a, const vector<int>& b)
{
return a[0] < b[0];
}
};
这是我目前所拥有的:
从 en.cppreference.com,std::sort 传入了一个比较函数对象,但 priority_queue 传入了一个 Compare 类型。我认为这可能就是为什么我不能对优先级队列使用相同的比较函数。
另一个想法是因为std::sort是一个函数,而priority_queue是一个容器,所以我们需要让它不同?
这就是我现在所拥有的。
我最关心的是为什么他们的行为如此不同? 造成这种差异的主要原因是什么?为什么我们需要它与众不同?
附言谁有什么好的书推荐,可以深入解释STL,更专注于解释STL的代码以及为什么会这样?
【问题讨论】: