2016-05-04 3 views
0

Я пытаюсь сортировать вектор по нескольким столбцам. Таким образом, мой вектор, где строки - это количество строк. Поскольку я использую вектор в for-loop для разных размеров, он должен быть динамически.Сортировка Vecor несколькими столбцами

vector<vector<double> > matrix; 
matrix.resize(rows); 
for(size_t i=0; i<rows; i++) { 
    matrix[i].resize(3); 
} 

После того, как вектор установлен, я заполняю его данными. Данные состоят из координат (xyz).

for(size_t i = 0;i<lss.size();i+2) { 
      int k = i+1; 
      matrix[i][0]=lss[i].v[0].x; 
      matrix[i][1]=lss[i].v[0].y; 
      matrix[i][2]=lss[i].v[0].z; 
      matrix[k][0]=lss[i].v[1].x; 
      matrix[k][1]=lss[i].v[1].y; 
      matrix[k][2]lss[i].v[1].z; 
    } 

До сих пор все работает нормально. Но потом мне нужно отсортировать вектор. Из моих данных я знаю, что координата z всегда одна и та же, для одного прохода в цикле. Поэтому мне пришлось бы отсортировать вектор первым, а не вторым столбцом. Я уже ищу функции сортировки, такие как std: sort, я не мог найти что-то подходящее. Я стараюсь:

int compare(vector<double>& s1, vector<double>& s2) 
{ 
    return s1[0] < s2[0]; 
} 
std::sort(matrix.begin(), matrix.end(), compare); 

Но результат был таким же, как и вход.

Так несортированный результат выглядит следующим образом:

X=-5.000000, Y=2.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=-5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 

Что я хочу:

X=-5.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=2.000000, Z=-2.000000 
X=-5.000000, Y=5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
+0

Тип возврата вашей функции сравнения должен быть 'bool'. Но это не должно препятствовать работе. Пожалуйста, напишите MCVE, который можно скопировать, скомпилировать и запустить. – SergeyA

ответ

3

Так как вы хотите, чтобы отсортировать на основе первых двух столбцов, функция сравнения необходимо использовать как значения. Также измените тип возврата compare на bool и типы аргументов на const&.

bool compare(vector<double> const& s1, vector<double> const& s2) 
{ 
    // If the values of the first column are not equal, 
    // just use them to order s1 and s2. 
    if (s1[0] != s2[0]) 
    { 
     return s1[0] < s2[0]; 
    } 

    // If the values of the first column are equal, 
    // use the values of the second column to order s1 and s2. 
    return s1[1] < s2[1]; 
} 
+0

Спасибо, я попробовал ваш совет, и он работал отлично. – user3794592

+0

@ user3794592, рад, что это сработало. –

Смежные вопросы