C++如何传入列索引实现vector按任意指定列值排序
问题描述
你当前实现的固定列排序代码如下,仅支持按二维vector的第一列排序,需要编写多套函数才能切换排序列:
bool sortcol( const vector <int> v1, const vector <int> v2) { return v1[0]<v2[0]; } sort(ArrOfTimings.begin(), ArrOfTimings.end(), sortcol);
你期望的调用形式是直接传入列索引,不用编写多个排序函数:
bool sortcol(int ind, const vector <int> v1, const vector <int> v2) { return v1[ind]<v2[ind]; } sort(ArrOfTimings.begin(), ArrOfTimings.end(), sortcol(0));
这种写法无法直接生效,因为std::sort要求第三个参数是仅接收两个待比较元素作为入参的可调用对象,直接调用sortcol(0)会返回布尔值,不符合比较器的参数要求。
实现方法
不需要编写多个排序函数,用lambda捕获要排序的列索引即可实现需求,C++11及以上版本均支持该写法:
int sort_col_index = 0; // 替换成需要排序的列序号即可 sort(ArrOfTimings.begin(), ArrOfTimings.end(), [sort_col_index](const vector<int>& v1, const vector<int>& v2) { return v1[sort_col_index] < v2[sort_col_index]; } );
优化提示:比较函数的vector参数建议加const引用,避免每次比较都拷贝整个vector,能大幅提升排序性能。
如果需要封装成你期望的sortcol(ind)调用形式,可以写一个返回比较器的外层函数:
auto sortcol(int ind) { return [ind](const vector<int>& v1, const vector<int>& v2) { return v1[ind] < v2[ind]; }; } // 调用形式和预期完全一致 sort(ArrOfTimings.begin(), ArrOfTimings.end(), sortcol(0)); // 按第0列排序 sort(ArrOfTimings.begin(), ArrOfTimings.end(), sortcol(2)); // 切换为按第2列排序
内容的提问来源于stack exchange,提问作者Mayank_pawar
相关产品推荐
相关产品推荐

