0

あるベクトルを別のベクトルに配置することで、どのように整理できるのか疑問に思っていました。(注: オブジェクトのベクトルです)。私がこれまでに持っているものは次のとおりです。

double done;
for ( int i = 0; i < id; i++ )
{
    done = guy[i].done();
    int smallest = i;
    for( int j = i + 1; j < id; j++ ){
        if( done > guy[j].done() )
            {
                done = guy[j].done();
                smallest = j;   
            }
        }
    newGuy.push_back( guy[smallest] );
}

これはベクトルのすべての部分を整理するわけではなく、同じ男を newGuy にコピーすることさえあります。何か案は?

4

2 に答える 2

3

ベクトルをソートしようとしている場合は、オブジェクトのカスタムの小なりコンパレーターを定義し、std::sortを使用できます。

bool myComparison(const MyType& lhs, const MyType& rhs) {
  return lhs.done() < rhs.done();
}

std::vector<MyType> guy = ....;
std::sort(guy.begin(), guy.end(), myComparison);

すべてを新しいベクターに移動させたい場合は、元のベクターをコピーしてから、コピーを並べ替えます。

std::vector<MyType> newGuy = guy;
std::sort(newGuy.begin(), newGuy.end(), myComparison);
于 2012-08-21T12:43:52.343 に答える
1

新しい配列に入れるときに、古い配列から最小の人を削除していないためです。値を考慮する[5,4,3,2,1]

あなたのアルゴリズムはi、最小のものを見つけるための最初の値でj=4 (value 1)、新しい配列に 1 をプッシュしi=2ます。[1,1,1,1,1]

太字の数字はループされるもので、2 番目の配列は出力配列です。

パス 1:
[ 5 , 4 , 3 , 2 , 1 ]
[1]

パス 2:
[5, 4 , 3 , 2 , 1 ]
[1,1]

パス 3:
[5, 4, 3 , 2 , 1 ]
[1,1,1]

パス 4:
[5, 4, 3, 2 , 1 ]
[1,1,1,1]

パス 5:
[5, 4, 3, 2, 1 ]
[1,1,1,1,1]

毎回新しいベクトルに追加するときに、古いベクトルから最小であることがわかったアイテムを削除するだけです。もちろん、他の人が指摘しているように、実際には標準のソートアルゴリズムを使用する方が良いでしょう

于 2012-08-21T12:49:04.390 に答える