- 1 名前:デフォルトの名無しさん [2009/01/11(日) 11:13:44 ]
- C++標準ライブラリの一つ、STLについて。
前スレ 【C++】STL(Standard Template Library)相談室 10 pc11.2ch.net/test/read.cgi/tech/1219719677/ 過去ログ・リンク・書籍紹介は >>2 以降
- 162 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:37:20 ]
- std::list<T>をTにすればコンテナ全種に使えるようになるはず。
- 163 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:41:47 ]
- よくわからないけどこういうこと?
template<typename T> std::ostream &print(std::ostream &ost, const T &cont) { ost << "["; std::copy(cont.begin(), cont.end(), std::ostreambuf_iterator<T::value_type>(ost, ",")); ost << "]"; return ost; }
- 164 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:50:54 ]
- コンテナを取るんじゃなくて、algorithmみたいに範囲を取るようにすれ。
template<typename Iterator> std::string to_str2(Iterator first, Iterator last) { std::ostringstream oss; Iterator it = first; oss << "["; if (it != last) { while (true) { oss << (*it); ++it; if (it == last) break; oss << ", "; } } oss << "]"; return oss.str(); }
- 165 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:51:31 ]
- まぁそれだけだとlist<list<...>>みたいなのに適応できないけどな
- 166 名前:161 mailto:sage [2009/02/27(金) 23:02:22 ]
- >>162
ほんとですね、全部なおしました std::ostream& operator<<(std::ostream & rhs, const <T>& lhs)はダメなんですね 当たり前なんでしょうけど >>163 こういう書き方もできるのですね、、、 p to_str(dlist)かp 'to_str(std::list<Data, std::allocator<Data> > const&)' (dlist)でgdbから呼べるのですが、 ostreamかtemplate使うと消える?みたいなのでObject.to_string()とテンプレートではないto_str(x)は用意するので ostreamやostringstreamを極力使わずにできればなと >>164,165 Iteratorの中身がコンテナじゃなさそうな場所に使ってみます
- 167 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 00:04:03 ]
- とりあえず、rhsは right hand side(右側)の略なんだから
lhs << rhs って形にしようぜw
- 168 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 12:55:03 ]
- 関数オブジェクトにしといてfor_each()じゃだめなのか
- 169 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:45:22 ]
- >>168
それ、コードではどうやるの
- 170 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 01:25:00 ]
- こんな感じ?
template <class T> struct Out { void operator()(T& i) const { std::cout << i << ' '; } }; int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::list<int> aa(a, a + sizeof(a) / sizeof(a[0])); std::for_each(aa.begin(), aa.end(), Out<int>()); }
- 171 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 12:40:27 ]
- ostream_iteratorにassignという手も
- 172 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:04:02 ]
- 例としてよく引き合いに出されるのは ostream_iterator に copy だと思うが・・・
- 173 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:19:22 ]
- for_eachを使うと copy よりも凝った出力形式を作れるってくらいかな
- 174 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:49:02 ]
- #include <pstade/oven/io.hpp>
#include <pstade/oven/make_range.hpp> int main() { namespace oven = pstade::oven; std::list<int> l = a|oven::copied; std::cout << (oven::make_range(l)) << "\n"; }
- 175 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:08:36 ]
- >>136,143
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#92 今のドラフトでは以下の記述が追加されている。 > algorithms that take function objects as arguments are permitted to copy those function objects freely アルゴリズム内でどうコピーされるかは基本的に実装任せってことになるらしい。 for_each() の戻り値はまったく使えないことになりそうだ。
- 176 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 16:56:46 ]
- >>175
for_eachの戻りはコピーされた関数オブジェクトに内部状態が反映されてるんじゃなかった?
- 177 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:17:17 ]
- >176
関数オブジェクトに全要素を通して処理した結果の状態が保持されていることを期待するだろうが、 極端に言えば各要素の呼び出し毎に新しくコピーした関数オブジェクトを渡されたりすると、期待する 結果と異なる。 参照使うなりコピーされても大丈夫なようにはできるからまったく使えないは言い過ぎ。 とはいえ、そういう用途なら accumulate 使えばいいじゃん、とは思う。
- 178 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:22:46 ]
- boost::ref使って渡せばいいんじゃないか。boost::mpl::for_eachではうまくいった
- 179 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:23:42 ]
-
|

|