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