Сортировать 2D вектор по нескольким столбцам

Я использую следующий алгоритм повышения, чтобы отсортировать мой 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
}

Здесь я могу отсортировать вектор только по одному столбцу, который я указал в качестве аргумента. Но я хочу отсортировать этот вектор по двум столбцам. Мой первый столбец должен быть отсортирован. В соответствии с сортировкой по первому столбцу я хочу снова отсортировать вектор по 2-му столбцу.
Как я могу это сделать ?

Я хочу отсортировать сначала по первому столбцу, а затем сортировать с одинаковым первым столбцом для сортировки по второму столбцу?

0

Решение

Если я получил то, что вы хотите, лексикографический вид (и std::lexigraphical_compare предикат) поможет.

1

Другие решения

То, что вы хотите, это как @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
}

Вы можете переписать это, используя итераторы, но это базовая реализация.

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;
};

Есть ли какая-либо логика, доступная для сортировки разных типов данных?

0
По вопросам рекламы [email protected]