Сортировка многомерного массива C ++ странное поведение - PullRequest
1 голос
/ 24 декабря 2011

Я сейчас занимаюсь программированием, пытаясь отсортировать двумерный массив по его первому «столбцу».

Я читаю входные данные из файла:

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

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

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

3 10
5 20
6 30
6 30
6 30

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

3 10
5 20
6 30
8 80
9 40

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

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

Ваша первая строка вашего milk.in:

100 5

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

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

Если вы измените milk.in на:

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

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

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

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

    farmers.push_back(farmer);
}
1 голос
/ 24 декабря 2011

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

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...