使用 iostream 打印集合
基本打印
std::ostream_iterator
允许在没有显式循环的情况下将 STL 容器的内容打印到任何输出流。std::ostream_iterator
构造函数的第二个参数设置分隔符。例如,以下代码:
std::vector<int> v = {1,2,3,4};
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ! "));
将打印
1 ! 2 ! 3 ! 4 !
隐式类型转换
std::ostream_iterator
允许隐式地转换容器的内容类型。例如,让我们调整 std::cout
来打印小数点后 3 位数的浮点值:
std::cout << std::setprecision(3);
std::fixed(std::cout);
并使用 float
实例化 std::ostream_iterator
,而包含的值仍然是 int
:
std::vector<int> v = {1,2,3,4};
std::copy(v.begin(), v.end(), std::ostream_iterator<float>(std::cout, " ! "));
所以上面的代码产生了
1.000 ! 2.000 ! 3.000 ! 4.000 !
尽管 std::vector
持有 int
s。
生成和转型
std::generate
,std::generate_n
和 std::transform
函数为动态数据操作提供了一个非常强大的工具。例如,有一个向量:
std::vector<int> v = {1,2,3,4,8,16};
我们可以轻松地为每个元素打印 x is even
语句的布尔值:
std::boolalpha(std::cout); // print booleans alphabetically
std::transform(v.begin(), v.end(), std::ostream_iterator<bool>(std::cout, " "),
[](int val) {
return (val % 2) == 0;
});
或打印平方元素:
std::transform(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "),
[](int val) {
return val * val;
});
打印 N 个以空格分隔的随机数:
const int N = 10;
std::generate_n(std::ostream_iterator<int>(std::cout, " "), N, std::rand);
数组
与阅读文本文件一节一样,几乎所有这些注意事项都可以应用于本机数组。例如,让我们从本机数组打印平方值:
int v[] = {1,2,3,4,8,16};
std::transform(v, std::end(v), std::ostream_iterator<int>(std::cout, " "),
[](int val) {
return val * val;
});