2013-11-04 3 views
2

У меня есть вектор вектора, содержащих элементы типа длиной следующим образом:Сортировка вектора векторов

vector< vector<long> > Data(N,vector<long>(M)); 

Я должен сортировать эти векторы на основе их значений, т.е. для двух векторов

Data[i] & Data[j] 
if for some k Data[i][k]< Data[j][k] 
and Data[i][t]==Data[j][t] for all 0<=t<=(k-1), 
then Data[i] should come before Data[j] in the final vector 

Не для указанной задачи я написал следующий код:

sort(Data.begin(),Data.end(),myfunc); 

where 

bool myfunc(vector<long> vec1,vector<long> vec2){ 
    int i=0; 
    while(i<vec1.size()){ 
     if(vec1[i]<vec2[i]){ 
      return false; 
     } 
     else if(vec1[i]>vec2[i]){ 
      return true; 
     } 
     i++; 
    } 
    return false; 
} 

Однако, я не получаю желаемый результат. Фактически входные и выходные векторы одинаковы. Где я неправ?? Я что-то упускаю??

+3

результат будет таким же, но функция должна быть 'BOOL MyFunc (Const вектор & vec1, Const вектор & vec2)' –

+0

Я не уверен, что я следую нужная логика, но что не так с простым вызовом 'std :: sort'? – juanchopanza

ответ

2

У вас есть пара ошибок, но не все вам очевидно (пока).

bool myfunc(const vector<long>& vec1, const vector<long>& vec2){ 
    for(size_t i = 0; i < vec1.size() && i < vec2.size(); i++){ 
     if(vec1[i] > vec2[i]){ 
      return false; 
     } else if(vec1[i] < vec2[i]){ 
      return true; 
     } 
    } 
    return false; 
} 

Я взял на себя смелость, используя for петли и size_t, которые являются лучшей практикой здесь.

+0

Спасибо ... Он работает ... Проверял документацию для функции сравнения и выяснил, что мои понятия были неправильными. :) Однако я все еще использовал его как bool myfunc (вектор vec1, vector vec2) и он работает. Любые понятия, которые мне нужно для дальнейшего изучения? – alphacentauri

+0

А что с этими передовыми методами? Можете ли вы объяснить немного дальше, потому что я всегда использую цикл while для любой задачи. – alphacentauri

+0

Что делать, если векторы имеют разный размер? В текущем коде оба кажутся больше, чем другие. –

1

Я пробовал реализовать ваш код как есть. Кажется, сортировка векторов в порядке убывания. Попробуйте переключить истины и фальши с вашей функции myfunc.

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

bool myfunc(vector<long> vec1,vector<long> vec2){ 
    int i=0; 
    while(i<vec1.size()){ 
     if(vec1[i]<vec2[i]){ 
      return false; 
     } 
     else if(vec1[i]>vec2[i]){ 
      return true; 
     } 
     i++; 
    } 
    return false; 
} 

int main() 
{ 
    int N = 5, M = 5; 

    vector< vector<long> > Data(N,vector<long>(M)); 
    for (int i = 0; i < Data.size(); i++) { 
     for (int j = 0; j < Data[i].size(); j++) 
      Data[i][j] = 5-i; 

    } 

    sort(Data.begin(), Data.end(), myfunc); 
    for (int i = 0; i < Data.size(); i++) { 
     for (int j = 0; j < Data[i].size(); j++) 
      cout << Data[i][j] << " " ; 
     cout << endl; 

    } 

    return 0; 
} 

Выход:

5 5 5 5 5 
4 4 4 4 4 
3 3 3 3 3 
2 2 2 2 2 
1 1 1 1 1 

После переключая истины и falses, следующий код сортирует векторы в правильном порядке.

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

bool myfunc(const vector<long> &vec1, const vector<long> &vec2){ 
    int i=0; 
    while(i<vec1.size()){ 
     if(vec1[i]<vec2[i]){ 
      return true; 
     } 
     else if(vec1[i]>vec2[i]){ 
      return false; 
     } 
     i++; 
    } 
    return true; 
} 

int main() 
{ 
    int N = 5, M = 5; 

    vector< vector<long> > Data(N,vector<long>(M)); 
    for (int i = 0; i < Data.size(); i++) { 
     for (int j = 0; j < Data[i].size(); j++) 
      Data[i][j] = 5-i; 

    } 

    sort(Data.begin(), Data.end(), myfunc); 
    for (int i = 0; i < Data.size(); i++) { 
     for (int j = 0; j < Data[i].size(); j++) 
      cout << Data[i][j] << " " ; 
     cout << endl; 

    } 

    return 0; 
} 

Выход

1 1 1 1 1 
2 2 2 2 2 
3 3 3 3 3 
4 4 4 4 4 
5 5 5 5 5 
+0

Да ... Найдена моя ошибка .. Спасибо .. :) – alphacentauri

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