gpt4 book ai didi

c++ - 如何实现自定义模板排序功能?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:47 27 4
gpt4 key购买 nike

我有一个 vector 对,我希望它仅按键(可能会出现多次)进行稳定排序。我没有为此使用 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:错误:没有匹配函数来调用“stable_sort”
  • comp3 失败并显示与 comp2 相同的错误消息。

这个模板函数有什么问题?

最佳答案

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());

这样,实际的模板参数推导被推迟到所需类型已知的时候。

关于c++ - 如何实现自定义模板排序功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com