2

これが私がしなければならないことです!

次の手順を実行するプログラムを作成します。

メモリを動的に割り当てて、10 個の int の配列を格納します。各 int に 1 ~ 100 のランダムな値を割り当てます。10 個のランダムな int のそれぞれを int のベクトルにコピーします。以下のサンプル出力に示すように、動的に割り当てられた int の配列と int のベクトルをそれぞれ幅 5 で出力します。

最後の点に問題があります。私のコードは完全に機能していますが、int のベクトルで幅を設定する方法がわからないため、int の配列と同じです。

#include<iostream>
#include<iomanip>
#include<cstdlib>
#include <vector>
#include <algorithm>
#include <iterator>
#include <stdexcept>

using namespace std;

int main(){

    const int SIZE = 10;
    int *arr = new int[SIZE];

    //assign rand numbers between 0 and 100
    for (int i = 0; i < SIZE; ++i){
        *(arr + i) = rand() % 100+1;
    }

    //print array
    for (int i = 0; i < SIZE; ++i){
        cout << setw(5) << *(arr +i) << " ";
    }
    std::vector<int> integers (arr, arr + 10);
    std::ostream_iterator<int> output(cout, " ");

    cout << endl;
    cout << "Vector integers contain: " << endl;
    std::copy(integers.begin(), integers.end(), output);

    return 0;
}
4

3 に答える 3

1

あなたのコードはそのままで問題なく動作します。cout << setw(5);幅をうまく設定します。を使用することもできますcout.width(5);

于 2013-10-16T03:40:59.493 に答える
1

本当にこれを で行いたい場合ostream_iterator、最もクリーンな方法は、おそらく小さなプロキシ クラスを使用することです。

class integer {
   int i;
public:
   integer(int i) : i(i) {}

   friend std::ostream &operator<<(std::ostream &os, integer i) { 
       return os << std::setw(5) < i.i;
   }
};

次に、それらを書き出すために、その型を へのテンプレート パラメータとして使用しますostream_iterator

std::copy(integers.begin(), integers.end(), 
          std::ostream_iterator<integer>(std::cout, ' '));

これにより、一時integerオブジェクトが作成され、幅を設定するoperator<<forを使用して書き出されます。integer少なくとも理論的には、これはおそらくいくらかのオーバーヘッドを課しますが、(少なくとも最適化が有効になっていると) ほとんどのコンパイラはおそらく (いわば) 巧妙な策略を見抜き、余分なコピーなどを排除するでしょう。

もちろん、幅が具体的にキャストされていない場合はinteger、テンプレートを作成して、幅をテンプレート パラメーターとして指定できます。

template <int N>
class integer { 
    // ...
    return os << std::setw(N) < i.i;

forostream_iterator を本当に使用する必要がない限り、範囲ベースのループを使用すると思います。

for (int i : integers) 
    std::cout << std::setw(5) << i << ' ';
于 2013-10-16T04:23:26.053 に答える