【问题标题】:Sorting multidimensional array C++ strange behaviour排序多维数组 C++ 奇怪的行为
【发布时间】:2012-01-27 06:10:40
【问题描述】:

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

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

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

我想不通。

【问题讨论】:

  • 您是否尝试更改文件的第一行?
  • 一个不相关的性能问题:您将向量按值传递给比较函数。我建议改为通过 const 引用传递。

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


【解决方案1】:

milk.in的第一行:

100 5

由于 n = 100,您最终将循环尝试从该文件中读取 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);
}

【讨论】:

    【解决方案2】:

    你需要这个循环来从文件中加载数据: 并记得关闭文件。

       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
    

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 2023-04-06
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2011-12-27
      • 2011-03-13
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多