使用 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 持有 ints。

生成和转型

std::generatestd::generate_nstd::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;
});