[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 04/24 09:47 / Filesize : 46 KB / Number-of Response : 180
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 11



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 ]
 






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<46KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef