排序多维数组C ++奇怪的行为

时间:2011-12-24 08:39:11

标签: c++ arrays sorting vector multidimensional-array

我现在正在做一些编程练习,试图在它的第一个“列”上对2D数组进行排序。

我正在读取文件中的输入:

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 个答案:

答案 0 :(得分:3)

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 :(得分: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