2

这是我必须做的!

编写一个程序来执行以下步骤。

动态分配内存以存储 10 个整数的数组。为每个 int 分配一个介于 1 和 100 之间的随机值。将 10 个随机 int 中的每一个复制到一个 int 向量中。打印动态分配的整数数组和整数向量,每个整数的宽度为 5,如下面的示例输出所示。

我对最后一点有意见。我的代码运行良好,但我不知道如何在整数向量中设置宽度,因此它与整数数组相同。

#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

如果你真的想用 做这个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, ' '));

这将创建一个临时对象,然后使用设置宽度的forinteger将其写出。至少在理论上,这可能会带来一些开销,但我希望(至少在启用优化的情况下)大多数编译器可能会看穿诡计(可以这么说)并消除任何额外的副本等。operator<<integer

当然,如果宽度不是具体的,您可以制作integer一个模板,并将宽度作为模板参数提供:

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

除非我真的需要使用 ostream_iterator,否则我想我会使用基于范围的for循环:

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

您的代码可以正常工作。cout << setw(5);设置宽度就好了。你也可以使用cout.width(5);.

于 2013-10-16T03:40:59.493 回答
0

由于每次使用流的宽度都会重置为 0,因此您不能使用 a std::ostream_iterator<int>(好吧,您可以使用自定义std::num_get<char>方面来恢复宽度,但这似乎有点激进)。

std::vector<int>但是,您可以像这样打印:

std::for_each(integers.begin(), integers.end(),
    [](int v){ std::cout << std::setw(5) << v <<  ' '; });
于 2013-10-16T03:44:57.940 回答