4

sort C++ 関数を使用して、ベクトルに格納された構造をソートしようとしています。以前は問題なくこれを実行しました。ただし、目的の出力が得られません。

比較関数自体を試してみると動作しますが、並べ替え C++ 関数を使用すると、比較関数が動作していないようです。

アイデアは、int 配列を 2 進数であるかのように昇順に並べ替えることです。これを行うにはさまざまな方法があることは知っていますが、なぜこれが機能しないのかわかりません。

予想される出力は次のとおりです。

0000000000
0101010101
0110110110

出力は次のとおりです。

0000000000
0110110110
0101010101

ここで何が起こるかわかりません。これが私のコードです:

using namespace std;
int n;
struct solucion{
  int array[150];
};

vector <solucion> soluciones;

bool compare(solucion solucion1, solucion solucion2){
  for(int i=1;i<=n;i++)
    if(solucion2.array[i]>solucion1.array[i])
      return true;
  return false;
}

void print() {
  for(int i=0;i<soluciones.size();i++){
    for(int k=1;k<=n;k++)
      cout << soluciones.at(i).array[k];
    cout << endl;
  }
}

int main(int argc, char *argv[])
{
    solucion solucion1;
    solucion1.array[1]=0;
    solucion1.array[2]=0;
    solucion1.array[3]=0;
    solucion1.array[4]=0;
    solucion1.array[5]=0;
    solucion1.array[6]=0;
    solucion1.array[7]=0;
    solucion1.array[8]=0;
    solucion1.array[9]=0;
    solucion1.array[10]=0;

    solucion solucion2;
    solucion2.array[1]=0;
    solucion2.array[2]=1;
    solucion2.array[3]=0;
    solucion2.array[4]=1;
    solucion2.array[5]=0;
    solucion2.array[6]=1;
    solucion2.array[7]=0;
    solucion2.array[8]=1;
    solucion2.array[9]=0;
    solucion2.array[10]=1;

    solucion solucion3;
    solucion3.array[1]=0;
    solucion3.array[2]=1;
    solucion3.array[3]=1;
    solucion3.array[4]=0;
    solucion3.array[5]=1;
    solucion3.array[6]=1;
    solucion3.array[7]=0;
    solucion3.array[8]=1;
    solucion3.array[9]=1;
    solucion3.array[10]=0;

    soluciones.push_back(solucion1);
    soluciones.push_back(solucion2);
    soluciones.push_back(solucion3);

    n=10;
    sort(soluciones.begin(),soluciones.end(),compare);
    print();
    system("PAUSE");
    return EXIT_SUCCESS;
}
4

3 に答える 3

4

比較関数は、配列に対して厳密な弱い順序付けを適切に確立していません(たとえば、比較関数によれば、 ifsolucion1 = {1,0,1}solucion2 = {0,1,0}then の両方が truesolucion1 < solucion2solucion2 < solucion1なりますが、これは明らかにばかげています)。

定義の比較を、 std::lexicographical_compareなどの順序付けを提供するものに変更する必要があります。

bool compare(solucion solucion1, solucion solucion2){
    return std::lexicographical_compare(
        solucion1.array+1, solucion1.array+1+n,
        solucion2.array+1, solucion2.array+1+n);
}
于 2012-12-21T06:21:55.670 に答える
3

正しい構造体が少ないことがわかったらすぐに false を返す必要があります。

bool compare(solucion solucion1, solucion solucion2){
  for(int i=1;i<=n;i++) {
    if(solucion2.array[i] > solucion1.array[i])
      return true; 
    else if (solucion2.array[i] < solucion1.array[i])
      return false; 
  }
  return false;  
}    

そして、初期化するためのより良い方法:

solucion solucion1 = {{0,0,0,0,0,0,0,0,0,0,0}};
solucion solucion2 = {{0,0,1,0,1,0,1,0,1,0,1}};
solucion solucion3 = {{0,0,1,1,0,1,1,0,1,1,0}};
于 2012-12-21T06:16:52.047 に答える
0

あなたのソリューションは私のためにクラッシュします、試してください

 bool compare(solucion solucion1, solucion solucion2){
       for(int i=1;i<=n;i++)
       {
          if(solucion2.array[i]>solucion1.array[i])
               return true; 
          else
            return false;  
       }

   }    
于 2012-12-21T06:33:19.243 に答える