2011-12-24 2 views
1

Я сейчас занимаюсь практикой программирования, пытаясь отсортировать 2D-массив на его первом «столбце».Сортировка многомерного массива C++ странное поведение

Читаю данные из файла:

100 5 
8 80 
5 20 
9 40 
3 10 
6 30 

Это мой код:

#include <cstdio> 
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <map> 
#include <algorithm> 

using namespace std; 

bool helper(vector<long> k, vector<long> l) 
{ 
    return (k[0] < l[0]); 
} 

int main() 
{ 
    ifstream fi("milk.in"); 
    ofstream fo("milk.out"); 
    long price = 0, n, m, i, p, a; 
    vector< vector<long> > farmers; 
    vector<long> farmer(2,0); 
    fi >> n >> m; 

    for (i=0; i<n; ++i) 
    { 
     fi >> p >> a; 
     farmer[0] = p; 
     farmer[1] = a; 
     farmers.push_back(farmer); 
    } 


    sort(farmers.begin(),farmers.end(),helper); 


    for (i=0; i<m; ++i) 
    { 
     cout << farmers[i][0] << " " << farmers[i][1] << endl; 
    } 

    return 0; 
} 

Как вы можете видеть, я пытаюсь разобраться ввод, это первый столбец (я не» t заботиться о первой строке в данный момент).

Однако это результат:

3 10 
5 20 
6 30 
6 30 
6 30 

Это ожидаемый результат:

3 10 
5 20 
6 30 
8 80 
9 40 

Я не могу понять это.

+1

вы попробуйте изменить первую строку файла? –

+1

Несвязанная проблема с производительностью: вы переносите векторы в функцию сравнения по значению. Вместо этого я бы предложил пропустить ссылку const. – fredoverflow

ответ

3

Ваша первая линия вашего milk.in:

100 5 

Вы собираетесь закончить цикл через пытаясь прочитать в 100 входов из этого файла, так как п = 100.

fi >> n >> m; 
for (i=0; i<n; ++i) 

Если вы change milk.in to:

5 5 
8 80 
5 20 
9 40 
3 10 
6 30 

Это похоже на работу.

Может быть, лучше идея заключается в том, чтобы просто проверить, если вы закончите чтение входных данных из FileStream:

for(i = 0; i < n; ++i) 
{ 
    if(!(fi >> farmer[0] >> farmer[1])) break; 

    farmers.push_back(farmer); 
} 
+0

Я понял. Благодаря! – Jonathan

1

Вам нужен этот цикл, чтобы загрузить данные из файла в: И не забудьте закрыть файл ,

while(!fi.eof()) 
    { 
    fi >> n >> m; 
    farmer[0] = n; 
    farmer[1] = m; 
    farmers.push_back(farmer); 
    } 

    fi.close(); 

Кроме того, я сделал некоторые незначительные изменения в коде:

#include <cstdio> 
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <map> 
#include <algorithm> 

using namespace std; 

bool helper(vector<long> k, vector<long> l) 
{ 
    return (k[0] < l[0]); 
} 

int main() 
{ 


    long price = 0, n, m, i, p=0, a=0,numlines=0; 
    vector< vector<long> > farmers; 
    vector<long> farmer(2,0); 

    cout<<"\nLoading data from file: milk.in\n\n"; 

    ifstream fi("milk.in"); 
    while(!fi.eof()) 
    { 
    fi >> n >> m; 
    numlines++; 
    cout<<n<<" "<<m<<"\n"; 

    farmer[0] = n; 
    farmer[1] = m; 
    farmers.push_back(farmer); 
    } 

    fi.close(); 


    cout<<"--- "<<numlines<<" lines loaded\n"; 
    cout<<"\n---------------------\n"; 

    cout<<"\nSorted data:\n\n"; 

    sort(farmers.begin(),farmers.end(),helper); 

    ofstream fo("milk.out"); 
    for (i=0; i<numlines; ++i) 
    { 

     cout << farmers[i][0] << " " << farmers[i][1] << endl; 
     fo<< farmers[i][0] << " " << farmers[i][1] << endl; 

    } 
    fo.close(); 

    cout<<"\n---------------------\n"; 

    return 0; 
} 

Выход:

Sorted data: 

3 10 
5 20 
6 30 
8 80 
9 40 
100 5 
Смежные вопросы