3

基本的にベクトルのシーケンスを逆にする簡単なプログラムを作成しようとしています。言い換えれば、プログラムが実行された後、x[0]は と等しくなるはず5です。私が現在得ている出力はです5234。は1どこかに行方不明になります。<vector>ヘッダーを含めました。前もって感謝します。

int main()
{
    vector<int> x(5);
    x[0] = 1;
    x[1] = 2;
    x[2] = 3;
    x[3] = 4;
    x[4] = 5;
    for(int z = 0; z < x.size()-1; z++)
    {
        int temp = x[x.size() - (1+z)];
        x[x.size() - (1+z)] = x[z];
        x[z] = temp;
    }
    for(int s = 0; s < x.size() - 1; s++)
    {
        cout << x[s] << endl;
    }
    return 0;
}
4

5 に答える 5

5

一歩下がってください。スワップ(疑似コード)を入れるだけでこれはどうなると思いますか

for( elt1 = begin, elt2 = end-1; elt1 != end; ++elt1, --elt2 )
{
    iter_swap( elt1, elt2 );
}

これはあなたのコレクションを元に戻すことはありません。というか、そうなるでしょうが、元の場所に戻って元に戻ります。コレクションに 4 つの要素があるとします。

swap( 0, 3 )
swap( 1, 2 )
swap( 2, 1 )
swap( 3, 0 )

終了条件が間違っているため、途中でのみスワップする必要があります...

于 2012-11-23T11:43:20.110 に答える
3

ベクトルを逆にするコードを書くのではなく、std::reverseアルゴリズムを使用する必要がありますか?

http://www.cplusplus.com/reference/algorithm/reverse/

なぜ車輪を再発明するのですか?

于 2012-11-23T12:30:27.490 に答える
3

あなたのループは1要素短いです。彼らはする必要があります

for(int z = 0; z < x.size(); ++z)

(dtto for s)。

于 2012-11-23T11:36:17.937 に答える
1

何人かの人々が、コードを機能させる方法を指摘しています。将来的に問題を回避する方法を指摘します: コードを書かないでください (自分で):

std::vector<int> x(5);

std::iota(x.begin(), x.end(), 1);

std::reverse(x.begin(), x.end());

std::copy(x.begin(), x.end(), 
          std::ostream_iterator<int>(std::cout, "\n"));

このようにコピーする直前に反転することは十分に一般的であるため、標準には2つを組み合わせるアルゴリズムがあります。

std::vector<int> x(5);   
std::iota(x.begin(), x.end(), 1);

std::reverse_copy(x.begin(), x.end(),
                  std::ostream_iterator<int>(std::cout, "\n"));

状況によっては、reverse_copy の代わりにリバース イテレータを使用する方が簡単な場合があります。

std::vector<int> x(5);   
std::iota(x.begin(), x.end(), 1);

std::copy(x.rbegin(), x.rend(), std::ostream_iterator<int>(std::cout, "\n"));

ただし、後者の 2 つのケースでは、実行していることは微妙に異なることに注意してください。ベクター内のデータを逆にしてから、ベクターを最初から最後まで出力しているわけではありません。むしろ、ベクトルを逆の順序で出力しているだけで、ほぼ次のようになります。

for (int i=x.size(); i>0; i--)
    std::cout << x[i-1] << "\n";

最後の詳細: を使用しないことをお勧めしstd::endlます。多くの書籍 (および教師、講師、教授など) が "\n" の代わりに使用していることは知っていますが、実際にはそうではありません。改行を書き込むだけでなく、ストリームをフラッシュします。あなたはそれを望んでいません。まれにそうする場合は、std::flush代わりに を使用して、本当にそれが必要であることを明確にする必要があります。改行が必要な場合は、改行を書くだけです。

于 2012-11-23T12:26:35.087 に答える
0

要素を2回交換しています。これを行う簡単な方法は次のとおりです。

vector<int> x(5);
x[0] = 1;
x[1] = 2;
x[2] = 3;
x[3] = 4;
x[4] = 5;

int mid = x.size() / 2;
int last = x.size() - 1;

for (int i = 0; i < mid; i++) {
  int tmp = x[i];
  x[i] = last - i;
  x[last - i] = tmp;
}

for (int s = 0; s < x.size(); s++)
  cout << x[s] << endl;
于 2012-11-23T11:50:52.777 に答える