我有一个对的向量,我想要稳定仅按键排序(可能多次出现)。我没有使用multimap
,因为它没有明确稳定。因此,我向stable_sort
提供了自定义比较功能。我现在正在努力模仿这个功能。下面是一个简短的测试实现,向您展示用例:
#include <iostream>
#include <algorithm>
#include <vector>
#include "test.h"
using namespace std;
int main() {
typedef pair<int, int> TPair;
vector<TPair> data(10);
data[0] = make_pair(7, 1);
data[1] = make_pair(3, 2);
data[2] = make_pair(8, 0);
data[3] = make_pair(5, 1);
data[4] = make_pair(3, 1);
data[5] = make_pair(2, 0);
data[6] = make_pair(7, 0);
data[7] = make_pair(6, 0);
data[8] = make_pair(5, 0);
data[9] = make_pair(3, 0);
stable_sort(data.begin(), data.end(), comp1);
for (unsigned int i = 0; i < 10; ++i) {
cout << data[i].first << "\t" << data[i].second << endl;
}
return 0;
}
test.h
中提供了提供的排序功能:
#include <vector>
#ifndef TEST_H_
#define TEST_H_
using namespace std;
bool comp1(pair<int, int> const & a, pair<int, int> const & b) {
return a.first < b.first;
}
template <typename TElemA, typename TElemB>
bool comp2(pair<TElemA, TElemB> const & a, pair<TElemA, TElemB> const & b) {
return a.first < b.first;
}
template <typename TPair>
bool comp3(TPair const & a, TPair const & b) {
return a.first < b.first;
}
#endif
comp1
运作良好,没有什么可抱怨的。首先,我试着模仿对的元素:comp2
不起作用:test.cpp:25:3: error: no matching function for call to 'stable_sort'
。comp3
失败并显示与comp2
相同的错误消息。此模板功能有什么问题?
答案 0 :(得分:3)
stable_sort
本身就是一个模板,其第三个参数的类型是模板参数。这意味着您不能将函数模板作为参数传递,因为模板参数推导不能在此处应用 - 没有什么可以告诉您将要执行的实例化。所以你必须明确指定模板参数:
stable_sort(data.begin(), data.end(), comp2<int, int>);
但是,如果你为它提供一个仿函数,你会更好:
struct comp2
{
template <typename TElemA, typename TElemB>
bool operator() (pair<TElemA, TElemB> const & a, pair<TElemA, TElemB> const & b) const {
return a.first < b.first;
}
};
stable_sort(data.begin(), data.end(), comp2());
这样,实际的模板参数推导被推迟到知道所需类型的时间。
答案 1 :(得分:0)
自C++14起,您也可以使用lambda expression代替模板。这是因为C ++ 14允许使用通用lambda,可以使用auto
类型说明符声明其功能参数:
std::stable_sort(std::begin(data), std::end(data), [](auto const &a, auto const &b){
return a.first < b.first;
});
这样,您的代码会变得很短,但仍适用于任何可比较的std::pair
键。