这是我必须要做的!
编写程序以执行以下步骤。
动态分配内存以存储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;
}
答案 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 << ' ';