按多列对 2D 向量进行排序
Posted
技术标签:
【中文标题】按多列对 2D 向量进行排序【英文标题】:Sort 2D vector by Multiple columns 【发布时间】:2013-01-30 13:46:46 【问题描述】:我正在使用以下提升算法对我的 2D 向量进行排序。
#include <vector>
#include <boost/algorithm/string.hpp>
using namespace std;
class StringListCompare
public:
explicit StringListCompare(int column) : m_column(column)
bool operator()(const vector<string>& lhs, const vector<string>& rhs)
// what do we do if lhs or rhs don't have (m_column + 1) elements?
return lhs[m_column] < rhs[m_column];
private:
int m_column;
;
int main()
std::vector <std::vector <std::string> > data;
std::vector <std::string> temp;
//
// Load 2D vector
sort(data.begin(), data.end(), StringListCompare(2));
//Print 2D vector after sorting by 2nd column
在这里,我只能按我指定为参数的一列对向量进行排序。但我想按两列对这个向量进行排序。我的第一列应该排序。根据第一列排序,我想再次按第二列对向量进行排序。 我怎样才能做到这一点 ?
我想先按第一列排序,然后把第一列相等的再按第二列排序?
【问题讨论】:
我是否理解正确,您想先按第一列排序,然后将第一列相等的排序按第二列排序? 【参考方案1】:如果我得到了你想要的,字典排序(和std::lexigraphical_compare
谓词)会有所帮助。
【讨论】:
【参考方案2】:你想要的就像@distantTransformer 说的lexicographical_compare。它的行为与您创建的StringListCompare
几乎一样,只是它将遍历整个字符串列表。您可以对字符串列表进行排序,而不是像最常见的用例那样对字母进行排序,但这对于 lexicographical_compare 来说并不重要,因为它适用于迭代器。
如果您作为一个学习经验而想自己进行比较,并扩展您的 StringListCompare,您可以这样做:
bool operator()(const vector<string>& lhs, const vector<string>& rhs)
for (int i = 0; i < lhs.size(); ++i)
if (rhs.size() <= i) return false; //rhs has fewer strings than lhs
if (lhs[i] < rhs[i]) return true;
if (lhs[i] > rhs[i]) return false;
//for loop continues while the two vectors are equal
return true; //rhs must be equal or a have more strings than lhs
您可以考虑使用迭代器重写它,但这是一个基本实现。
【讨论】:
非常感谢 daramarak 先生。但它按两个相邻的列排序。但我想按第一列排序,相等的元素将按第三列或任意数量的列排序。辅助列应作为参数传递。我需要决定按哪些列对表格进行排序。而且我没有检查日期类型字段的上述代码。它适用于日期类型字段吗?对不起。我需要检查一下。如果不是,请问如何更改上述功能以执行我提到的两个操作。 @SmithDwayne 此函数将按任意数量的列进行排序。它将首先按第一列排序,如果它们相等,它将比较第二列,然后是第三列,依此类推。至于日期列的排序,如果日期有一个运算符 less (operator 【参考方案3】:我试过了。但我知道这是类型不匹配错误。
class StringListCompare
public:
explicit StringListCompare(int column, int column2, string fCol, string sCol) : m_column(column), m_column2(column2) , fColType(fCol), sColType(sCol)
bool operator()(const vector<string>& lhs, const vector<string>& rhs)
if (lhs[m_column] == rhs[m_column])
if (fColType.compare("string")==0)
return lhs[m_column2] < rhs[m_column2];
else if (fColType.compare("number")==0)
return atoi(lhs[m_column2]) < atoi(rhs[m_column2]);
else
if (fColType.compare("string")==0)
return lhs[m_column] < rhs[m_column];
else if (fColType.compare("number")==0)
return atoi(lhs[m_column]) < atoi(rhs[m_column]);
private:
int m_column;
int m_column2;
string fColType;
string sColType;
;
对于不同的数据类型排序,是否有任何逻辑可以这样做?
【讨论】:
以上是关于按多列对 2D 向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章