我正在使用以下增强算法对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
}
这里我可以通过只有一个我指定为参数的列对矢量进行排序。但我想用两列对这个向量进行排序。我的第一列应该是有序的。根据第一列排序,我想再次按第二列对矢量进行排序。 我怎样才能做到这一点 ?
我想先按第一列排序,然后对第一列相等的那些排序,以便按第二列排序?
答案 0 :(得分:1)
如果我得到你想要的东西,lexigraphical sort(和std::lexigraphical_compare
谓词)会有所帮助。
答案 1 :(得分:0)
你想要的是@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
}
您可以考虑使用迭代器重写它,但这是一个基本的实现。
答案 2 :(得分:0)
我试过它号码。但我知道这是类型不匹配错误。
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;
};
对于不同的数据类型排序,是否有任何可用的逻辑?