C++でstd::listを出力します
この投稿では、印刷する方法について説明します std::list
C++で。
リストは、二重にリンクされたリストとして実装され、両方向での反復を可能にするシーケンスコンテナです。 O(1) 挿入と削除の時間。これらは通常、他の標準シーケンスコンテナ(アレイまたはvector)よりもアイテムの取得に時間がかかります。
C++でリストを印刷する方法はたくさんありますが、以下で説明します。
1.範囲ベースのforループを使用する
推奨されるアプローチは、範囲ベースのforループを使用してリストコンテナー内の要素を印刷することです。これはでのみ機能することに注意してください C++11
、および後で、 C++98
、イテレータを使用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <list> void print(std::list<std::string> const &list) { for (auto const &i: list) { std::cout << i << std::endl; } } int main() { std::list<std::string> list = { "blue", "red", "green" }; print(list); return 0; } |
出力:
blue
red
green
2.使用する std::copy
関数
もう1つのエレガントな解決策は、 std::copy
リストの内容を出力ストリーム(この場合)にコピーします std::cout
)出力イテレータの助けを借りて std::ostream_iterator
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <list> #include <algorithm> #include <iterator> void print(std::list<std::string> const &list) { std::copy(list.begin(), list.end(), std::ostream_iterator<std::string>(std::cout, "\n")); } int main() { std::list<std::string> list = { "blue", "red", "green" }; print(list); return 0; } |
出力:
blue
red
green
C++ 17では、 std::copy
と std::experimental::ostream_joiner ヘッダーで定義されています <experimental/iterator>
。これは、連続するオブジェクトをに書き込むことができるシングルパス出力イテレータです std::cout
、を使用して <<
2つのオブジェクトごとに区切り文字で区切られた演算子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <list> #include <experimental/iterator> void print(std::list<std::string> const &list) { std::copy(list.begin(), list.end(), std::experimental::make_ostream_joiner(std::cout, " ")); } int main() { std::list<std::string> list = { "blue", "red", "green" }; print(list); return 0; } |
出力:
blue
red
green
3.使用する std::for_each
関数
使用することもできます std::for_each
STLアルゴリズム。2つのイテレータによって定義された入力範囲を受け入れ、その範囲内の各要素に指定された関数を適用します。指定された関数は、単項関数、またはクラスのオブジェクトがオーバーロードしている可能性があります ()
演算子またはラムダ式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> #include <list> #include <algorithm> void print(const int &i) { std::cout << i << std::endl; } struct myclass { void operator() (int i) { std::cout << i << std::endl; } } ob; void print_list(std::list<std::string> const &list) { //ラムダ式を指定します std::for_each(list.begin(), list.end(), [](const auto &e) { std::cout << e << std::endl; }); //または関数を指定します // std::for_each(list.begin(), list.end(), print); //または、()演算子をオーバーロードするクラスのオブジェクトを渡します // std::for_each(list.begin(), list.end(), ob); } int main() { std::list<std::string> list = { "blue", "red", "green" }; print_list(list); return 0; } |
出力:
blue
red
green
4.イテレータの使用
イテレータを使用してリストを印刷することもできます。 whileループ内のリストの内容は変更しないため、 const_iterator
、によって返されます cbegin()
と cend()
。 C++ 11より前は、 begin()
と end()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <list> void print(std::list<std::string> const &list) { for (auto it = list.cbegin(); it != list.cend(); it++) { std::cout << *it << std::endl; } } int main() { std::list<std::string> list = { "blue", "red", "green" }; print(list); return 0; } |
出力:
blue
red
green
5.過負荷 <<
オペレーター
出力ストリーム(など cout
)挿入を使用する (<<)
演算子。オーバーロードしてリストオブジェクトを受け入れることができます。基本的にオーバーロードする必要があります <<
左側のostreamオブジェクトと右側のlistオブジェクトを認識する演算子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <list> std::ostream &operator<<(std::ostream &os, const std::list<std::string> &list) { for (auto const &i: list) { os << i << std::endl; } return os; } int main() { std::list<std::string> list = { "blue", "red", "green" }; std::cout << list; return 0; } |
出力:
blue
red
green
印刷については以上です std::list
C++で。