是否可以打印宽度为5的矢量内容?

时间:2013-10-16 03:37:12

标签: c++ arrays vector

这是我必须要做的!

编写程序以执行以下步骤。

动态分配内存以存储10个整数的数组。 为每个int分配1到100之间的随机值。 将10个随机整数中的每一个复制到一个整数向量中。 打印动态分配的整数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;
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

由于每次使用流时宽度都会重置为0,因此您无法使用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 <<  ' '; });

答案 2 :(得分:0)

如果确实希望使用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<<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 << ' ';