1 名前:デフォルトの名無しさん mailto:sage [2006/10/14(土) 19:20:40 ] 入門ページなど ・STLとは ttp://e-words.jp/w/STL.html; ・入門 ttp://www.jah.ne.jp/~naoyuki/Writings/STL.html ・入門,一覧,使い方 ttp://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html ・メソッド一覧 ttp://www.wakhok.ac.jp/~sumi/stl/ ・サンプルプログラム集 ttp://www.s34.co.jp/cpptechdoc/reference/stl_samples/ ・TIPS集 ttp://www.nantekotta.com/stl.html ・メルマガ(お勧め) ttp://www.kab-studio.biz/Programing/STLiostream/ ・解説 ttp://ja.wikipedia.org/wiki/Standard_Template_Library ttp://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html マルチスレッドプログラミングの時には ttp://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html STLPort www.sgi.com/tech/stl/ www.stlport.org/ STLに関する話題は『ここ』で C++に関する話題は『C++相談室』 pc8.2ch.net/test/read.cgi/tech/1159340181/ でよろしくお願いします
2 名前:デフォルトの名無しさん mailto:sage [2006/10/14(土) 19:23:15 ] とりあえず貼っとく。 pc8.2ch.net/test/read.cgi/tech/1104898734/562 562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39 "STL"なんて呼称の範囲は、C++の標準ライブラリに 取り込まれてしまった今となっては明確に区切れる物では無い。 HP STL や SGI STL のことを指して言ってるのかもしれないが、 今使われてるのはそれらをベースにしたC++標準ライブラリだ。 範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。 このスレが不要である事に疑いの余地は無い。
3 名前:デフォルトの名無しさん [2006/10/14(土) 19:28:17 ] とりあえずこちら使いきってから pc8.2ch.net/test/read.cgi/tech/1104092624/
4 名前:デフォルトの名無しさん mailto:sage [2006/10/14(土) 19:29:47 ] ・和書の紹介 STL標準講座―標準テンプレートライブラリを利用したC++プログラミング ttp://www.amazon.co.jp/gp/product/4881357786/sr=8-13/qid=1160821482/ref=sr_1_13/503-1115923-0965566?ie=UTF8&s=books STL―標準テンプレートライブラリによるC++プログラミング 第2版 ttp://www.amazon.co.jp/gp/product/4894714329/sr=8-19/qid=1160821482/ref=sr_1_19/503-1115923-0965566?ie=UTF8&s=books 標準C++:STLの基礎知識 www.amazon.co.jp/gp/product/4756138047/sr=8-29/qid=1160821588/ref=sr_1_29/503-1115923-0965566?ie=UTF8&s=books 標準講座C++―基礎からSTLを利用したプログラミングまで www.amazon.co.jp/gp/product/4881357050/sr=8-35/qid=1160821588/ref=sr_1_35/503-1115923-0965566?ie=UTF8&s=books STLによるコンポーネントデザイン www.amazon.co.jp/gp/product/475613422X/sr=8-40/qid=1160821650/ref=sr_1_40/503-1115923-0965566?ie=UTF8&s=books Effective STL―STLを効果的に使いこなす50の鉄則 www.amazon.co.jp/gp/product/4894714108/sr=8-3/qid=1160821680/ref=sr_1_3/503-1115923-0965566?ie=UTF8&s=books
5 名前:デフォルトの名無しさん mailto:sage [2006/10/14(土) 22:27:05 ] >>1 乙
6 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 17:04:15 ] 【C++】STL(Standard Template Library)相談室 5 pc8.2ch.net/test/read.cgi/tech/1143608073/ 【C++】STL(Standard Template Library)相談室 4 pc8.2ch.net/test/read.cgi/tech/1130680264/ 【C++】STL(Standard Template Library)相談室 3 pc8.2ch.net/test/read.cgi/tech/1116559700/ 【C++】STL(Standard Template Library)相談室 2 pc8.2ch.net/test/read.cgi/tech/1104898734/ 【C++】STL(Standard Template Library)相談室 pc5.2ch.net/test/read.cgi/tech/1095583235/
7 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 02:27:40 ] 質問。 連想コンテナへのinsert(i, j) (iとjは入力反復子)って、 例外安全性は強い保証?それとも基本? 規格を眺めたが言及が見つからず…
8 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 05:12:29 ] STLのスタックはC#のスタックに比べて10倍遅い。 C++はメモリのアロケートが貧弱な気がする。
9 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 06:34:32 ] >>8 どんなテストをしたの?
10 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 06:49:26 ] >7 規格とDR読み通したけれどこれは単に抜けてるだけのような
11 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 09:49:53 ] 規格で例外安全性に関する規定ってあったっけ? 無いと困るような気はするんだが、ちょっと見当たらない。
12 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 16:59:09 ] >>11 あちこちに散りばめられている。(個々の関数の解説にあったり、先頭で一斉に指定されていたり) >>8 本当にありケーとが駄目というのが原因なら、アロケータを差し替えてみるとどうだろう?
13 名前:8 mailto:sage [2006/10/16(月) 18:48:40 ] >>9 普通にforループでpushしていくだけのもの。 >>12 STLportに変えてみたら同じぐらいの速さが出た。 VC8標準のやつが遅かっただけみたい。
14 名前:8 mailto:sage [2006/10/16(月) 18:57:27 ] stackのpushよりもvectorのpush_backの方が速いとは……
15 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 19:05:33 ] >>14 特に指定しないと、stackはdequeを使って実装される。 ttp://www.wakhok.ac.jp/~sumi/stl/header/stack.html
16 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 19:05:38 ] stack はキューだかリストだか使っているからだろう。
17 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 19:42:42 ] >>13 テストしたコード晒してよ。
18 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 20:03:37 ] >>17 何粘着してんだ?
19 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 20:13:37 ] 速度比較してソース貼らずに結果だけを主張するのはおかしいだろ。
20 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 20:16:27 ] 的外れ
21 名前:デフォルトの名無しさん mailto:sage [2006/10/16(月) 20:20:58 ] >>19 >STLportに変えてみたら同じぐらいの速さが出た。 >VC8標準のやつが遅かっただけみたい。 って、8にとっての結論は出てるみたいだからそれでいいじゃん お前がどう評価するかは、それぐらい自分でベンチとれよ
22 名前:17 mailto:sage [2006/10/16(月) 20:49:07 ] 別にベンチマークがとりたいんじゃなくて、どんなコードで 比較したのかが知りたかったんだ。自分で新しく比較コード書く気は無いな。 本人が拒否するならわかるんだが、なんで他人が文句言ってくるんだ?
23 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 00:02:59 ] 確かに C# より遅いってのは屈辱的だな
24 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 00:26:05 ] Dimkumwareは糞遅いからな。
25 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 05:09:11 ] テンプレか思った
26 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 11:07:37 ] >>22 お馬鹿さんの不思議ルールを理解しようとしても無駄。
27 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 11:17:39 ] int main(int argc, char * argv[]) { boost::numeric::ublas::vector<float > vec(2); vec(0)=1.0;vec(1)=2.0; boost::function1< float,boost::numeric::ublas::vector<float> > norm_2Functor = &boost::numeric::ublas::norm_2<boost::numeric::ublas::vector<float> >; float out= norm_2Functor(vec) ; } 想定外のメモリーを参照しました で落ちる。何が悪いのだろう。
28 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 12:56:57 ] >>22 ここにいること自体時間の無駄。
29 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 17:34:25 ] >>27 誘導。 pc8.2ch.net/test/read.cgi/tech/1158991211/
30 名前:デフォルトの名無しさん [2006/10/18(水) 01:46:19 ] listについて質問です。 erase()で、イテレータで指定した位置の要素を消せますが、 消した後このイテレータは有効なのでしょうか?無効なのでしょうか?
31 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 01:50:23 ] つ i++
32 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 02:06:49 ] >>30 無効 >>31 エスパー乙
33 名前:デフォルトの名無しさん [2006/10/18(水) 02:38:20 ] ということは、erase(it)のあと、it++などとやったらいけないのですか?
34 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 02:40:01 ] >>33 うん。ダメ。だから erase(it++) という話で >>31 に行く。
35 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 02:56:03 ] エスパー過ぎたなww
36 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 07:45:42 ] これってシュール? vector<mydata*> * vec; vec = new vector<mydata*>(); delete vec;
37 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 07:49:32 ] ベンチしたらVC標準の方がSTLportより速かったぞ。
38 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 09:28:17 ] >>34 vectorの場合を考えて普通eraseの戻り値使わない?
39 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 10:57:06 ] >>38 >>30 はlistと言っているがシーケンスコンテナとは言っていない。
40 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 13:12:21 ] 便乗して質問なんですが、 std::vectorのeraseしたときの要素削除で 実際にヒープ開放しないように指定することは不可能? 頻繁に数が変動する場合、自分で制御した方がいいんでしょうか
41 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 13:39:39 ] vectorは確保した領域をいちいち開放しないんじゃないの? resize()でサイズを小さくしても領域は開放されないとか書かれていたけど。
42 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 14:15:19 ] >>40 std::remove
43 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 21:21:04 ] >>40 std::deque
44 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 00:38:06 ] struct Data { int id; (他にもいろいろ) }; std::vector<Data*> dataSet; にid順にpush_backで詰め込んであります。 bool Compare( const Data* p, const int v) { return (p->id < v); } int id = 探すid番号; std::vector<Data*>::iterator it = std::lower_bound( dataSet.begin(), dataSet.end(), index, Compare); で、find_ifより高速に検索ができるかと思ったのですが、 vc8では lower_bound内で Compare( int, Data*)が必要らしく コンパイルが通りません。Compare( int, Data*)を定義すると どちらのCompareなのかあいまいだと言われてます。 解決方法を教えてください。
45 名前:デフォルトの名無しさん [2006/10/19(木) 00:44:38 ] >>44 struct compare{ static bool operator()(const Data* p,int v){return p->id<v;} static bool operator()(int v,const Data* p){return v<p->id;} }; を定義してCompareの代わりにcompare()を渡せばいい。
46 名前:44 mailto:sage [2006/10/19(木) 01:51:22 ] >>45 コンパイルを通すには、 Data<int, int<Dataだけでなく、Data<Dataも必要でした。 ありがとうございました。 operator()を3つ定義するならoperator<を3つ定義して lower_bound(start,end, 値);でも結局、手間は同じなのかも?
47 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 20:56:10 ] 以下のコードでコメントアウトしてあるdelete dの部分なんですが コメントにすればメモリリーク コメントにしなければvectorにデータが入らない こういった場合どうすればよいのでしょうか #include <iostream> #include <vector> using namespace std; struct data{int i;}; struct my{ vector<data*> dat; void add(){data* d = new data(); d->i=10; dat.push_back(d); //delete d; //コメント外すとvectorにデータが入らない } void p(){for(int i=0;i<dat.size();++i){cout << dat[i]->i << endl;}} }; int main(){ my m; m.add(); m.p(); return 0; }
48 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 21:24:39 ] >>47 myのデストラクタでdatの要素全てdeleteするか、boost::ptr_vectorを使う。
49 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 21:25:39 ] あ、あとvectorの要素をdataそのものにする。
50 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 21:30:05 ] data の要素が int 程度なら vector<int> を使う
51 名前:47 mailto:sage [2006/10/20(金) 21:33:05 ] >>48 ,49 回答ありがとうございます >myのデストラクタでdatの要素全てdelete あ!つい、自動的にやってくれるもんだと思ってた vectorはポインタの中身の削除には感知しないんでしたね 要素をdataにするほうは派生クラスのポインタも入れたりするので 今回は>>48 のほうで頑張ってみます 行き詰ってましたがこれで何とか先に進めそうです 助かりました!
52 名前:47 mailto:sage [2006/10/20(金) 21:36:36 ] >>50 補足どうもです 小さいデータでは直接intのほうがよさそうですね 47のコードは状況を再現する最小コードで 実際はもうちょっと複雑なデータ構造になっています
53 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 23:10:47 ] 本当にint型のメンバ1つでも、intそのままよりtypedefの方が良いと思う。
54 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 23:31:43 ] >>53 つまりこうか? template <typename T> struct data{ typedef T value_type; T i; }; と定義して、 typedef int HogeType; とtypedefして、 my<HogeType> m; と使う、と。
55 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 23:56:45 ] >>54 typedef struct { int i; }data; dataに別の変数を付け足したくなった時に便利。ってことじゃないか
56 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 07:39:05 ] いや、単にtypedef int data;のつもりだったんだが。
57 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 21:05:46 ] boost関係もここ?
58 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 21:12:56 ] pc8.2ch.net/test/read.cgi/tech/1158991211/ ここかな
59 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 18:31:51 ] vectorの削除について質問です remove(v.begin(),v.end(),1)みたいなのだと要素数は減らず eraseと組み合わせたら要素数も減る v.clear()だと要素数は0になるんですよね それでは要素数はそのままで、 vectorの中身を全部削除(適切な言葉がわからない) するにはどうしたらいいのでしょうか remove(v.begin(),v.end(),?)
60 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 18:40:39 ] >>59 いったい何がしたいんだ?
61 名前:59 mailto:sage [2006/10/22(日) 18:49:20 ] >>60 vectorをキャッシュみたいに利用できないかと考えたんです v.begin()〜v.end()の内容をあるときに全部他に書き出して v.begin()〜v.end()を初期化して再利用 この時、clear()を呼んで初期化すると 確保したメモリも削除されるので勿体ないかなと
62 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 18:52:25 ] >>61 何が勿体ないのかわからんが、 vector には reserve() があるんで、 clear() でメモリを解放する実装は考えられない。
63 名前:59 mailto:sage [2006/10/22(日) 18:59:16 ] >>62 すみません、どうやら勘違いしてたみたいです^^; clear()で行こうと思います、失礼しました
64 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 21:20:17 ] メモリ解放するときはreserve(0)? 明示的破棄は不可能なんでしょうか?
65 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 21:23:51 ] >64 std::vector< int >().swap(v);
66 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 21:32:35 ] >>65 見た感じヤバイ印象を受けるのですが スタンダードなやり方なんですか?
67 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 21:41:54 ] >66 >見た感じヤバイ印象を受けるのですが あなたは仕様やドキュメントではなくて見た感じの印象でコードの可否を決めるの? >スタンダードなやり方なんですか? 何をもってスタンダードとするかは分からないけれど swapイディオムというよく使われる方法の延長
68 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 21:47:08 ] >>66 vector* でも持って new/delete すれば確実だろう。
69 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 23:21:01 ] >>67 初めて見るコードでイディオムっていうのを知らなくて。 無知ですみません。勉強になりました。
70 名前:デフォルトの名無しさん [2006/10/23(月) 00:01:07 ] vectorが合ったら配列っていらないような気がするけど、必要なの?
71 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 00:11:17 ] >>70 C との互換性のためには必要。文字列リテラルも配列型だしね。 動的確保を必要としないという点も見逃せない。
72 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 00:12:54 ] 固定長配列の需要もなくなりはしないよ。
73 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 00:15:30 ] boost::array, std::tr1::array でほとんど置き換えることは可能なんだろうけど、 やっぱり不要ってことにはならないだろうねぇ。
74 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 00:32:44 ] >73 それらの実装に固定長配列が要るだろ。 まあそれを言ったらstd::vectorの実装にnew []が必要とかそういう次元の話になってしまうが。
75 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 01:05:04 ] でも、配列を使う機会は減りそうだな。
76 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 02:56:25 ] 配列がなかったらvectorもなくなるじゃん
77 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 05:24:39 ] mallocとポインタで何とか
78 名前:デフォルトの名無しさん [2006/10/23(月) 21:43:06 ] std::vectorに、at()という関数が見つかりません。 VisualC++だとあるのですが、gccにはありませんでした。 これは標準の関数ではないのでしょうか?
79 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 21:45:56 BE:29954232-2BP(204)] 0xcc.net/blog/archives/000137.html この表で、c++のjoinが無しになってるけど、vector<string>とかlist<string>に、 ほかのアルゴリズムを組み合わせればできるよね?
80 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 21:53:42 ] join は難しいんじゃない?
81 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 22:12:52 ] #include <vector> #include <numeric> #include <string> std::vector<std::string> v; v.push_back("test"); v.push_back("orange"); v.push_back("apple"); std::string s; s = std::accumulate(v.begin(), v.end(), std::string()); printf("[%s]\n", s.c_str()); これでいいのかしら?
82 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 22:19:07 ] あ、joinは単に結合するだけじゃなくてセパレータがいるのか… transformもつけると意味が変わりそうな気もするし
83 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 22:31:59 BE:149769465-2BP(204)] chopもpythonのs[0:-1]がOKなら、C++でも、なにか書き方がありそうな気がする。
84 名前:デフォルトの名無しさん [2006/10/23(月) 22:32:54 ] vectorで2次元配列を作るとして、 イテレータで[]演算子を使ってアクセスすることはできますか? at()だと、下記の書き方でうまくいくのですが…範囲チェックの分のコストが惜しいので できるだけ[]演算子でアクセスしたいのです。 vector<vector<int> > v; for( vector<vector<int> >::iterator i=v.begin(); i != v.end(); i++ ) { i->at( 0 ) = 1; }
85 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 22:34:31 ] これならいける? #include <boost/lambda/lambda.hpp> namespace bll = boost::lambda; std::string s = std::accumulate( v.begin(), v.end(), std::string(), _1 + bll::make_const(", ") + _2 );
86 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:04:26 ] >>84 (*i)[0] = 1;
87 名前:デフォルトの名無しさん [2006/10/23(月) 23:29:50 ] STL使うと容量が増えている気がするんですが、気のせいでしょうか?
88 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:31:37 ] >>87 ファイルサイズ見ろ。
89 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:33:01 ] >>87 ガイシュツ C++相談室 part53 pc8.2ch.net/test/read.cgi/tech/1159340181/12
90 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:35:32 ] >>78 標準。 GCCにないわけがない。なにか古い版か?
91 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 00:12:09 ] >>86 ありがとうございます。
92 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 01:46:08 ] >>78 STLportでも入れろハゲ。
93 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 15:35:52 ] STLをjavadoc形式で表したいんですけど、参考になるサイトとかないですか?
94 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 18:21:15 ] >>93 STLをjavadoc形式で表すってどういうことか説明してみそ
95 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 19:01:07 ] エスパー的にDoxygenはどうだ?
96 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 19:13:02 ] doxygenを使おうとは思ってたのでインストールはしています…あと一応eclipseも とりあえずSTLのどれからでもいいんでドキュメント化したかったんですけど STLのソースに書き込むの難しそうだったんで そういうの補足してくれてるサイトとかあったら教えてほしかったんですけど…
97 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 19:23:48 ] >>96 gcc付属のSTLだったらlibstdc++をdoxygenに掛けたのが gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html とかにある
98 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 03:14:21 ] STLくらいメジャーなものだったら本やネットで公開されてる マニュアルのほうが完成度が高い
99 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 07:49:08 ] g++3.4.5 stdc++ のrandom_shuffle() の実装なんですけど > for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) > std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1))); なんかビミョー?
100 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 10:17:44 ] template<typename MANY_FLOAT > class MyContainer { MANY_FLOAT &data_; MyContainer(TWO_FLOAT &_data_ ):(data_(_data_)) }; float _data_[100]; MyContainer myContainer(_data_); MANY_FLOAT に float*nの大きさを指定してn個飛ばしでdataにアクセスしたい。 MANY_FLOATにはどんなクラスを指定すればいいのでしょうか
101 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 10:23:03 ] >>100 typename 引数で「大きさを指定」するのか? 「n個飛ばし」って何だ? TWO_FLOAT って何? MyContainer のコンストラクタ、コンパイルできないだろ。 MyContainer はテンプレートなのに、 myContainer の 宣言ではテンプレート引数が指定されていない。 質問を整理して、コンパイルできるコード貼ってくれ。
102 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 12:57:11 ] >>99 上手いコードとはいえないな。
103 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 14:03:14 ] _firstと_lastが同じでも大丈夫なんだろうか
104 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 14:08:18 ] >>99 コンテナが空の場合のチェックは引用してないとこでやってるの? ロジックはいいんじゃないの?ちゃんと確かめてないけど ray.sakura.ne.jp/tips/shaffle.html
105 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 15:00:52 ] rand()%Xがイマイチ
106 名前:100 mailto:sage [2006/10/25(水) 16:45:39 ] 自己解決 tinyvecorってこういうとき使うものなのね
107 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 19:29:40 ] ASL sourceforge.net/projects/adobe-source/ 使ってる人いますか?
108 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 00:17:55 ] vectorで型の違う2次元配列をtransform()を使って変換したいんですが、 どういう風に書けばいいでしょうか?
109 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 00:23:52 ] >>104 > コンテナが空の場合のチェックは引用してないとこでやってるの? たぶんそう。漏れの手元にあるのはgcc-3.4.6付属版だけど、全文はこう。 gcc-4.1.1も同じだった。 template<typename _RandomAccessIterator> inline void random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) { // concept requirements __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< _RandomAccessIterator>) __glibcxx_requires_valid_range(__first, __last); if (__first != __last) for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1))); } やっぱ rand() % X がなー。質にも値の範囲にも問題あるんじゃ? 気になるなら random_shuffle(first, last, op) 使えって感じか。 あと、inlineついてるのね。
110 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 00:29:23 ] >>108 どういう風に書いてうまくいかなかったのか?
111 名前:108 mailto:sage [2006/10/26(木) 00:51:11 ] すみません、自己解決しました。 vector<vector<T> > v1( 10, 10 ); vector<vector<X> > v2( 10, 10 ); vector<vector<T> >::iterator i=v1.begin(); vector<vector<X> >::iterator j=v2.begin(); for( ; i != v1.end(); i++ ) { transform( i->begin(), i->end(), j->begin(), convert<T, X>() ); } の記述で通りました
112 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 23:12:04 ] VineLinux3.2で、libstdc++3.3.6だとワイド文字周りが正常でなかっ た為synapticからSTLPort(4.6.2)をインストールしました。 ライブラリが/usr/libに、ヘッダーが/usr/include/stlportにインス トールされました。 試しに #include <iostream> #include <locale> using namespace std; int main() { locale::global(locale("japanese")); } を g++ main.cpp -I/usr/include/stlport -lstlport_gcc でコンパイルして実行したところ、何故かアボート。 何か間違ってますか?
113 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 23:39:39 ] スレ違いのような気がしなくもないけれど。 単にstd::locale::global(std::locale(""));だとどう?
114 名前:デフォルトの名無しさん [2006/11/01(水) 01:11:12 ] locale("C");ならアボートしませんけど、locale("japanese") でダメっつーのは、いかんのでは?
115 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 01:38:22 ] >>112 locale のコンストラクタが例外を投げることになってるんで、こうしてみると #include <iostream> #include <locale> #include <exception> int main() { using namespace std; try { locale::global(locale("japanese")); return EXIT_SUCCESS; } catch (exception const& e) { cerr << e.what() << endl; return EXIT_FAILURE; } } cygwin g++ 3.4.4 だと↓のようになった。 locale::facet::_S_create_c_locale name not valid
116 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 01:53:14 ] >>114 locale文字列は"C"と""以外処理系定義のはず。
117 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 08:13:54 ] >>109 Working Draftにそもそもこう書いてあるから、別にgccのせいじゃないだろ。 25.2.11 Random shuffle [lib.alg.random.shuffle] 4 Remarks: The underlying source of random numbers for the first form of the function is implementation-defined. An implementation may use the rand function from the standard C library. 実装依存なんだから結局 >気になるなら random_shuffle(first, last, op) 使えって感じか。 だな
118 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 08:31:02 ] working draftで語るのはどうかな… ISO/IEC14882 みて語ろうぜ。
119 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 09:05:28 ] >>117 >別にgccのせいじゃないだろ。 単に出典を示しただけだろ。着眼点がずれてるよ。 俺が使ってるSTLportも似たようなもんだった。
120 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 14:18:04 ] そもそもrand()の性能がよければ問題無いつー話では? rand()%X より rand()*X/RAND_MAXのほうがいいとかはあるかも知らんが.
121 名前:120 mailto:sage [2006/11/01(水) 14:19:28 ] あ、計算違ってるかも RAND_MAX じゃなくて (RAND_MAX+1)?
122 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 16:04:12 ] >>117 「std::rand使うかも」まで書いてあるのね。参考になった、さんくす。 >>119 STLportの4.6.2と5.0RC2を見てみた。どっちのバージョンでもまったく同じ。 if (__first == __last) return; for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) iter_swap(__i, __first + __random_number((__i - __first) + 1)); __random_number は "rand() % X" と "lrand48() % X" のどちらか。マクロ切替。 >>120 確かに。実装で自由に定義していいんだから、 変に凝らずrandまかせで済ませるってことか。 >>121 RAND_MAX+1はinteger overflowになるかもよ。(実装定義だけど)
123 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 16:43:25 ] ISよりWCの方を参考にするのかw
124 名前:123 mailto:sage [2006/11/01(水) 16:45:17 ] ミスったWDだww
125 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 16:57:49 ] typedef list< pair<string, string> > PairList; PairList l; (略) it = lower_bound(l.begin(), l.end(), "text", cp()); 上記コードで、textとpairのfirstで比較を行いたいのですが、 Compareオブジェクトはどのようなものを作れば良いのでしょうか? struct compare { bool operator()(PairList::value_type v, string s); bool operator()(string s, PairList::value_type v); }; ではコンパイルが通りません。
126 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 18:17:35 ] たぶん string -> string const& PairList::value_type -> PairList::value_type const&
127 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 01:05:40 ] >>123 IS と WD はそんなに違わない。むしろ WD のほうが修正が進んでいる面もある。 そして IS は買わないといけないが WD はダウンロードできる。
128 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 01:06:49 ] >>125 エラーメッセージは?
129 名前:123 mailto:sage [2006/11/02(木) 06:07:36 ] >>127 屁理屈乙
130 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 10:47:48 ] >>129 ISO の営業担当の方ですか?
131 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 12:07:48 ] 言い訳すればするほど墓穴
132 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 12:19:22 ] STL学習し始めたばかりの初心者なんですが コンテナvectorのソースコードってどうやったら見れますか?
133 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 12:52:51 ] 普通にファイル開けば
134 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 13:00:08 ] ドライブのどこにあるのか分からなかったのでvectorで検索かけたんですけど 同じファイルが3つくらい引っかかって、しかもテキストで開いたら文字化け気味だったので…
135 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 13:03:13 ] >>132 www.google.co.jp/search?q=stl%5fvector%2eh
136 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 13:05:12 ] >>135 すみません、わざわざありがとうございます すごく助かりました!
137 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 18:34:46 ] namespace detail { } ってどういう時に使うの?
138 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 18:49:07 ] >>137 詳細を別の名前空間に分けておきたいとき。
139 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 11:50:23 ] >>137 スレ違いに気付かない程度の人には関係ありません。
140 名前:デフォルトの名無しさん [2006/11/04(土) 13:37:59 ] iteratorを適当に与えると行の始まりまで移動させる関数をかいたのですが std::reverse_iterator(STLport4.6.2 5.0.2) のバグと思われる実装が原因でうまく動きません。 STLport-4.6.2/stlport/_iterator.hの77行目からのoperator*なのですが _Iterator __tmp = current; return *--__tmp; となっていてデクリメントするのは間違いだと思います。 return *__tmp; とすると私の関数は希望どうり動くのですがどのような意図でしょうか? かいた関数は以下のとおりです template<class It>It& begin_line(It& it, typename It::value_type nl='\n') { typedef std::reverse_iterator<It> rit_t; for(rit_t rtmp(it); rtmp != rit_t() && (*rtmp != nl); ++rtmp) { it = rtmp.base(); } return it; }
141 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 14:31:29 ] >>140 最後の要素の次を参照する end() で reverse_iterator を初期化したとき、 最後の要素を参照しなければならない。
142 名前:140 mailto:sage [2006/11/04(土) 15:40:21 ] endで初期化したならreverse_iterator的にもendだと思っていました ありがとうございました
143 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 18:10:11 ] >>140 > rtmp != rit_t() この条件何?
144 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 18:31:14 ] 実は引数が一番最初の行でbeginとかより前に行ったときループから抜けれるようにじゃね?
145 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 18:58:53 ] でも実際はこれじゃダメだよね?
146 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 19:07:09 ] >>145 reverse_iteratorから呼び出されるであろう140によるIt::operator==とかの実装によるとしかいいようがない
147 名前:デフォルトの名無しさん mailto:sage [2006/11/12(日) 12:09:23 ] STLがMT safeかどうかどうしたら分かりますか?
148 名前:デフォルトの名無しさん mailto:sage [2006/11/12(日) 12:24:44 ] ベンダーに問い合わせる。
149 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 15:14:33 ] 2次元のvectorをサイズを指定して作成する方法を教えてください。
150 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 15:19:34 ] >>149 vector< vector<Type> > v(n, vector<Type>(m))
151 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 15:42:08 ] ありがとうございます。 2次元はうまくいったのですが、3次元に拡張しようとしたところうまくいきません。 vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n))) と書いたのですが、どこが間違えているのでしょうか?
152 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 16:16:37 ] vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n))) ↑ここがまずいのでは vector< vector < vector<Type> > > v(n, vector<vector<Type> >(m, vector<Type>(n)))
153 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 04:50:46 ] algorithmのstd::copyって例外安全ですか?
154 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 07:59:02 ] いいえ
155 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 16:00:32 ] >algorithmのstd::copyって例外安全ですか? という質問もおかしいし >いいえ という回答もおかしい
156 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 16:07:15 ] >>155 何がおかしいのか言わない君の方が芥。
157 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 10:42:44 ] ド素人の俺が勘で答えてみると、 ・実装による ・使うコンテナによる
158 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 11:08:29 ] 基本的には以下が必要 ・イテレータの前進・比較・間接参照・コピーコンストラクタ・デストラクタが例外を発生させない ・要素の代入・デストラクタが例外を発生させない ってとこかね。 コピーを巻き戻しできないので処理中に例外が発生したらあぼんぬ。
159 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 01:13:25 ] >>157 規格ってのがあるだろ。 実装によるなら一般的にはスレッドセーフでないことになる。 使うコンテナによるならやっぱりスレッドセーフでないことになるだろ。 =====>スレッドセーフでない。 GCCの実装を見る限りではスレッドセーフでなないな。 ただコンテナの代入演算子を使ってるだけ。 コピー作ってスワップってのはしてない。
160 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 01:26:53 ] スレッド?
161 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 08:38:12 ] >>158 それは「例外安全ではない」ではなくて、「基本的な例外安全」が保証されている状況
162 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 12:13:17 ] C++ 標準規格としては std::copy というか, uninitialized 系を除く アルゴリズムの例外安全性に関しては何も規定していない…… んですが,あくまで一般的な実装の話として std::copy は, iterator の value_type のコピー代入が strong guarantee を保持していることを (唯一の) 型に対する要件とした上で, basic guarantee を達成する,という説明になるんじゃないでしょうか? iterator の各操作が例外を投入しうる場合でも basic guarantee は達成すると思います.
163 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 21:31:53 ] vectorについて質問なんですが struct kobunrui{ public: std::string itemname; int kosuu; } struct daibunrui{ public: std::string bunruimei; kobunrui itemsyousai; }; 大分類についてはpush_backで追加できるのですが 大分類1個の中の小分類を追加するのは、どのようにすればいいのでしょうか? また大分類1個の中の小分類の数の取得はどのようにすればいいのでしょうか?
164 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 22:10:18 ] >>163 例えば要素0個目なら v[0].itemsyousai = kobunrui_hensuu;
165 名前:デフォルトの名無しさん [2006/11/17(金) 22:11:04 ] >>163 意味が判らん。 daibunruiはkobunruiのインスタンスを一個だけ持つっていう仕様 なのにそれを追加なんてできる訳ねーだろ。 struct daibunrui { public std::string bunruimei; std::vector<kobunrui> itemsyousai; }; に直せ。 daibunrui instance; size_t index(3); int kosuu = instance.itemsyousai[index].kosuu; で小分類の数の取得ができる。 取り敢えずオブジェクト指向がまるで理解できてないみたいだから もっと勉強しろ。
166 名前:163 mailto:sage [2006/11/18(土) 02:43:52 ] >>164 >>165 std::vector<kobunrui> itemsyousai; }; に直せ。で,できました ありがとう。
167 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 03:02:51 ] オブジェクト指向とは関係ねえ ただのコンテナの問題だ
168 名前:デフォルトの名無しさん [2006/11/18(土) 03:36:01 ] >>167 クラス設計や質問内容見りゃあオブジェクト指向がまるで理解できてない ことぐらい直ぐ判かんだろカス。
169 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 03:39:40 ] しつこいな 何か癪に触る事でもいいましたっけ
170 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 22:22:59 ] っ 旦~
171 名前:デフォルトの名無しさん [2006/11/21(火) 09:15:51 ] STL初心者です #define containtype list //#define containtype deque class test { containtype m_buffer; }; こんな感じで互換性のあるクラスを切り替えて使えるコードを 書きたいのですが、どうやってそれを実現するのが良いのでしょうか? ご教示くださいませ よろしくお願いします。
172 名前:デフォルトの名無しさん mailto:sage [2006/11/21(火) 10:24:58 ] >>171 class test { typedef list<T> buffer_type; //typedef deque<T> buffer_type; buffer_type m_buffer; };
173 名前:デフォルトの名無しさん mailto:sage [2006/11/22(水) 06:51:19 ] >>172 ありがとうございます!
174 名前:デフォルトの名無しさん [2006/11/23(木) 20:26:55 ] イテレータのループをまわす時に継続条件として it != last と比較するのはなぜなんでしょうか it < last にしない理由がよくわかりません 「同じモノを指しているかどうか比較できる」が 「イテレータの大小比較はできない」パターンがあるという事でしょうか
175 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 20:28:21 ] はい。
176 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 20:33:07 ] 一番判りやすい例は、双方向リンクリストでポインタの大小関係は あくまでメモリ上の位置だけでリストの順番とは無関係
177 名前:174 mailto:sage [2006/11/23(木) 20:36:53 ] >>175 >>176 そういわれればそうですね 配列やvectorしか頭になかった・・・ リンクリストのイテレータ比較しても意味ないですね
178 名前:初心者 mailto:sage [2006/11/23(木) 23:37:51 ] こんにちは。質問です。STLというのはどこでDLできるのでしょうか。 なるべく粗相のないよう簡潔にお答え願います。 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を するように。
179 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 23:38:52 ] >>178 朝鮮人は祖国に帰れ!
180 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 23:42:26 ] こっちにも来たのかww 20世紀梨キャラメル吹いた
181 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 00:06:41 ] >>178 STLport stlport.sourceforge.net/
182 名前:デフォルトの名無しさん mailto:sage釣りだよね? [2006/11/24(金) 00:34:36 ] >>178 現在の標準C++に準拠した処理系にはもれなく付いてくる。 付いてこないようであれば、そんな処理系窓から投げて捨ててしまえ。 勿論、質が問題になることはあるが。
183 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 19:42:41 ] >>178 (´・ω・`) n ⌒`γ´⌒`ヽ( E) ( .人 .人 γ ノ ミ(こノこノ `ー´ )にノこ(
184 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 21:57:15 ] >>178 また○u○ak○b○か
185 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 00:32:14 ] いいえ、K○s○○a○eではありません。
186 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 02:09:48 ] そういうことにしておきたいんですね :-)
187 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 03:24:25 ] と言うことにしておいたうえでこの狸うるさい上に粘着なんてイラネ
188 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 03:44:01 ] >>187 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を するように。
189 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 04:03:49 ] うざいんであぼーんした
190 名前:デフォルトの名無しさん [2006/11/26(日) 03:02:39 ] 任意の構造体を格納できるリングバッファを作ろうと考えています。 2つのスレッドがあって、一方が任意の構造体データを追加し、他方が取得します。 取得が遅いためにバッファが一杯になった場合、追加側はブロックさせたいと思います。 スレッドの排他やブロックおよびブロックの解除を実装する必要はあると思いますが リングバッファくらいならSTLにあるような気がしていて、あるならそれを使って実装しようと考えてます。 STLで任意の構造体をリングバッファに納めるコンテナはありますか? また速度は(自作するよりは)高速でしょうか?(主観でOKです。)
191 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 03:06:49 ] >>190 deque または queue で済むんじゃないかな?
192 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 03:13:21 ] >>191 ありがとうございます。早速調べてみます。
193 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 16:05:30 ] STLの入門用サイトって需要あると思いますか?
194 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 16:09:31 ] >>193 もうたくさんあるから、要らないと思う。不正確な内容のものも多いけど、 正確さを求めるならリファレンスっぽいやつや、規格を見るし。
195 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 16:44:43 ] >>194 そっか、勉強がてらに書いてみようと思ったんだけど
196 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 17:38:36 ] >>195 そういう目的があるんなら、書いたらいい。 突っ込みとそれに対する改良を重ねる前提で公開するというのは 新しいかもしれない。
197 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 20:39:59 ] stl wiki japanese
198 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 21:37:47 ] STLはできて結構時間たってるが まったく枯れてないのでやる価値はある 書籍もSGI STL前提なのでどれも古くなっている
199 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 22:24:58 ] 後々の発展的な内容としてboost::bindくらいはあってもいいと思う。TR1にも入っているし。 197案のwikiをやるならSTLに限らず標準ライブラリ全てを対象にしてほしい。
200 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 11:10:03 ] >標準ライブラリ全てを対象にしてほしい。 禿同。
201 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 16:36:21 ] localeとか系統立てた解説ないしな…
202 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 16:46:39 ] localeの解説は欲しいな
203 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 20:03:37 ] Rogue Wave のユーザーズガイドにあるじゃん
204 名前:デフォルトの名無しさん [2006/11/27(月) 22:46:51 ] std::strstream みたいなストリームクラスで、std::string みたいに可変長のバッファを取り扱えるものはないですか? 内部でバッファを持っていて、データを書き込むたびに、バッファが足りなくなったら確保してくれる・・・みたいなやつです。
205 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 23:00:19 ] std::stringstream
206 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 00:28:34 ] >>205 調べてみます、ありがとうございました!
207 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 01:08:38 ] みんなでwikiらない?
208 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 01:15:19 ] Wiki(゚听)イラネ STLの本を2冊も買えば十分じゃないか
209 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:05:28 ] 仕様書嫁。それ以外の多くの文献は、あてにならん。 もちろんあてになるものを作ろうという動きは面白いと思うが、 Wiki は情報の信頼性が低下する傾向にあるので、俺は好かん。
210 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 03:37:07 ] 俺はあっていいと思う。 既刊の書籍があれば誰にとっても十分とは思わないし、 単なるまとめサイトとしてだけでも価値を持ち得る。
211 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 08:08:05 ] >>210 じゃあお前が作れ
212 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 08:24:27 ] 何かやる気があるなら、先に cppreference の日本語訳を最新にしてくれ。
213 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 09:24:43 ] www.cc.nao.ac.jp/fsunman/LANG/japanese/C++/index.html でいいだろ。google でグぐるとトップにくるくらいだ。
214 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 12:53:46 ] >>204 ostringstream は?
215 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 12:55:42 ] >>214 >>205
216 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 15:36:02 ] いつからストリームI/OがSTLになったんだ。
217 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 16:26:56 ] 最近 STL がなんだかがっくりしているように見えてきた
218 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 16:45:08 ] 長い髪が、こう、顔の前にブァサっと来てる感じか。貞子風に。
219 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 17:20:06 ] >>217-218 てめぇらゆるさねぇ。 そう見えるようになっちまった。
220 名前:デフォルトの名無しさん [2006/11/28(火) 19:06:05 ] xstringについて質問なんですが、 Vc7\includeの下とVc7\crt\srcの両方にあるんですが、 現在、私のプログラムでこの二つを勝手気ままに呼び出しててえらいことになってます。 どちらか一方だけを呼ぶことってできるのでしょうか?
221 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 23:28:08 ] vc7\crt\srcをincludeに含めてるってこと? アホか
222 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 23:37:37 ] あるソースでは #include <Vc7\include\xstring> になってて、別のでは #include <Vc7\crt\src\xstring> ってなってるとか?
223 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 23:50:15 ] ワロスw まさかとは思うがそれなら自分で変更しろよww
224 名前:初心者 mailto:sage [2006/11/29(水) 01:40:11 ] 質問です。Standaado Tenplate Libraryを使って作りたいのですがどうすればよいのでしょうか? 注:現在、私は公私ともに多忙を極め、スレを見ることが困難な状況です。 しかしその中でも何とか時間を作り、このスレに出向いて質問をしています。 そのような貴重な質問者に対し、1行レス、煽り、罵倒で返す愚か者がいるようですが 私のような質問者がいなければそもそもあなたたちの知識をひけらかす場が 存在しないことをよく認識し、身の程をわきまえるべきであります。 よって、私のような貴重な質問者に対し、見下した回答、儀礼を欠いた回答 (例:質問してくれてありがとうございました等のお礼がない、である調で答える、 様をつけない、w等の意味不明な言葉を発する)を禁止いたします。 ましてや自分の立場もわきまえず逆にお礼を強要したり、各人の目に触れやすくなるよう 多数のレスに同様の質問をしているのを「マルチポスト」呼ばわりするような輩は 当然加害対象として私のリストに載ることになります(賢い方は意味がおわかりでしょう) この規則は2chの精神にものっとっており、強制的に施行されます。もし違反した場合には 2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には 2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置 を取らせていただきます。また、形式的にはちゃんとした回答であっても、知識不足のため 不正確な知識を回答することも禁止いたします。よく考え、よく調べ、正確な回答を するように心がけましょう。なお、当方が質問に対し多少は役に立つと判断した場合は それなりに評価するのでご安心下さい。なお、確認はこの啓蒙文を読んでいることを 前提としており、読んでいない、理解できない等のいいわけは一切通用しません。 また、有識ある諸君は今後自分の発言に対しこの啓蒙文をコピペすることが義務になります。
225 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 01:43:01 ] あぼーんした
226 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 01:46:40 ] >>225 でましたね。啓蒙文にしっかり書いておいたのにこういう輩が。 おそらく私に対抗しうる人物は国家権力を使えるということでしょうが こちらは世界権力を行使できる立場にいます。 国連をご存じでしょうか?そう、あのアメリカさえも畏れる恐怖の世界組織です。 私はそこと内通しており、今回のような自体には世界権力の行使も辞さない構えです。
227 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 01:50:36 ] おいおい、深夜にわらかすなよw
228 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 01:57:29 ] >>226 あぼーんした
229 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 02:06:29 ] マジレスすると、Standaado Tenplate Libraryというものは未だこの世に存在しないはず。 少なくとも俺は聞いたことが無い。知っている奴は是非とも名乗りを上げてくれ。 さて、存在しないということはこれから作られるということだ。 つまり、224が自分の思い通りに描けば、それがStandaado Tenplate Libraryになる。 それが芸術というものではないだろうか。
230 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 02:13:42 ] 正直面白いwwww
231 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:17:10 ] >>224 >2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には >2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから >FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置 >を取らせていただきます 通報しました。
232 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 12:31:08 ] 229のマジレスに惚れた
233 名前:デフォルトの名無しさん [2006/12/01(金) 07:55:16 ] STL語ろよ
234 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 06:01:13 ] STLゴロよ 最近はそんな商売もあるのか。
235 名前:デフォルトの名無しさん [2006/12/03(日) 11:48:02 ] テンプレートのインスタンス化結果を ソースレベルで表示できるコンパイラってありますか? template<typename T> void foo(T arg){ cout << T; } foo<int>(50); を void foo(int arg){ cout << arg; } に展開してくれる様な この機能があればテンプレート絡みの意味不明なコンパイルエラー の修正が、かなり楽になりそうなんですが・・・
236 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 12:15:29 ] VC8のエラー表示は十分分かりやすいと思うけど 普段使ってるコンパイラはどんなエラー表示を出すの?
237 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 13:12:32 ] >>235 の質問にはそんなコンパイラ知らないだけど、テンプレートのエラーで悩むくらいならいっそ使うのやめたほうがいいと思う。
238 名前:236 mailto:sage [2006/12/03(日) 13:18:24 ] >>237 いやーでもVC6の呪文のようなエラーだったら挫折しても仕方なくない? effective STLでもエラー表示を理解しようみたいな項目があったくらいだし
239 名前:235 mailto:sage [2006/12/03(日) 13:52:47 ] いやー自分で作ったテンプレートライブラリならわかるんですけど boostとか使用していて特殊化やオーバーロードが絡んでくると エラー解析に時間がかかって・・・ さんざん悩んでタイプミスでした。とかたまにあるんで ちなみにVC6使ってるのでVC8に変えてみます
240 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 15:06:09 ] STLのエラー解析ならSTLFilt使ってみろよ。 www.bdsoft.com/tools/stlfilt.html
241 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 19:46:56 ] まあ、俺も初めて std::string を知ったばかりのころは、 basic_string ってなーに? traits?? allocator??? ヽ(`Д´)ノ だったな
242 名前:237 mailto:sage [2006/12/03(日) 19:58:04 ] たしかにSTL関連のエラーはわけ分からんな。 ただ、大量にエラー出るわりに、ミスってるのは一箇所とかだったりするんで見慣れてると何とかなるかも。 まあ、経験論なので参考にはならんな。
243 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 19:59:55 ] まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける ってのがオブジェクト指向の目指してることだと思うんだけどね。
244 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 20:49:00 ] STLとオブジェクト指向は関係ないと思うが
245 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 20:58:45 ] >>244 ですよねー^^
246 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:06:53 ] >>245 お前>>243 か?お前みたいなオブジェクト指向を勘違いしてる奴が多いから 巷に間違ったオブジェクト指向の知識があふれてるんだよ。STLってのはジェネリックプログラミング のC++での実装方法であってオブジェクト指向とは何の関係もない。
247 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:08:48 ] >>246 が正論だな。激しく同意する。
248 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:10:08 ] >>246 俺も日頃そう思っていたところだ・・・。正直オブジェクト指向も分かってない素人はプログラミングをやるべきじゃないと思う。
249 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:12:36 ] 何この流れ('A`)
250 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:14:27 ] ジェネリック指向とオブジェクト指向の関係を的確に言い当てると…↓↓↓
251 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:16:19 ] アルゴリズムとデータ構造をパッケージングしたクラス、それがSTL。
252 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:18:09 ] こういう言葉の定義とかになるとやたらハッスルする人ってよくいるよね
253 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:21:02 ] >>252 みたいなやつっていっこうに消えないよね
254 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:25:14 ] オブジェクト指向的ジェネリック指向まだー?
255 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:26:20 ] >>250 ,254 関係ない。
256 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:28:22 ] ジェネリックはオブジェクト指向とは関係ないと思うがSTLはオブジェクト指向で作られてるやん。
257 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 21:29:38 ] >>255 物ベースでジェネリック!
258 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 23:24:15 ] >>256 違う。STLはジェネリックプログラミングを用いているがオブジェクト指向は 用いていない。端的なポイントを挙げるなら、仮想関数に基づいていない。 継承と動的多態がないものをオブジェクト指向と呼ぶのは、 >>246 の言う巷に溢れる間違い。 (言語によっては多少異なった形で実現されることもあるのがややこしいところだけど)
259 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 00:06:26 ] 正直オブジェクト指向とか出てくるとこういう定義厨がでてくるからうざい
260 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 00:13:38 ] >>258 何を根拠にそんな不可解な定義を信じてるの?
261 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 00:35:58 ] RUBY最強杉!!!
262 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 00:58:43 ] >>260 258ではないけど、お前は何だったらオブジェクト指向と言うと思うのか? >>256 258によれば(と言っておく)、クラスを使っているからといってオブジェクト指向プログラミングではないぞ。
263 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:01:26 ] スレ違いだからほどほどを願いたいが 「便利なクラス」を作ることがOOだと主張する困ったちゃんはちょくちょく見る
264 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:08:03 ] スレ違いだからほどほどを願いたいが OOというといきなりその定義を延々と語り説教を始める困ったちゃんはちょくちょく見る
265 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:09:10 ] >>264 おまえのことだな
266 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:14:36 ] スレ違い。OOがどうとか話してる低レベル野郎はどっかいけ
267 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:42:46 ] オブジェクト指向云々以前にさ >>243 >まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける これはSTLのことを指して言ってるの? どうでもいい使い捨てのコードを書く場合は確かに細部を気にせず使うけど、 仕事で使う場合は結局STLの細部まで知っている必要がある気がする。
268 名前:258 mailto:sage [2006/12/04(月) 01:42:54 ] >>260 不可解かな。根拠は、例えばこのへん: ttp://en.wikipedia.org/wiki/Object-oriented_programming → "1 Fundamental concepts" オブジェクト指向プログラミングを特徴づけるものは7つ。クラス、オブジェクト、 メソッド、メッセージ送信、継承、カプセル化、抽象、多態(ポリモーフィズム)。 これらを備えるものをオブジェクト指向言語と呼ぶが、場合によってはいくつかを 欠く。 ダメ情報源でなければ、およそ似たことが書いてあると思う。 STLはtemplateによる静的多態性に立脚しているわけで、 STLそれ自体は動的多態性を旨とするオブジェクト指向とは異なる作りをしている。 ユーザがオブジェクト指向とSTLを同一プログラム内で使い分けるのは自由だけどね。
269 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 01:56:28 ] >>268 リンク先にだいぶマシな定義が書いてあるじゃねーか。 "Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world." 引用した箇所にあるのは「オブジェクト指向言語」についての説明で、 しかもいくつかを欠いたものも「オブジェクト指向言語」に含むことになっている。 何を以って「オブジェクト指向(プログラミング)」と呼ぶかの定義にはならない。 多態だって動的か静的かの区別なんてしてないだろ。
270 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 02:22:30 ] なんでおまえらは荒れるとわかっててその話題をスルーしませんか
271 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 02:28:16 ] このスレは要らないと思ってるから。
272 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 02:28:39 ] コードの多態っぷりはまさにオブジェクト指向っぽいんだが ランタイムに動的ディスパッチしないと一部の人は納得しないんだろうなあ
273 名前:258 mailto:sage [2006/12/04(月) 02:46:50 ] >>269 > リンク先にだいぶマシな定義が書いてあるじゃねーか。 > "Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world." ここまでで止めると曖昧すぎていまいちじゃね? > 引用した箇所にあるのは「オブジェクト指向言語」についての説明で、 > しかもいくつかを欠いたものも「オブジェクト指向言語」に含むことになっている。 要約が悪かったせいですまんが、引用の前の文がOOPに関する説明で、 後ろの文が言語に関する補足。よくわからん向きは、長いけど原文読んでくれ。 > 多態だって動的か静的かの区別なんてしてないだろ。 んーむ。確かにそうだね。言語によらない元々の定義は動的静的を区別しないのかも。 C++でのより狭義なOOPの定義は、Stroustrup の C++ Glossary に記載がある: ttp://www.research.att.com/~bs/glossary.html#Gobject-oriented-programming object-oriented programming - programming using class hierarchies and virtual functions to allow manipulation of objects of a variety of types through well-defined interfaces and allow a program to be extended incrementally through derivation. んで、クラス階層と仮想関数を使わずにユーザ型だけに基づいて行うプログラミングは データ抽象(プログラミング)と区別して呼んでる。 てことで、>>258 の記述は「C++での定義では」という注釈をつけないと いまいち正しくないかもね。
274 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 07:24:07 ] >>270 能力の無さを、必死さとか粘着質とかでカバーして それなりに「論陣張ってるっぽく振る舞える」話題だからだよ。 普通の「出来る奴だけが輝ける」話題で一切まともなこと言えない馬鹿が ここぞとばかりに頑張ってる。 「自分の居場所を見つけた!」ってね。
275 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 11:05:15 ] real worldってまだそんな妄想を語る奴がいるのかよ 信じられん
276 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 13:45:28 ] 流れ自体がどうでもいいから、ここでもどうでもいいこと言うぜ 知ってるやつも多いだろうが 今年の基本情報の問題に "自動車のサブクラス" を問う問題が出たんだ… さすがに内心笑ったやつは多いと思うよ…
277 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 15:54:45 ] 全然ダメだな やっぱオブジェクト指向は”動物クラス”から”犬クラス”と”猫クラス”を派生させないとね! そして多態で鳴く
278 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 16:13:41 ] 実務に関係ない喩えで出題してんのか・・ まあ基本情報はそんなものだろうけど
279 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 16:19:11 ] 大切なのは概念…って馬鹿かって感じだわな。
280 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:41:10 ] オブジェクト指向:関連するデータ構造とアルゴリズムを乖離させないのが目的。クラスその他は実現のための手段 じゃだめなの? 多態性の本質を的確に教えてくれ(´・ω・`)
281 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 18:02:05 ] >多態性の本質を的確に教えてくれ(´・ω・`) インタフェイスと実装の論理的な分割じゃねーの。 実装が変わっても、インタフェイスが同一であれば接続可能。
282 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 18:13:34 ] クラス使えればオブジェクト指向かとおもってたよorz 具体的にコード書くのは仕事やってればいやでも身につくけど こういうのは自分で勉強しないとだめだからねぇ・・・ 今からでもまじめに勉強しようかな
283 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 19:03:36 ] >>282 英語版のwikipediaお薦め
284 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 20:24:10 ] これぞ窮極のオブジェクト指向 pc8.2ch.net/test/read.cgi/tech/1164736142/ 話をSTLに戻そうぜ。
285 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 20:36:16 ] >>284 もっとましなスレを出せよ。やはり嵐か?
286 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 20:45:11 ] 話をSTLに戻そうっていってるだけなのに荒らし扱いなんかよ・・・ OO厨は怖いな・・・
287 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 21:12:07 ] そりゃお前、「俺はこんなにもわかってる奴なんだ」ってのを 必死でアピールする場を奪われちゃたまらないだろう。
288 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 21:30:17 ] >>284 がもっとマシなスレを出していればねぇ('A`)
289 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 22:23:41 ] 至高スレなくなっちゃったしなぁ。
290 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 22:49:55 ] RUBYYYYYYYYYYYYYYYYYYYYYYY!!!!!!!!!!!!!!!!!!!!!!!
291 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:15:02 ] しーしゃああああああああぷうううううううううううううううううううううううううううううううううううううう!!!!!!!!!!!!!!!!!!!!!!!!!!!
292 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:30:27 ] しいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
293 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 00:13:47 ] RubyがC++よりはるかに優れているのは自明であって 今さらそんなことで荒らしに来るRuby信者なんか居ないから 騙っても無駄だよ。
294 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 00:15:49 ] >>293 騙りも何も君みたいなのがいるじゃない^^
295 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 05:55:02 ] 293みたいなまともな人間がいる、から、なに?
296 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 10:05:45 ] RUBYを知らない者はオブジェクト指向を知らず、という格言もあることだし。
297 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 12:52:05 ] 言語が優れてるだの劣ってるだのいってる人間がまともなのか・・・ 言語のある特定の部分、という点ならわかるけど。
298 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 13:06:21 ] ようするにD言語マンセーと。
299 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 13:13:41 ] なにいってんだE言語だろ
300 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 00:09:34 ] print_anyでコンストラクタを直接呼んでオブジェクト渡してますが、参照を渡していないのに slink_iteratorのコンストラクタが2回しか呼ばれないのは、なぜでしょうか?いるんでしょうか? 以下ソースコード template<class Iterator> void print_any(Iterator first, Iterator last) { while ( first != last ) { cout << *first << ' '; ++first; } } class slink_iterator { slink_of_int* cursor; public: // コンストラクタ explicit slink_iterator(slink_of_int* p =0) : cursor(p) {cout << "Constractor" << endl;} ~slink_iterator() { cout << "Destractor" << endl; } // '++' 演算子 slink_iterator& operator++() { cursor = cursor->next; return *this; } // '*' 演算子 int operator*() { return cursor->data; } // '!=' 演算子 friend bool operator!=(const slink_iterator& x, const slink_iterator& y) { return x.cursor != y.cursor; } }; int main() { print_any(slink_iterator(&s1),slink_iterator()); return 0; }
301 名前:デフォルトの名無しさん [2006/12/06(水) 00:24:28 ] >>296 RUBY信者のキモさを見事なまでに表現した格言だな。
302 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 00:24:36 ] RVOとは違うんだっけ?
303 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:48:05 ] Rubyは完全オブジェクト指向でRuby使えると大体下位互換のC++とかPythonとかJavaは 簡単に使えるようになるから東大の教養学部でもRuby教えるようになったんだよね。
304 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:51:38 ] C++はオブジェクト指向「も」使えるだからね。正直C++で書いてるという人の9割はオブジェクト指向 というものを分かってないと思う。Ruby自体はオブジェクト指向に関してはC++より圧倒的に優れてるけど いかんせんスクリプト言語だから遅いんだよね・・・ まあ最初に勉強する教育目的の言語ではRubyの方がいいと思うが。
305 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:51:55 ] Ruby みたいな低級言語ですら Ruby では書けない。 その程度の記述力、実行効率。
306 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:55:34 ] 低級っていうのは言語としてよりネイティブであるということですが・・・(笑) まあ揚げ足取りはさておき、少なくともネイティブアプリをかけること自体は 今はそんなにマイナスポイントではないね。そういうのは一部のハッカーが書けばいい。 RubyとかJavaがCとかC++に比べて今世界でもっとも広く使われるようになってきたのは そういうネイティブコードよりも可読性、オブジェクト指向との親和性が高いからだしね。
307 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:56:39 ] rubyがC++より圧倒的に優れてるのは当たり前だがそれはスレ違いだろ・・・
308 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 01:58:33 ] いやまぁそれは同意するけど、可読性の高い良い言語でもやりたいことが 妥当な性能で出来なきゃ使えないってことも事実なわけで。
309 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 02:06:09 ] でも性能が必要な現場なんてそうそうないような・・・ それに数値計算以外はrubyはCに匹敵する速度が出るし 特にネットワークアプリとかをわざわざ他の言語で書く理由がみあたらない。 スレ違いスマソ
310 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 02:13:12 ] >>309 >でも性能が必要な現場なんてそうそうないような・・・ ここ C++ のスレだから、基本的に性能が必要な現場の人が語らうとこだと思う・・
311 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 02:14:49 ] なんだこの流れ・・・
312 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 02:20:37 ] Rubyへの嫉妬心が、 普通ならあっという間に流れて終わるだけの限りなく独り言に近い書き込みを ここまでのホットトピックに育ててしまったのです。
313 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 03:07:36 ] ルビ厨復活か? Del厨は結局復活しなかったな
314 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 03:42:26 ] ネタが無いから一人で煽ってるものとばかり
315 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 06:30:51 ] >>300 デフォルトコピーコンストラクタが呼ばれてるんじゃないの?
316 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 07:34:27 ] >>303 シラバス検索してみてもヒット0件だったが。
317 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 11:17:37 ] >>316 ニュースで出たぞ
318 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 17:27:23 ] 11/3の日経一面に出てたね。来年からだって。
319 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 17:31:34 ] 下位互換・・・・・
320 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 17:35:30 ] >>303 rubyってdefine や templateとかもあんの? オブジェクト指向型の言語やってりゃJavaとかの習得が楽ってのはわかるけど、 それだけじゃC++を使いこなすには足りないと思うし。
321 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 18:02:35 ] STLとはあんま関係ないけど自分でTemplateクラス書くときってFriend関数使う? それともFriend関数はなるべくないようなクラス設計を目指す?
322 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 18:55:50 ] >>321 使う。A.Alex が述べてたように、SmartPtr みたいなものだとメンバ関数より、 フレンド関数の方が都合がいい。 さらには、↓の理由からフレンドを使うこともある。 template< typename A > void indirect_call( A & a ) { ... do_something( a ); // a.do_something() だと、A が限定される。 ... }
323 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 19:10:59 ] >>322 あーまさに後者の場合が問題だったんだよね。こういうときも無理矢理でもfriend使わないような 設計にしちゃった方がいいのか気になってた。 レスありがとう!
324 名前:デフォルトの名無しさん [2006/12/07(木) 12:02:35 ] C言語で構造体のコピーってmemcpyでやってましたが、 C++で構造体にstd::stringメンバが入ってる場合の構造体コピーってどうやるんでしょうか?
325 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 12:17:48 ] C でも C++ でも、構造体のコピーには代入を使っておけばいい。
326 名前:デフォルトの名無しさん [2006/12/07(木) 20:01:50 ] STLport 5.1.0 release. sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=352516
327 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 20:50:01 ] またインストールせねば・・・
328 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 23:31:58 ] もうSTLportの役目は終わっただろ
329 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:12:32 ] >>328 _STLP_NO_EXCEPTIONS をと同等の設定をわざわざサポートしてくれるコンパイラベンダは無さそう。
330 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:25:47 ] >>328 状態を持つアロケータをサポートしてくれたのは大きいだろう。
331 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:44:17 ] >>330 状態って?
332 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:48:50 ] >>331 非 static データメンバ
333 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 01:14:37 ] フツーのSTLのアロケータの実装は、なんちゃってシングルトンってこと?
334 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 01:57:08 ] >>333 そんなところ。 インスタンスをコンテナごとに持つところまでは決まってるんだけど、 同じ型のインスタンスを区別して扱うことを標準が強制しておらず、 現行の実装はそのことに依存してしまっているものがほとんど。 list a, b があって、これらが異なるアロケータインスタンスを使っているとき、 splice() を使って a <-> b 間で部分的な要素を受け渡すと面倒なことが起こるはず。 標準が強制しなかったのも理解できるし、 STLport の実装も(まだ見てないけど)興味深い。
335 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 22:41:28 ] てすてす
336 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 19:26:04 ] 質問です。 multimap利用して同一キーに複数の値をinsertしたとき iterator itr = lower_bound(key) のあと itr++の順番で値を表示していく場合 insertされた順番に表示される、でいいのですか? なんかうまく表現できないけど察していただけるとうれしいです。
337 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 20:33:52 ] set<int> a; a.insert(5); setのaがあって、全ての要素に10を足す、ということをやろうとしてます 一応↓これで動く(ちゃんと15が表示される)のですが transform(a.begin(),a.end(),ostream_iterator<int,char>(cout,"\n"),bind1st(plus<int>(),10)); aのデータの中身も変更したい時はどのようにすればよいのでしょうか 次のように書くと、5が表示されてしまいます for_each(a.begin(),a.end(),bind1st(plus<int>(),8)); copy(a.begin(),a.end(),ostream_iterator<int,char>(cout,"\n"));
338 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 20:41:49 ] >>337 setは中の値を使ってデータを並べてるんだから書き換え不可。 新たなsetを作り直すしかないと思う。
339 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 21:46:17 ] 足したい値が負なら要素の小さい方から、正なら要素の大きい方から足して要素並びを保証すればいいじゃない set<int, less<int> > a; for (int i = 0; i < 10; ++i) {a.insert(i); } //要素の後ろから足す transform(a.rbegin(), a.rend(), inserter(a, a.begin()), bind1st(plus<int>(), 10) ); copy(a.begin(),a.end(),ostream_iterator<int,char>(cout,"¥n"));
340 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 22:19:02 ] >>336 multiset/multimapでは同値なオブジェクト同士の順番に関する保証はない
341 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 22:35:59 ] >>336 それらしい記述が見つからないから未定義かもしれん。
342 名前:341 mailto:sage [2006/12/13(水) 22:37:00 ] やべ
343 名前:337 mailto:sage [2006/12/14(木) 08:53:30 ] >>338 ,339 なるほど、ちょっと理解が深まりました 一度データを追加&削除で対応することにします ありがとうございました
344 名前:336 mailto:sage [2006/12/14(木) 13:17:44 ] 並び順に関する保証はないですか・・・ ファイルの内容を読み込んで、いくつかの種類に順番に分類するとしたら 順序コンテナを分類する数だけ用意するほか無いのでしょうか?
345 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 13:49:41 ] std::map<Key, std::list<T> > でええやん
346 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 16:50:02 ] vector & stable_sort & equal_rangeもあるな
347 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 06:42:32 ] intやdoubleをstring型にしたいんだけど 一度sprintfなどでchar*にコピーしてからコンストラクタに渡すしか方法はないかな
348 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 06:50:20 ] boostを入れてたのを思い出したのでlexical_castで解決しますた けど、boostない環境では普通にsprintfやstringstream経由でないと不可能?
349 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 06:51:55 ] >>348 Exceptional C++ Style の最初の項を立ち読みしてきなさい
350 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:32:41 ] >>348 boostのソースを読んでみればいいじゃないか。 普通にstringstream使ってるだけだぜ?
351 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 22:31:32 ] つうかstringstreamの何が不満なのか
352 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 23:08:59 ] 標準をそのまま使うのが急にダサいと感じ、ズレたものを好むようになる・・・中二病?
353 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 23:16:42 ] 強いて言うなら速度とかメモリ消費量?
354 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 23:22:14 ] 速度とかメモリ消費量を無意味に気にして、保守性を低下させる・・・中二病?
355 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 03:00:41 ] 速度を重視すべきな場合STLは使うべきではないのでしょうか。 std::vectorくらいなら大丈夫だと思ってたんですけど。 でも実装によるとか言われそうだ。
356 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 06:27:10 ] >>355 使ってみて(≒測定して)から文句言え。
357 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 06:29:23 ] いよいよmove semanticsが欲しくなるな
358 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 12:09:57 ] iostream系は書式指定が面倒 というか俺が覚えてないから調べるのが面倒
359 名前:デフォルトの名無しさん [2006/12/16(土) 12:12:52 ] >>358 覚えていても面倒だよ。 そこでboost::ほにゃららですよ、と言うといろいろ召還しそうなのでやめとく。
360 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 12:13:38 ] sage忘れごめんorz
361 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 13:29:52 ] boostっていつc++にはいるんだろうね?
362 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 14:10:09 ] boostのサイトでTR云々かいてあるのは入る予定なんじゃないの
363 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 mailto:sage [2006/12/16(土) 15:39:43 ] それは時期正式リリース候補だ
364 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 16:54:14 ] 俺printf使ったこと無いからiostreamの方が駱駝
365 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 17:44:55 ] STL勉強中です 次のような状況で、ファンクタが書きたいんですが こういうことって可能でしょうか nを入力すると、nの2倍とnの2乗の集合を返す関数fがあります set<int> f(int n); f(1)={2,1} f(2)={4,4} f(3)={6,9} f(n)={2*n,n^2} 集合aがあってaのそれぞれにfを適用して新たにbを作りたい 例えばa={1,2,3}だとするとb=f(a)={f(1),f(2),f(3)}={{2,1},{4,4},{6,9}} このような場合に transform(a.rbegin(),a.rend(), inserter(b, b.begin()),作りたいファンクタ); のようなファンクタを書くことはできますか もっと適しているデータ構造とかあるんでしょうか
366 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 17:50:59 ] >>365 これじゃダメなのか? transform(a.begin(),a.end(), inserter(b, b.begin()), f);
367 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:02:21 ] >>366 レスありがとうございます 要領を得ない質問の仕方でした、すみません set<int> a; set<set<int> > b;としたら一応動くのですが このbのデータ型もset<int>のままで動かすことは出来ないのでしょうか (要素のほうのsetも全部親に繰り入れた感じで) このデータ型にはとくにこだわりはなくて ファンクタを連鎖的に適用できるような形にはできるでしょうか 一度setのsetでデータを得て、その後そのデータをsetに変更して bにデータを代入することで目的の動作は達成できるんですが こういう方法しかないのでしょうか fの入力と戻り値の型が違うからこういうことになるのかと思い set<int> g(set<int>)というのを考えたら 結局gの内部で同様の問題が起こってしまいました
368 名前:365,367 mailto:sage [2006/12/16(土) 19:15:58 ] 次のプログラムで言えば 関数gを経由しないで集合bdashを求めるようなファンクタは書けるんでしょうか typedef set<int> SET; typedef set<SET> SETSET; SET f(int n){ SET a; a.insert(n+n);a.insert(n*n); return a; } SET g(SETSET a){ SET res; for(SETSET::iterator it = a.begin();it!=a.end();++it){ for(SET::iterator it2 = it->begin();it2!=it->end();++it2){res.insert(*it2);} } return res; } int main(){ SET a,bdash;SETSET b; for(int i=0;i<3;++i){a.insert(i+1);} transform(a.begin(),a.end(), inserter(b, b.begin()), f); bdash = g(b); copy(bdash.begin(),bdash.end(),ostream_iterator<int,char>(cout,"\n")); }
369 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:22:31 ] >nの2倍とnの2乗の集合を返す関数fがあります これを分けて int get_twice (int n) {return n;} int get_square (int n) {return n * n;} 2回transformするとか?
370 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:23:17 ] 失礼 -int get_twice (int n) {return n;} +int get_twice (int n) {return n * 2;}
371 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:37:22 ] >>368 こう typedef set<int> SET; int get_twice(int n){return n+n;} int get_square(int n){return n*n;} int main(){ SET a,bdash; for(int i=0;i<3;++i){a.insert(i+1);} transform(a.begin(),a.end(), inserter(bdash, bdash.begin()), get_twice); transform(a.begin(),a.end(), inserter(bdash, bdash.begin()), get_square); copy(bdash.begin(),bdash.end(),ostream_iterator<int,char>(cout,"\n")); }
372 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:39:38 ] >>367 set の set がただの set に変換できるの? 4 の2乗の 16 と 8 の2倍の 16 が区別できないんじゃないか? あ、その前に set だと {4,4} からして無理だな。
373 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:49:05 ] >>372 それがもし問題ならmultisetにすれば解決するね
374 名前:365,367 mailto:sage [2006/12/16(土) 19:51:43 ] >>369 ,370 レスありがとうございます 確かにそれでうまくいきそうですね ちょっと後出しになってしまって申し訳ないですが 今回2倍と2乗を返すという設定にしたのは、 質問内容の簡略化のため要素数が変わるような関数の例として作ったものです 実は、あるパズルを解くために 数字をn個使って作れる数の集合を求める関数というのが必要になり この場合、2倍と2乗のように入力と出力の数が同じになるように うまく分割することが出来なさそうなんです (出来るかもしれないけど、自分にはわからないので・・ 一応、さっきのプログラムの要領で解決はできそうなんですが 他に良い方法ってあるでしょうか
375 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 19:57:04 ] > 数字をn個使って作れる数の集合 こういう感じ? n = 1のとき{1, 2, 3, ..., 9} n = 2のとき{10, 11, 12, ..., 99}
376 名前:365,367 mailto:sage [2006/12/16(土) 20:00:34 ] >>371 申し訳ないです レス書いてる間にプログラムまで、感謝です >>372 今回は区別の必要がないので、 同じ値があったら追加しないということにしたら変換できるかなと 必要なら>>373 さんのようにすればよいと思います
377 名前:365,367 mailto:sage [2006/12/16(土) 20:04:51 ] >>375 はい、イメージとしてはそんな感じです 自分が今やっているのは、 例えば加算の演算子+と、同じ数値を並べる演算子があったとして 1をn個並べる関数をfとしたら f(1)={1} f(2)={1+1,11}={2,11} f(3)={1+1+1,11+1,111}={3,12,111} というような関数です
378 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 23:08:17 ] 質問があります。 typedef struct stdata{ int nNum; string sText; }LISTDATA_T; vector<LISTDATA_T> vlist; というデータがあるとして、vectorのデータ内を nNumの値でソートしたいのですが可能でしょうか?
379 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 23:11:26 ] そういう関数オブジェクトを作れば可能。 或いは全体的にnNumで比較するのが適切であれば、 operator <の定義を考えたほうが良いかもしれない。
380 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 23:18:47 ] template <class RandomAccessIterator, class Compare> void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); お使いのでこれが対応知れてば余裕。
381 名前:378 mailto:sage [2006/12/16(土) 23:27:23 ] >>379 ,380 レスありがとうございます。 試してみます。
382 名前:355 mailto:sage [2006/12/17(日) 03:34:55 ] 容量1000の配列全要素に対してforで回して0を代入するという動作を10000回繰り返した。 配列は配列([])とstd::vectorで[]を使ったのとiteratorを使ったの3通り。 std::vectorで[]を使うと配列の時の約2.5倍、 iteratorを使うと配列の時の約1.5倍時間がかかった。
383 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 05:03:01 ] 処理時間が一時間とか一日とかかかるプログラムでは致命的だな。 どうしようもない。
384 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 05:10:57 ] 最適化で全くかわるね Linux GCC -O3 だと vector[] = array[] > vector::iterator > vector.at() -O1 だと array[] > vector[] > vector.at() > vector::iterator ただ、最速、最遅で4倍も違わないからどれでもいいと思う。 こんなのカスみたいなコストだ。
385 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 08:26:07 ] そりゃまぁ、ほぼ無意味なループで速度比較してもそんなもんだよな。 実際にはループ一回辺りの処理時間が増えるからますますその差の意義が薄れる。
386 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 11:44:53 ] >>382 0で埋めた後でその総和を取ったりとかしてないと、そもそもループ丸ごと最適化で消されたりするんだが。 ちゃんとやってるよな? んでうちの結果はイテレータのみ倍遅い。あとは全部誤差の範囲。 つーか、10000回程度だと負荷が軽すぎだろ。
387 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 12:27:17 ] vectorの提供する機能と必要なコストを天秤にかけて 妥当だと思うときにvectorを使うのよね array[]で済むならarray[]使えばいいのです
388 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 mailto:sage [2006/12/17(日) 20:48:16 ] 内側でvolatileな変数宣言したりしてればきちんと阻害される
389 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 21:51:49 ] iteratorのforでの書き方にもよりそうだが
390 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 23:41:25 ] >>382 ,>>387 vector<int> v; v.resize(1000); int *p=&v[0]; としてv[i]のかわりに *(p+i)を使えば速度は同じになる。
391 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 23:45:00 ] ループのマイクロベンチが何だというんだ。 マイクロベンチで1:2.5みたいな差が出ても アプリに落ちれば30:31.5くらいだろw
392 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 mailto:sage [2006/12/18(月) 23:59:29 ] そこでvector<Is32vec4>とか
393 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 00:05:01 ] >>382 配列は代入のみでvectorはallocateと代入で、比較してる操作が 違うから当然の結果だろうね。resizeしての比較をするべきだろう。
394 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 01:41:46 ] >>393 allocateは関係なく、単純な代入だけでも差がでる。 関数をコールしている分vectorは遅いのではないか?
395 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 01:55:41 ] >>394 最適化はかけたか?デバッグオプションは付いてないか?
396 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 03:10:31 ] >>394 具体的なベンチコードとコンパイラの名前とバージョンさらせ。
397 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 06:54:48 ] >>394 inline関数が遅いなんてことはない。operator[]が *(begin() + _Pos)なので遅い。
398 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 07:57:08 ] >>397 > *(begin() + _Pos)なので遅い。 なんでだよ
399 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 09:20:35 ] beginはinspectorだろ。
400 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 09:26:13 ] >>399 それが遅い理由なの? ごめん。意味わかんない。 inspector って、何の用語?
401 名前:394 mailto:sage [2006/12/19(火) 14:23:35 ] >>395-397 VC++7.1,stlportをマルチスレッドオプションを付けてコンパイルしている (cl /GX /O2 /MT ...) やはりvectorの方が普通の配列より2割ぐらい遅いね。
402 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 14:24:54 ] マルチスレッドだとアロケートがコスト(比較的)大だからなぁ・・・
403 名前:394 mailto:sage [2006/12/19(火) 14:33:26 ] resizeしてから計測しているのでallocateは関係ないはず
404 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 14:57:45 ] forなんかでまわさずTSCで計ったら?
405 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 15:31:20 ] javaでいうLinkedHashMapみたいなのは自作しないと無理? 挿入順序覚えてくれてる連想配列なんだけどvectorとmap併用かしら?
406 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 15:41:56 ] とりあえずVC++7.1+付属のSTLでは、 for (int i = 0; i < 1000; ++i) array[i] = 0; for (int* b = array, *e = array + 1000; b != e; ++b) *b = 0; for (int i = 0; i < 1000; ++i) vec[i] = 0; の三つに対して、同じ lea edi, DWORD PTR _array$[esp+4064] xor eax, eax mov ecx, 1000 rep stosd というようなコードを吐いた。よってこの3者は完全に等価。STLportはシラネ
407 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 16:55:23 ] Boostにmulti_index_containerという複数の順序付けを指定できるコンテナがあるんだが、だめか?
408 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 18:42:47 ] >>407 だめ だけど勉強になりました。 ありがとう。
409 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 18:57:04 ] vectorはヒープから割り当てるから、 スタック上の配列と比べてメモリのキャッシュに乗りにくいのかな。
410 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 18:59:14 ] アロケー(ry
411 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 19:35:04 ] すみません、質問させてください 基本型あるいはユーザ定義型の配列の要素数を返す関数を作ろうとしてるんですが arrayがユーザ定義型の配列であった場合でも /* @ */の処理がコンパイルされるためエラーになってしまいます template <typename T> void count(T array[]){ if(boost::is_pod<T>::value){/* @ */} else{/* A */}} WEBで調べているとenable_ifで解決できそうな予感がしたのですが 自分には次の例がよく理解できません(特に::type*=0の部分) これはどういった理屈で動いているんでしょうか template<typename T> void copy_n( const T* from, int n, T* to, typename enable_if< is_pod<T> >::type* =0 ){/* 省略 */}
412 名前:411 mailto:sage [2006/12/19(火) 19:49:26 ] あ、boostスレと間違えた^^; 向こうで質問しなおしますね
413 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 11:18:30 ] 質問です。 for(vector<shared_ptr<A> >::iterator itr = a.begin(); itr!=a.end(); ++itr) { hogehoge.... } とやろうとしたのですが、vector<shared_ptr<A> >::iteratorじゃなくて vector<shared_ptr<A> >::const_iteratorで a.begin()を受けろとコンパイラに怒られてしまいました。 vector<shared_ptr<A> >::iteratorで受けたいのですが、どうすればよいのでしょうか。 vector<shared_ptr<A> >::const_iteratorをvector<shared_ptr<A> >::iteratorに変換できれば それでもよいですが・・・。
414 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 11:25:44 ] >>413 aがconstなんだろ。 const_castすればいけるだろうが、それは何か間違ってる。
415 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 11:42:13 ] >>413 vector< shared_ptr<A> > b = a; for( vector< shared_ptr<A> >::iterator itr = b.begin(); ...
416 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 11:46:55 ] おっしゃるとおり、aがconstでした。ありがとうございました。
417 名前:デフォルトの名無しさん [2006/12/20(水) 18:27:26 ] STLのsetを使っていて、だいたい set<X> a; a.insert(b); のようなことをやると、 Core was generated by `XYZXYZ'. Program terminated with signal 11, Segmentation fault. #0 0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique () (gdb) backtrace #0 0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique () #1 0x4000000000002aa0 in main??unw () のような感じでエラーになってしまうようです。 (完全に再現性のある小さいコードを用意することが 出来ませんでした。すみません。) コンパイラはicc9.0で、gccだと問題なく動作します。 個人的にはsetのinsertでcoreを吐くというのは、 あまりないような気がするのですが、どういうことを 念頭におきながらデバッグすればよいでしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 18:34:15 ] まず何処で落ちてるのか、STLの中まで追っかける。
419 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 18:41:02 ] >>417 原因はsetというより十中八九 Xだろうね
420 名前:デフォルトの名無しさん [2006/12/20(水) 19:08:30 ] とりあえず、-fastをつけずにコンパイルすると大丈夫みたいです。 -fastと-ggdbをつけてデバッグした結果です: Core was generated by `./XYZXYZ'. Program terminated with signal 11, Segmentation fault. #0 0x400000000002f320 in _ZNSt8_Rb_treeI6XS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE13insert_uniqueERKS0_ () at /usr/include/c++/3.2.3/bits/stl_algobase.h:747 747 if (*__first1 < *__first2) (gdb) backtrace #0 0x400000000002f320 in _ZNSt8_Rb_treeI6XS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE13insert_uniqueERKS0_ () at /usr/include/c++/3.2.3/bits/stl_algobase.h:747 #1 0x4000000000002aa0 in main () at /usr/include/c++/3.2.3/bits/stl_alloc.h:248 ええっと、参照されてるSTLがgcc由来のものなのが気になります。 (icc9はgcc3系と結合出来るみたいですけど) とりあえずOSはGNU/LinuxでCPUはItanium2です。
421 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 03:32:29 ] -fastの代わりに-O3 -ipoにしてみるとどうなるかな。
422 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 06:27:28 ] 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
423 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 07:44:03 ] >>417 問題の再現するソースと再現しないソースの違いを洗っていけばいいんだよ。
424 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 12:08:27 ] 選択機
425 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 15:52:54 ] STLの定数(std::ios::outとか)の定義について VC6付属のSTLではenumで定義されてるけど、 VC8付属のSTLではclass _Iosbのメンバで static const _Openmodeで実体があるのはなぜ? VC6の時はstatic const に初期値を設定できないから enumハックを使用していると思うんだけど static const にして実体を持つようにした理由がわからない。 なにか利点あるの?
426 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 21:22:37 ] >>425 元々列挙値じゃないのに enum を使ってたのが不自然なんだから、 普通に改めたんだろ。逆に、何か不満な点でもあるの?
427 名前:425 mailto:sage [2006/12/22(金) 15:36:23 ] enumの方が実体がない分サイズの節約になるし(微々たる量だけど) 利用する箇所でもコンパイル時に値が確定するから、 高速化しそうな気がするんですが。 (static constも最適化されて同じかもしれませんが、 それを期待するのはどうかと思って。)
428 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 16:03:40 ] >>427 サイズのデメリットは型の正しさの前では無視できる範囲だと思うよ。 サイズと引き換えにアドレス(参照)を取ることができるようになるから、 相殺と考えることもできるだろう。 static const でも、整数型(および列挙型)でクラス定義内で初期化子を つけたものはコンパイル時定数として使うことができる。 これは規格で定められた動作なので、最適化に期待するというものではない。
429 名前:425 mailto:sage [2006/12/22(金) 17:29:48 ] >>428 参照ってのは思いつきませんでした。なるほど。 型の正しさはenumでも同じですよね。 >static const でも、整数型(および列挙型)でクラス定義内で初期化子を >つけたものはコンパイル時定数として使うことができる。 規格で定義されてるんですね。 知りませんでした、ありがとうございます。
430 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:04:23 ] >>429 > 型の正しさはenumでも同じですよね。 typesafe enum知らない人? enumはあまりtypesafeじゃないよ。初級なんでググってみて。
431 名前:425 mailto:sage [2006/12/23(土) 04:28:27 ] >>430 typesafe enum知らなかったからぐぐって見た。 javaばっかりヒットするのね。 Cはtypesafeではないけど、C++のenum は 型チェックしてくれるから、 typesafeなんじゃないのと思ったり。 それはそれとして、enumはtypesafeではないかも知れないけど、 static const _Openmodeで実体を持つ場合も同じではないの?
432 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 11:53:17 ] >C++のenum は 型チェックしてくれる ???
433 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 14:49:18 ] >>429 > 型の正しさはenumでも同じですよね。 組み込み整数型で特殊化した template に enum で定義された定数を渡して特殊化版が 呼び出されないとか、困るかもしれない。
434 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 20:21:18 ] 初心者です。 listのメンバ関数のsortで、 ↓みたいな使い方が出来るそうですが、使い方を詳しく紹介している サイトがあったら教えてください。 c.sort() c.sort(op) ※ cはリスト sort()だと昇順にソートすることは、分かったつもりですが、 listの型がcharだった場合とかsort(op)の使い方がわかりません。 ↓私は今ここを参考にしています。 wing.zero.ad.jp/~zbe11018/cycode/tips/cbuilder/stl-master.html
435 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 [2006/12/23(土) 21:02:38 ] opに比較関数を渡してやればおk struct comp { bool operator() ( const char a, const char b ) const { bool bResult; //ここに必要な処理を書く return bResult; } }; c.sort( comp() ); ファンクタを渡してやれば、逆順ソートとか文字列の大文字小文字区別無しソートとかも可能。 Windows XPのファイル名ソートみたいに、文字コード順ではなく含まれる数値順でソートやるのだって可能。 俺的にはここがいいかな www.wakhok.ac.jp/~sumi/stl/index.html デスクトップリファレンス的なものは置いておいた方がいいよ。 俺が使ってるのはオライリーのC++ランゲージクリックリファレンス/C++ライブラリクリックリファレンス。
436 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 21:23:38 ] >>435 >opに比較関数を渡してやればおk > >struct comp { > bool operator() ( const char a, const char b ) const { > bool bResult; > //ここに必要な処理を書く > return bResult; > } >}; > > >c.sort( comp() ); > >ファンクタを渡してやれば、逆順ソートとか文字列の大文字小文字区別無しソートとかも可能。 >Windows XPのファイル名ソートみたいに、文字コード順ではなく含まれる数値順でソートやるのだって可能。 丁寧な回答感謝します。昇順ソートだけじゃなくて いろいろなソートが出来るんですね。 >俺的にはここがいいかな >www.wakhok.ac.jp/~sumi/stl/index.html > >デスクトップリファレンス的なものは置いておいた方がいいよ。 >俺が使ってるのはオライリーのC++ランゲージクリックリファレンス/C++ライブラリクリックリファレンス。 私も参考にしたいと思います。
437 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 22:56:38 ] >>436 不要な引用は見づらいだけなので気をつけたほうがいいよ。
438 名前:デフォルトの名無しさん [2006/12/24(日) 04:19:11 ] 良質なSTL本を教えて下さい。 2冊欲しいと思っています。 1. STLの基本概念や、各機能の説明が分かりやすく 説明されている物(vector, mapとはどういう物かとか)。 2. STLの内部実装の事や、効率面を考えた時に、知っておいた方が良い事が纏められている様な物。 要するに、かなり深く突っ込んだ内容のものがいいです。
439 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 04:22:38 ] >>1 1.C++標準ライブラリ ISBN4-7561-3715-6 2,Effective STL ISBN4-89471-410-8
440 名前:438 mailto:sage [2006/12/24(日) 04:22:57 ] じゃなかった >>438
441 名前:439 mailto:sage [2006/12/24(日) 04:24:02 ] 酔ってるゴメン でもISBNは合ってると思うのでとりあえずamazonで見てみて
442 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 04:26:29 ] >>441 おお、即レスありがとうございます。 早速色々と見てみたいと思います。
443 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 06:38:49 ] 初心者です。わからないのですが教えてください。
444 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 11:20:56 ] イテレータのスコープがよくわかりません。 同一関数のスコープ内で同名で違うイテレータを定義した場合、前に定義したイテレータは消えるようですが、 宣言としては、グローバル変数や引数と名前がかぶらないように注意するだけでよい、ということでしょうか?
445 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 11:28:25 ] 定義って何? typedefのこと? それとも実体をつくること?
446 名前:444 mailto:sage [2006/12/24(日) 12:27:51 ] 失礼しました。実体のほうです。たとえば、2つのベクトルの最大値を求めたい場合、 vector<T> vect1, vct2; (データを代入) vector<T>::iterator k = max_element( vct1.begin(), vct1.end() ); vector<T>::iterator k = max_element( vct2.begin(), vct2.end() ); とするわけですが、このときのイテレータkのスコープを知りたい、ということです。 STLは勉強し始めたばかりなので、何かへんなことを聞いていたら申し訳ないです。
447 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:35:52 ] そっちか。 STL関係ない。 「イテレータ」を「変数」に置き換えて >>444 を復唱してみろ。
448 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 [2006/12/24(日) 12:38:16 ] コンパイル通るかどうか試してみましょう。 通らないものを作っても無駄な作業でしかないです。
449 名前:444 mailto:sage [2006/12/24(日) 12:43:16 ] >>447-448 もちろん、通ることは確認済みなのですが、理屈がわからずに使うのは気持ち悪い、と思いまして確認させていただきました。 イテレータのスコープはローカル変数と同じと考えてよい、ということですね。 ありがとうございました。
450 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:49:28 ] >>449 同じスコープで同名の変数は定義できないよ。 どんなクズコンパイラ使ってんだ? それに、結論も違う。「イテレータの値をローカル変数に入れている」と考えろ。 そうなればスコープについてローカル変数のルールに従うのは自明なはず。
451 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 13:08:36 ] イタレータに限らずオブジェクトにスコープという概念はないよ。 スコープを持つのは、宣言や定義。 オブジェクトはエクステント(extent)。普通生存期間と訳されている。 この区別は、言葉だけの問題ではなく、基礎概念の理解につながっている。
452 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 14:25:55 ] STLが使えて>>446 がコンパイル通るコンパイラっていったいなんだろう…。
453 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 14:33:06 ] んなもんあるわけねーだろ 通ったってのはウソだよ
454 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 14:42:57 ] 彼女いなくてもtypo位許してやれよ
455 名前:444 mailto:sage [2006/12/24(日) 14:54:32 ] >>450 vector<T> vect1, vct2; (データを代入) vector<T>::iterator k = max_element( vct1.begin(), vct1.end() ); k = max_element( vct2.begin(), vct2.end() ); でした。すみません・・・ >>450-451 については、基礎的概念をきちんと勉強してステップアップにつなげたいと思います。 ハウツー本ばかりの自我流で、まともな概念書を読んだこともなかったので。 今、「STLによるC++プログラミング」2rd,マッサー他 を読んでいるのですが、敷居が高いっす。 ネットのハウツー参考にしながら感覚的には理解し始めているのですが・・
456 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 14:56:16 ] >>455 一般的な変数のスコープとオブジェクトの生存期間について理解してからSTLに取り組むことをお勧めします。
457 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 15:45:18 ] >>455 君のそのコードは int hoge = 10; hoge = 5; と何が違うんだい?
458 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 [2006/12/24(日) 16:16:37 ] そもそもCをわかってないのにSTLを使おうとしてないかな
459 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 16:19:56 ] そもそもsageを分かってないのにスレに書き込もうとしてないかな
460 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 19:17:04 ] 頭の悪い切り返しにもほどがあるな
461 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 21:07:13 ] >>392 見ればsageを知らないわけではないことくらいわかるだろうに
462 名前:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 mailto:sage [2006/12/24(日) 21:07:58 ] チェック抜けてただけなんだよね
463 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 21:12:11 ] そこは気付よ
464 名前:デフォルトの名無しさん [2006/12/25(月) 22:02:58 ] あるファイルのiostreamを与えられるんだが、 そのファイルはユニコードで書かれている。 なのでiostreamをbasic_iostream<wchar_t>あたりに変換したいんだが なんか便利な方法ある? std::wstring str; std::getline(stream,str); みたいに使いたいわけなんだが。
465 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 22:54:43 ] 最近ageるのがデフォなのか?
466 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 22:58:05 ] 昔、「質問するときはage」って誰かに聞いたんだが 間違いだったか。 ならスマソ
467 名前:デフォルトの名無しさん [2006/12/25(月) 23:18:27 ] 「とにかくsageなきゃいけない」と思い込んでる頭のおかしな人が たまにいるんだよ。 ちなみに、そういう人に「なんでageちゃいけないのか」を訊くと、 なぜか回答らしい回答が無いかわりに人格攻撃とか始めるから注意な。
468 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 23:36:34 ] 結局>>464 はぬるぽ
469 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 01:01:35 ] >>464 ない
470 名前:デフォルトの名無しさん [2006/12/26(火) 13:28:12 ] あげ
471 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 15:05:06 ] >>464 codecvtで頑張ってくれ
472 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 16:18:38 ] >>464 read でバイト列読んで、memcpy でもすれば?
473 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 13:41:47 ] >>464 あんまり分かってないんで、とりあえず「最悪、これなら行ける」方法。 iostreamをstringで受けて、それをここにあるような関数で変換する。 hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html (↑の一番下のリンク) iostreamそのものを変換ができるのかは知らない。すみません。
474 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:31:59 ] それにしても、最初から wifstream を渡してもらえたら楽なのにねえ。
475 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 17:24:59 ] >>464 便利だけど簡単かどうかはわからない。 Boost.Iostreamsでなんとかするというのはどうだ?
476 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 17:52:06 ] >>464 ファイルの中身が Unicode (UTF-16と仮定)なら、2BYTEずつ読んで、 wstring に追加していけばいいんじゃない。楽な方法はないと思う。 wgetline( istream & i, wstring & str ) { char wrk[2] = {0}; while( !!i.read( wrk, 2 ) ) { wchar_t ch; memcpy( ch, wrk, 2 ); if( ch == L'\n' ) break; // 超適当。 str += ch; } }
477 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 19:27:47 ] streambuf実装してwistreamでラップするとか
478 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 20:40:59 ] Boost.Iostreamsも結局やることはそれなんだよな。
479 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 23:15:54 ] WikipediaのSTLの項目で難解さのコード例があるけど、 remove_ifよりpartitionの方が効率がよかったりするの?
480 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 02:17:07 ] >>479 remove_if() は operator = () によるコピー、 partition() は swap() による移動を使う。 あとは中身によってどっちが効率いいか決まるだろう。
481 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 10:02:54 ] サンクス。把握した。
482 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 21:46:58 ] すみませんが、質問です。 テンプレート関数の宣言で、型名がやたらと長くなってしまう場合、typedef などで短縮名を付けることはできないのでしょうか? T::value_type ぐらいならまだしも、boost::range_value< S >::type ぐらい 長くなると、これを引数や戻り値に何度も書くのは、なかなか冗長です。 こういう宣言を、 //------------動くが、戻り値の型名が長い---------- template <typename S> typename boost::range_value< S >::type join5(S b, // 開始イテレータ S e, // 終了イテレータ typename boost::range_value< S >::type s // 区切り文字列 ) //------------↓は実際は動かない---------- template <typename S> typedef boost::range_value< S >::type T; T join5(S b, // 開始イテレータ S e, // 終了イテレータ typename boost::range_value< S >::type s // 区切り文字列 ) などと書きたいところなのですが。 msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep08032000.asp しかしここを見ると、typedefのテンプレート化はできないようです。
483 名前:482 [2007/01/09(火) 21:49:00 ] すみません、貼るコードを少し間違えました。 //------------↓は実際は動かない---------- template <typename S> typedef boost::range_value< S >::type T; T join5(S b, // 開始イテレータ S e, // 終了イテレータ T s // 区切り文字列 ) まあ、動かない擬似コードではありますが。
484 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:10:50 ] そこで前処理、#defineはどうでしょう。
485 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:30:59 ] Oeeeee
486 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:50:50 ] >>482 の記事は2000年のものなのですが、2007年の今も状況は変わっていない ということなのでしょうか?Boostあたりで何か便利なものが生まれていない かと思ったのですが。 >>484 C++なので、できたらマクロは使いたくないです。482の記事にもありますが、 予測を裏切る作用が多いので。
487 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 00:44:49 ] template<typename S> struct Hoge { typedef typename boost::range_value< S >::type T; }; template <typename S> Hoge<S>::T join5(S b, // 開始イテレータ S e, // 終了イテレータ Hoge<S>::T s // 区切り文字列 )
488 名前:482 mailto:sage [2007/01/10(水) 01:15:48 ] >>487 ありがとうございます。さっそく試してみました。 GCCなどでは、Hoge<S>::T の前の typename は省略できません。すると、 typename boost::range_value< S >::type ↓ typename Hoge<S>::T かなり短くなりますが、T 一文字まで短くはならないようです。 また、構造体Hogeには他の応用がほとんどないのに、グローバルな名前空間に 登録されてしまうのも、ちょっと残念な気がします。
489 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 14:44:14 ] 書く以外にない むしろフルネームなのに相当短いぞ boost::range_library::metafunctions::range_value_of<S>::type とかじゃなくて良かっただろう
490 名前:482 mailto:sage [2007/01/10(水) 17:12:23 ] >>489 おっしゃることはもっともですが、では実際にそういう型名の関数を宣言しな ければならなかったら、どうしたら良いのでしょう? 関数じゃなくてクラスだったら、typename boost::range_value<S>::type 程 度の長さでも、誰もがすぐに内部でtypedefしてしまうと思うのです。 template <typename S> class join11 { typedef typename boost::range_value<S>::type T; public: T operator()(S b, // 開始イテレータ S e, // 終了イテレータ T s // 区切り文字列 ) { T ss; for (S i = b; i != e; ) { ss += *i++; if (i != e) ss += s; } return ss; } }; だけどファンクタって、型変数指定が必須で、こういう用途には使いづらいですよね。 wcout << join11<vector<wstring>::iterator>()(v1.begin(), v1.end(), L"*") << endl;
491 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 17:30:21 ] 書く以外に無い。 どうしてもイヤだったら>>487 みたいなヘルパ書いて 適当なnamespaceに閉じ込めておけばよかろう。
492 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 19:19:04 ] >>490 それにレイヤーを被せると template<template<class> class Join> struct xjoin_ { template<typename S, typename T> typename Join<S>::T operator()(S b, S e, T s) const { return Join<S>()(b, e, s); } }; xjoin_<join11> const xjoin = {}; xjoin(v1.begin(), v1.end(), ..); 一般的に解決するのは難しい。が、 タイプを減らすように部分的にデザインすることはできる
493 名前:482 mailto:sage [2007/01/10(水) 20:49:27 ] みなさん、ありがとうございます。 >>491 たしかに、それが現実的な気もします。 >>492 template<template<class> class Join> 恥ずかしながら、この記述が分かりませんでした。 テンプレートを引数に取るテンプレートなのでしょうか? 何か参考になるリンクを教えていただけませんか?
494 名前:482 mailto:sage [2007/01/10(水) 21:06:10 ] じつは、>>482 のリンク先もよく分かってません。 msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep08032000.asp の一番下のほうに、 > rebind<T>::other の方法で十分であると判断した と書いてありますが、 この方法は、自分自身が持つ型変数を変更した型を返せるクラスと、それを 保持するコンテナの定義の仕方でしかないと思うのです。 これがどうしてtypedefのテンプレートとして使えるのか、理解できないのです。
495 名前:デフォルトの名無しさん [2007/01/10(水) 21:06:56 ] class Test { public: int hoge(int x) { std::cout << x << std::endl; return x; } }; int main() { Test t; std::bind2nd(std::mem_fun_ref(&Test::hoge),100)(t); } Test::hoge が constメンバ関数でないのにコンパイルエラーにならないのはなぜ? cygwin gcc 3.4.4 です。
496 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 22:25:30 ] >>495 なんでコンパイルエラーになると思うの?
497 名前:デフォルトの名無しさん [2007/01/10(水) 22:45:41 ] >>496 bind2nd の第一引数が const で Test::hoge が constメンバでないから
498 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 22:57:44 ] constになるのは、std::mem_fun_refの戻り値であるstd::mem_fun_ref_t<int, Test, int>のオブジェクト。
499 名前:デフォルトの名無しさん [2007/01/10(水) 23:13:07 ] >>498 しかし std::bind1st(std::mem_fun_ref(&Test::hoge),t)(100) ではコンパイルエラーになります。 Test::hoge を const メンバにすればエラーになりません。
500 名前:482 mailto:sage [2007/01/10(水) 23:34:45 ] 何度もすみません、>>494 だけ分かりました。 このようにコンテナとその要素を設計すると、 要素のクラス<型変数> を X::rebind<型変数>::allocator_type という決まった形式で呼べる、ということです。 だから呼び出し側の形式を固定化、汎用化できる、ということです。 しかし、固定化はできますが、その固定の形式は全然自由でありません。 この実装だと、 呼び出される側は 要素のクラス<型変数> 呼び出す側はX::rebind<型変数>::allocator_type この形式でしか扱えないのです。typedef の自由さとはかけ離れています。 しかもたいていの場合、呼び出し側は元の型名より長くなってしまいます。 まあそれ以前に「コンテナとその要素の組み合わせでしか使えない」 ので、今回の「関数に与える型名を短くしたい」という目的には全く適わない のですが。
501 名前:482 mailto:sage [2007/01/10(水) 23:36:42 ] >>492 については、私はテンプレートにうとくて分かりません。 もっと勉強して、考えてみます。
502 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 00:11:43 ] >>499 bind1stの第2引数はconst参照を取る。 std::mem_fun_ref_t<int, Test, int>::operator()はTestの非const参照を取る。 どっかで見たことあると思ったら、ここのか。 ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010013.txt
503 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 00:13:35 ] >>499 bind1st(), bind2nd() で束縛する引数の型が const T& と定義されているせい。 関連して、こんなの見つかったけど、ちょっと違うか? www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109 まぁ boost::bind() に逃げるのがいいんだろうな。 boost::bind(&Test::hoge, _1, 100)(t); boost::bind(&Test::hoge, t, _1)(100);
504 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 00:15:08 ] なんだマルチか。
505 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 21:35:18 ] stl::stringラップして sprintf書式でバッファサイズ気にしなくてよくてある程度高速なformat()を実装してる例ってないですか?
506 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 21:40:43 ] STLと関係ないな
507 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 22:08:21 ] >>505 その条件に完全にマッチするわけではないが tricklib.com/cxx/dagger/xstring.h こんなのならある。
508 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 22:25:54 ] サンクス
509 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:25:56 ] boost::format
510 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 19:58:53 ] 質問です VC8ではエラーになるんですが、これは書式としてはあっているんでしょうか //STLコンテナと、データを入れて、データがコンテナにあるか調べる関数 template <template <typename T,class Allocator = allocator<T> > class STLC,typename U> bool has_data(STLC<U>&data,U&value){ STLC<U>::iterator it = find(data.begin(),data.end(),value); if(it!=data.end())return true; elsereturn false; }
511 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 21:45:47 ] Allocator = std::allocator<T>とtypename STLC<U>::iterator
512 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 00:12:10 ] >>511 ありがとうございます あ、typenameないとマズいですね ご指摘の部分と、findもstd::findになおしてコンパイルしてみましたが エラーで動いてくれないようです あれから試行錯誤の末、型チェックはコンパイラ任せで とりあえずは目的の動作はしました template <template <typename T> class STLC,typename U,typename R> bool has_data(STLC<U>&data,const R&value){ typename STLC<U>::iterator it = std::find(data.begin(),data.end(),value); if(it!=data.end())return true; elsereturn false; } もしエラーが文法の問題だったとするとちょっと悔しいなぁ
513 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 11:29:48 ] ちょっと疑問なんだけど > template <template <typename T> class STLC みたいな書き方初めて見たんだけど、どういう意味なの?
514 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 12:25:16 ] template <template <typename T> class STLC,typename U,typename R>
515 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 13:23:15 ] >>513 テンプレート・テンプレート・パラメータ §8.2.3、C++ Templates Template template parameters are placeholders for class templates. They are declared much like class templates, but the keywords struct and union cannot be used: In the scope of their declaration, template template parameters are used just like other class templates. The parameters of template template parameters can have default template arguments. These default arguments apply when the corresponding parameters are not specified in uses of the template template parameter: 簡単に言うとクラステンプレートをテンプレートの引数に持てるという意味だな。 そしてそれにデフォルトの型を指定する事もできる、と。
516 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 13:27:21 ] 僕も一つ質問していいですか? template <typename T, typename U> と書くのと template <typename T> template <typename U> と書くのでは、どういう風に意味が違ってくるのですか?
517 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 13:28:39 ] >>515 テンプレート・テンプレート・パラメータと言うのか。 勉強になった。
518 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 14:37:05 ] >>516 それコンパイル通る?
519 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 15:04:56 ] >>516 下は通常あり得ない書き方だろう。 あるとすれば、クラステンプレートのメンバ関数テンプレート、の実装部分くらい。 template <class T> class hoge { template <class U> void fuga(U arg); }; template<class T> template<class U> void hoge<T>::fuga<U>(U arg) { } みたいな。
520 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 15:26:00 ] >>519 あ、なるほど、確かに説明の所にメンバテンプレートと 書いてありました。 わかりやすい説明ありがとうございます。
521 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 02:26:39 ] STLのsetやmapのメモリ構造って、ただの2分木なんですか? それともB木や2色木みたいなバランス調整される構造なんでしょうか?
522 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 04:04:43 ] 実装に依るだろ。GCCのSTLは赤黒木みたいだけど
523 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 06:11:51 ] VCだとどうなんでしょうかね?
524 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 08:02:42 ] ビタミンC
525 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 09:01:36 ] わざとバランス悪くなりそうな要素を突っ込んでみたら?
526 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 11:45:22 ] ていうかソース見れよ STLならヘッダでいいし そうでなくともVC++にはC/C++ランタイムのソースついてるだろ
527 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 13:10:48 ] VC8のDinkumwareのヘッダを見てみたが、xtreeという名前の ヘッダに赤黒木の実装が使われているようだ。
528 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 15:31:20 ] SortedAssociativeContainer コンセプトが探索その他の操作に対する 複雑性保証として最悪で O(log N) を要求しているので, 必然的に何らかの balanced tree による実装が必然になります. さらに iterator を指定しての (木構造中のノードを指定しての) 削除に 最悪で O(1) の複雑性を要求するので, AVL tree もダメでしょうね. あまりデータ構造に詳しくないのであれですが, B-tree も要素削除後の再平衡化が O(1) では無理だったように記憶しています. もちろん,どちらのデータ構造も欠点に代わる利点を持っていますけれど. したがって,実装としてはおおよそにおいて赤黒木に落ち着くのではないかと思います. >527 VC7.1, VC8.0 の set, multiset, map, multimap の実装は赤黒木です.
529 名前:デフォルトの名無しさん mailto:sage [2007/01/18(木) 17:47:04 ] 皆さん検証乙です
530 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 09:22:18 ] >>528 上のほうの主張はほとんどすべて間違っている。 データ構造について再履修しよう。 まず >最悪で O(log N) を要求しているので, >必然的に何らかの balanced tree による実装が必然になります. は嘘。balanced tree 以外にもこの条件を達成できる データ構造は存在する。もちろん bst が最も普通ではあるが。 次に >さらに iterator を指定しての (木構造中のノードを指定しての) 削除に >最悪で O(1) の複雑性を要求するので, は致命的な嘘。要求するのは amortized O(1)。amortized の意味を 確認せよ。最悪 O(1) の削除は赤黒木でも普通は達成しない。 そして >AVL tree もダメでしょうね. は二つの意味で嘘。 一つ目は、AVL 木の削除は amortized O(1) なので条件を満たす。 二つ目は余談だが、deamortized という手法で削除を O(1) で 実行できるAVL木 O(1) が構成できる。
531 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 20:16:30 ] >>529 こういうのは「検証」というんだろうか?
532 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 21:21:53 ] 検証と言わずに正直に「頭の悪い私の代わりに考えて下さって どうもありがとうございます」とでも書けばいいのに。
533 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 21:32:57 ] >>530 >>最悪で O(log N) を要求しているので, >>必然的に何らかの balanced tree による実装が必然になります. >は嘘。balanced tree 以外にもこの条件を達成できる >データ構造は存在する。もちろん bst が最も普通ではあるが。 は521へ対するレスとして「ただの2分木か,それとも branced tree か」という 暗黙の仮定をおいてレスを書いてしまってました.すいません. それ以降指摘されたことに関しては完全に自分の非で,特に赤黒木に対しては 自分でもなんでこんなトンチンカンなこと書いたのか,恥ずかしい限りです. 528の内容については,完全に無視してやってください.本当にすいません. 猛省して,データ構造について勉強しなおしてきます.
534 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 15:14:59 ] 計算結果がvectorで返ってくる計算の場合、 関数のreturnにvectorをもってくるとおかしくなるから 計算結果込みのオブジェクトにしちゃうんだけど、 何か間違ってる気がする。 return vector<...>しても問題ないような書き方できないでしょうか? struct do_and_result { vector<Data> return_data; template< typename T> operator()(T &t) { ... return_data.push_back(..) .. return_data.push_back(..) //return(return_data); // できない? } };
535 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 15:26:56 ] 下記のコードで unary_function<T,T> のTを指定する方法ないでしょうか? struct obj:public unary_function< T,T //Tをここから指定できない.なおかつTはオブジェトを適用したときにわかる > { T operator()(T &t) { ... return t; } }; 使用例 std::vector<int> ar for_each(ar.begin(),ar.end(),obj()) std::vector<float> ar2 for_each(ar2.begin(),ar2.end(),obj()) unary_functionはbindを使うときに必要らしく Tを自動設定できないかと思いました
536 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 16:06:17 ] >>534 template< typename T> vector<Data> operator()(T &t)ではないのか。 >>535 objもクラステンプレートにしてはだめなのか。
537 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 01:07:29 ] >>534 > 関数のreturnにvectorをもってくるとおかしくなるから 何がおかしくなるのか言ってみな。
538 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 06:30:14 ] >何がおかしくなるのか言ってみな。 決まっているじゃないか、>534の頭だよ。
539 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 07:12:20 ] 頭が悪いのに無理して煽らなくても。
540 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 07:17:38 ] 煽りは挨拶 そして最後は釣りだったことに
541 名前:534 mailto:sage [2007/01/23(火) 13:43:28 ] vector<int> func( ) { vector<int> ar(20); return ar; } にすると、スコープを抜けるとarのメモリーが解放されてしまうらしく エラーになっておちる
542 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 13:59:43 ] そんなことはない。
543 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 13:59:51 ] それなんて糞コンパイラ?
544 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 14:06:43 ] できないのも、しようとするのも問題外だな。
545 名前:534 mailto:sage [2007/01/23(火) 14:29:44 ] 忘れてた. 巨大配列をコピーすると計算時間かかるので参照で返してました。 std::vector<int> & vec_out_fun() { std::vector<int> vec(10); std::fill(vec.begin(),vec.end(),1 ); return vec; } void vector_return_func_test() { std::vector<int> vec; vec = vec_out_fun(); std::cout << vec[3]; }
546 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 14:41:07 ] >>545 それは落ちるだろ こうするとか std::vector<int> & vec_out_fun(std::vector<int> & buf) { buf.resize(10); std::fill(buf.begin(),buf.end(),1 ); return buf; } スマートポインタの類を使うとか typedef std::auto_ptr<std::vector<int> > ApVec; ApVec vec_out_fun() { ApVec vec(new std::vector<int>(10)); std::fill(vec->begin(),vec->end(),1 ); return vec; }
547 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 14:48:27 ] 忘れ方が初心者すぎる
548 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 14:49:36 ] やっぱり>538だったか。
549 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 15:16:18 ] NRVO効かないの?
550 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 17:47:58 ] ローカル変数のアドレスを返すアホ
551 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 18:06:03 ] >>545 はEffective C++なんかにも書いてある典型的な誤りって奴だぁな
552 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 19:10:29 ] STLでもC++でもなくてCレベルの誤りだな ポインタじゃなく参照になるとこういうところで気が抜けちゃうんだろうか?
553 名前:534 mailto:sage [2007/01/23(火) 19:15:52 ] 話題を最初の話に戻すけど ローカル変数をコピー(大きい配列の場合、したくない) なしに返すには、関数を関数オブジェクトにして、 計算結果を関数オブジェクトのメンバー変数においておく という方針は、いいのかどうか? 他にもっといい方法があるのか知りたい
554 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 19:30:55 ] >>553 >>546
555 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 22:18:22 ] STL的には関数をイテレータにするとか
556 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:58:31 ] 上の方に出てた template <template <typename T> class U> は template <template <typename T> typename U> だとコンパイル通らないですね。 templateの中のclassとtypenameって同じことだと思っていましたが 多少異なるんでしょうか?
557 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:15:13 ] >>556 Uは実在の型でないといけないから、テンプレートパラメータではなく クラス名を書かなければならない。だからtypenameではだめ。
558 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 09:10:16 ] >>557 それ、ほんと?
559 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 09:58:22 ] >>556 通常、U は、クラスか構造体にしかならないから…らしい。
560 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 10:23:17 ] ほうほう、これはEffective C++の著者にも教えてあげたほうがいいんじゃねーの
561 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 09:04:22 ] 入力を2つとる for_each transform がない。 自分で作るのもいいけどbindとかと組み合わせると不安 どこかに安定したのがないだろうか
562 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 09:35:48 ] transformには2入力版もあるぞ。
563 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 11:24:18 ] 2つ入力が必要なfor_eachはtransformで代用?
564 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 14:35:10 ] boost::zip_iteratorとか
565 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 21:10:39 ] >>574 あ、それでいけそう ありがとう。
566 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 15:05:06 ] なんで未来にレスしてるんだろう… エスパー登場!?
567 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 16:25:18 ] つまんねえ反応だ
568 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 19:31:32 ] 先頭の空白を除去しようと思っていくつか試したんだが eraseってこんなに遅いもん? //1つ目 str.replace(0,space_num,L""); //2つ目 wstring tmp = str.substr(0,str.size()-space_num); //3つ目 str.erase(str.begin(),str.begin()+space_num); 100万回小さなループで試した結果 1つ目:1.6秒ぐらい 2つ目:1.8秒ぐらい 3つ目:5.7秒ぐらい テストコード boost::timer t; t.restart(); for(int i=0;i<1000000;++i){std::wstring str(L"123456789"); str.replace(0,2,L"");} t.restart(); for(int i=0;i<1000000;++i){std::wstring str(L"123456789"); std::wstring tmp = str.substr(2,str.size()-2);} t.restart(); for(int i=0;i<1000000;++i){std::wstring str(L"123456789"); str.erase(str.begin(),str.begin()+2);}
569 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 23:12:27 ] >>568 std::stringはstd::vectorに似てerase()は遅いぞ。
570 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 23:38:27 ] >>569 そっか、さんくす
571 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 15:16:13 ] class my_class { public: my_class(int i) : i(i) {} void print_ptr(ostream* os) { *os << i << endl; } void print_ref(ostream& os) { os << i << endl; } void plus_ptr(int* n) { i += *n; } void plus_ref(int n) { i += n; } int i; }; int main() { vector<my_class> v; for (int i=0; i<10; i++) v.push_back(my_class(i)); for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::print_ptr), &cout)); // ポインタ渡しはOK for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::print_ref), cout)); // ※リファレンス渡しはコンパイルエラー int i=5; for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::plus_ptr), &i)); // ポインタ渡しはOK for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::plus_ref), i)); // オブジェクトのコピーでもOK }
572 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 15:17:24 ] ※のところでerror: forming reference to reference type `std::ostream&'と言われます。 リファレンスを引数に取るメンバ関数からmem_fun1_ref_tを生成することはできないのでしょうか。 for_eachをつかってコンテナの中身を任意のストリームに吐けるようにしたいのです。 ポインタ渡しを使えばやりたいことは実現できるんだけど、好みの問題でできればリファレンスで渡したいのです。 あと、グローバル関数のoperator<<の特定の特殊化バージョンのポインタを取得することはできるのでしょうか。 operator<< <ostream, const my_class> とかやっても error: no matching function for call to `bind1st(<unresolved overloaded function type>, std::ostream&)' と言われてしまいます。
573 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 15:23:14 ] >>571 リファレンスリファリンス問題だな。標準ライブラリの欠陥だよ。 boost::bindでも使いなせえ。
574 名前:デフォルトの名無しさん [2007/02/03(土) 19:07:58 ] sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=483468 STLport 5.0.3
575 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 20:27:21 ] いつも一緒にいたかった。 隣で笑ってたかった。 boostは次々変わるのに STLは立ち止まったまま。
576 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 20:46:24 ] 次々変わったら、何のためのSだよ
577 名前:571 mailto:sage [2007/02/03(土) 20:53:51 ] >>573 なるほど自分ではいかんともしがたい問題なのですね。ありがとうございました。
578 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 22:17:52 ] >>575 それなんてプリンセスプリンセス?
579 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 22:22:14 ] しっぽ落とさないんだよな
580 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:31:50 ] >>573 あぁ、前に悩んであきらめたなぁ・・ boost::bindだと平気なの?
581 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:50:31 ] >>580 0xcc.net/blog/archives/000090.html
582 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 01:04:06 ] g++だとこんなメッセージ出るのかよ heboい俺にはVCから移行できる気がしない
583 名前:580 mailto:sage [2007/02/05(月) 03:01:53 ] そのためにboostを導入ってのも気が引けるんだよなあ・・ binder2ndとbind2ndの第2引数を const _Ty& _Right → _Ty _Right 強引にこうしちゃうと動くようになったりするんだが、他のとこが動かなく なりそうだしなあ・・
584 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 08:33:00 ] TR1が使えるのならstd::tr1::bindはどうよ。
585 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 16:32:22 ] mapにはPerlのkeysに相当する機能ってありませんか? キーの一覧を取得したいんです。 イテレータ使ってループ回すしかないですか?
586 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 16:38:11 ] 「取得」ねぇ・・・
587 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 17:15:43 ] あ、わからない人は反応しなくていいです。
588 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 17:28:38 ] あ、わかる人も反応しなくていいです。
589 名前:585 mailto:sage [2007/02/05(月) 17:33:38 ] 間抜けなことを聞いてしまった。タイピング数を減らせればどうでもよかった。今は反省している。 素直にイテレータ使ってmapを巡回させることにします。スレ汚しすみません。
590 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:18:27 ] select1st作ってtransformするとか
591 名前:585 mailto:sage [2007/02/06(火) 10:16:30 ] サンクス。そういうの探してました。 だがしかし、VC++に標準で付いてるSTLで開発してるんで使えません。
592 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 10:27:14 ] >>591 transform なら VC++6.0 にもあるよ。
593 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 11:05:53 ] こんな感じか。[Generic Programmingより] ただしVCはselect1stを含んでいないのでコンパイルできない。 STLportをインストールする必要がある。 #include <iostream> #include <map> #include <algorithm> #include <iterator> #include <functional> int main() { std::map<int, double> m; m[1] = 0.3; m[47] = 0.8; m[33] = 0.1; std::transform(m.begin(), m.end(), std::ostream_iterator<int>(std::cout, " "), std::select1st<std::map<int, double>::value_type>()); std::cout << std::endl; }
594 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 11:18:21 ] すげー VCしか使ったことないからかselect1stしらなかったけど 当然2ndもあるんね すげー便利そう
595 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 11:21:04 ] std::unary_functionを継承して自分で作れるよ
596 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 11:23:49 ] template <class T, typename U> struct select1st : public std::unary_function<T, U> { const U& operator() (const T& x) const { return x.first; } }; template <class T, typename U> struct select2nd : public std::unary_function<T, U> { const U& operator() (const T& x) const { return x.second; } }; たったこれだけ
597 名前:594 mailto:sage [2007/02/06(火) 11:29:51 ] 自分用には似たようなの作ってはいたけど、STLportの実装もそれだけなのか これは横槍ながら感謝です
598 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 11:36:17 ] 悪い 上の実装ではコンパイルが通らないようだ こっちを使ってください template <class T> struct select1st : public std::unary_function<T, typename T::first_type> { const typename T::first_type& operator() (const T& x) const { return x.first; } }; template <class T> struct select2nd : public std::unary_function<T, typename T::second_type> { const typename T::second_type& operator() (const T& x) const { return x.second; } };
599 名前:585 [2007/02/06(火) 13:57:26 ] おー、これは感謝です。 select1st, select2ndのコードまで教えていただけるとは思いも寄りませんでした。 ありがとうございます。
600 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 15:24:10 ] STLの利点は「もし無くても自分で作れる」という点が大きいな。 だからboostでtupleなんかが活躍しているんだろうけど。
601 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 02:42:28 ] 自分はVC++2005を使っているのですが STLPortっていうのはどこで確認できるんでしょうか。 boost1_33_1を入れて普通にIncludeフォルダlibフォルダを VC++2005に設定したらboostは使えてるんですが STLPortっていうのが気になります。 確認方法が、あるんでしょうか。 板違いかもしれませんが、どなたか分かる方が居れば 教えていただきたいです。
602 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 09:33:21 ] ググれよ
603 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:42:50 ] stlportそれは・・・・・・・・使わないんじゃないか?
604 名前:デフォルトの名無しさん [2007/02/07(水) 21:19:09 ] GDBでコンテナやイテレータを探索したいんですが、どうすれば参照出来るでしょうか?ただツール落として使うのは不可です。 vectorは参照出来ましたが、listはさっぱり構造がわからずうまく行きません。と言うのも、GDBから演算子関数が呼び出せないんです。 使い易く別でシーケンスを出力する関数を用意するにもテンプレの実行時特化で弾かれます。 何か解決策は無いでしょうか?
605 名前:デフォルトの名無しさん [2007/02/16(金) 19:30:23 ] sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=486837 STLport 5.1.1 Notes (2007-02-16 01:46)
606 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:01:16 ] stringの size_type find(const charT* s, size_type pos) const; のposにstring::nposを指定した時の戻り値って規格で決まっていないんですかね? g++とVC6では結果が違ったので
607 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:06:39 ] >>606 普通に考えると npos 以外返しようがないと思うんだが、 npos じゃない値が出てきたの?
608 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:18:19 ] >>607 string s = "abcdefbc"; printf("%d\n", s.find("bc", string::npos)); を試してg++3.4.4(cygwin)で1が返り、VC6では-1(npos)が返りました。
609 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:19:39 ] どうせVC6が、nposの実値である -1 でそのまま処理したんじゃねぇの?
610 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:20:22 ] あ、志村った。てか、珍しく逆だったか。
611 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 04:38:42 ] 規格的には 0 が文字列の先頭(==*.begin())を指すインデックスとして使われるのに対し、 npos はその逆で文字列の末尾(==*.end())を指すインデックスとして使われていることを考えると VC6の挙動のほうが規格的には正しい。が、nposが指定された場合の挙動が明記はされとらんねぇ。
612 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 08:27:15 ] 明記されてないなら未定義だろう
613 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 08:53:38 ] >>612 直接明記はされてないけど、仕様としては最大値扱いのnposが渡されただけの 話なんで、普通に行間を読めばVC6の挙動が規格通りだと思うんだけど、 はっきりと明記されてない限りは未定義扱いになるんだっけ?
614 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 09:24:12 ] rfind は検索開始位置にデフォルト値でnposが渡されるが、特にnposが渡された時の扱いは 明記されてないまま、nposが最大値扱いな説明がされているところを見ると、VC6の挙動が 規格通りの挙動ってことでいいんじゃないか? はっきり明記されていない限り未定義って ことだと、rfind で検索開始位置を指定しなかった場合の挙動も未定義ってことになるぞ。
615 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 10:26:15 ] 規格には見つからなかったらnposを返すと書いてあった気がするが
616 名前:615 mailto:sage [2007/02/18(日) 11:21:39 ] ん、そういう話じゃなかったな。 定義上 npos == -1 == std::numeric_limits<std::string::size_type>::max() なんだから、見つかるはずがない(必ずnposを返す)という解釈が 正しいんじゃないかな?つまり>>614 で。 ちなみにSTLport4.6.2では位置を返すが、5.0.2ではnposが返るようになってた。
617 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 11:26:49 ] 見つからないときは npos が返る。 今回のは gcc のバグ。 いくらか調べてみると、やっぱり npos がどっかで signed に 突っ込まれてるみたい。 npos を小さくしながら試していくと、 npos / 2 を渡したところから npos が返るようになった。
618 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 12:14:16 ] ・・・
619 名前:606 mailto:sage [2007/02/18(日) 12:32:21 ] いろいろ試していただいた方、サンクスです。 findにnposを渡した時、 ・規格で特に明記されているわけではない。 ・明記されていないがnposは-1で最大値扱いされているので、nposを返すと考えるのが自然。 ・現実にはSTLの実装によって動作が変わるのでこういうコードは書かないほうが良い。 しかし今度はnposの規格が疑問になってきた。 nposの規格って 1.検索失敗時に返す値 2.符号なし整数の最大値 1は規格にあると思うけど2は規格にあるんですか? 2がもしないならrfindにnposを指定した場合も未定義なのかな 規格ってISOで買うしかないんですかね。。。
620 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 12:47:10 ] 規格書に曰く、 static const size_type npos = 1;
621 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 13:10:58 ] >>620 1? -1じゃなくて?
622 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 13:21:43 ] >>619 size_type は符号無し整数で、符号無し整数に変換された -1 が その型の最大値を取ることは規格から導くことができる。
623 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 13:31:14 ] なるほど。nposが規格で-1となっているなら rfindにnposを渡すと最後尾から検索開始することが保証されますね。 となるとやっぱりg++3.4.4のfindにnposを渡した時の動作は変だ。
624 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 15:56:17 ] >>619 C++標準ライブラリ(規格の17章から27章)の部分だけでいいなら 国際規格(ISO) C++ライブラリハンドブックを買う手もある。
625 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 16:07:04 ] eMuleで落とす手もある
626 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 16:41:24 ] >>619 英語のドラフトでよければダウンロードできるよ。
627 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 16:45:29 ] 日本語でよければJIS X3014の画像PDFという手もある。
628 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 17:09:29 ] 文字列に属さない位置(0〜文字列の長さの範囲にない位置) を検索開始位置にした場合は、未定義なんじゃないの? rfindについては、検索開始位置が未指定の場合は末尾からの検索を 行うというのが仕様で、大半の処理系はその仕様をdefault値をnposにする ことで実装しているだけだと思うが。
629 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 17:26:12 ] >>628 rfindのデフォルト値は規格でnposと決まっている。
630 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 17:50:42 ] >>628 条件が満たされない場合はnposを返すとある。
631 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 21:07:46 ] gcc3よりvc6のほうが規格に合致してるのは気に入らない なんとかしてgcc3の挙動が規格上問題ないという証拠を見つけたい
632 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 21:43:33 ] >>631 もう結果が出てるんだから無理。
633 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 21:59:17 ] >>631 patch投げるほうがたぶん建設的やで。
634 名前:デフォルトの名無しさん [2007/02/18(日) 22:01:49 ] g++2.95のstringでさらにおかしな動作発見。 size_type find(const charT* s, size_type pos, size_type n) const; でn = 0を指定 string s = "abcdefb"; printf("%d\n", s.find("bc", 2, 0)); を実行して、 g++2.95: 6 ←"b"を検索しちゃってる g++3.4 : 2 VC6 : 2 を返した。 g++2.95の結果はおかしいとして、 検索文字列の長さを0にした時は規格的にはどれが正しいんだろ? 検索開始インデックス or npos?
635 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 22:16:05 ] size_type find(const charT* s, size_type pos, size_type n) const; Returns: find(basic_string<charT,traits,Allocator>(s,n),pos). s.find( "", 2 );と同じ。空文字列は当然、先頭にマッチする
636 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 00:59:34 ] >>631 gccのbasic_stringまわりは糞だからなぁ。
637 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 04:04:49 ] >>631 VC6のじゃなくてDinkumwareのと言えばOK
638 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 19:07:23 ] おまえらそんなにVC++6が嫌いですか
639 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 19:38:47 ] >>638 俺はgccのほうが大嫌いだけど、なんていうかさぁ、ほら、 のびたの癖に生意気だぞ〜、みたいな?
640 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 20:05:41 ] 2.95まだ使ってる奴いたのか。
641 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 02:34:11 ] VCでもgccでもいいけど、 VC6とgcc2.95は早く滅びてくれるとみんな幸せになれると思うんだ…。
642 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 02:54:21 ] C言語新生児な俺はもvc6もgcc2.95も触ったことないけど、vc6は噂に聞いてる gcc2.95も似たようなものなのけ?
643 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 22:20:15 ] 時期的にはだいたい同じじゃなかったかな そういやgcc2の終わりごろってegccとかforkしてた暗黒時代だった希ガス
644 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 22:40:03 ] ググってみると、 >途中からCygnus社(後Red Hatに吸収)が中心となってEGCSプロジェクトと称して >新しいGCCの開発に着手し,現在ではEGCSプロジェクトが正式なGCC開発元となっています。 と出てきた。gcc2.95は今のgccの先祖じゃないみたい。
645 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:01:28 ] どっちも下手に広まっちゃったから なかなかしがらみが消えないのが問題なんだよな。
646 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 00:11:27 ] 2.95は結構珍しいと思う
647 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 08:21:43 ] Visual C++ 7.1 and higher GNU C++ 3.2 and higher Intel for Linux 8.1 and higher Intel for Windows 8.1 and higher tru64cxx 65 and higher QNX qcc 3.3 and higher MinGW 3.4 and higher Metrowerks CodeWarrior 9.4 and higher たぶんこれら以外はC++コンパイラではない Turbo C++は詐欺な気がする
648 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 11:02:04 ] 現行規格からの逸脱が激しい、ぐらいにしたほうがいいと思うよ
649 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 12:46:43 ] ARMには準拠していると言える水準のものもあるわけだし。
650 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 00:22:42 ] 2.96の挙動不審さは異常
651 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 19:10:54 ] 2.95.2とか今でも結構使われてるな