使用 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;
});