【C++】STL(Standard Template Library)相談室 3
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/05/20(金) 12:28:20【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/l50
前々スレ
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
入門ページなど
ttp://www.wakhok.ac.jp/~sumi/stl/
ttp://www.jah.ne.jp/~naoyuki/Writings/STL.html
ttp://e-words.jp/w/STL.html
ttp://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
ttp://www.nantekotta.com/stl.html
ttp://www.s34.co.jp/cpptechdoc/reference/stl_samples/
ttp://www.kab-studio.biz/Programing/STLiostream/
ttp://www.itmedia.co.jp/dict/programming/language/kind/c/01486.html
ttp://ja.wikipedia.org/wiki/Standard_Template_Library
ttp://www.shibu.jp/cppreference/cpp_stl.html
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
0002デフォルトの名無しさん
2005/05/20(金) 12:28:48乙
0003デフォルトの名無しさん
2005/05/20(金) 12:42:13http://www.sgi.com/tech/stl/
http://www.stlport.org/
0004デフォルトの名無しさん
2005/05/20(金) 12:43:33【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/l50
BOOSTを語れゴラァ
http://pc8.2ch.net/test/read.cgi/tech/1091198276/l50
0005デフォルトの名無しさん
2005/05/20(金) 12:47:12もう死ねよ脳足りん。
0006デフォルトの名無しさん
2005/05/20(金) 12:47:49【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/l50
C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/l50
0007デフォルトの名無しさん
2005/05/20(金) 12:57:31スレ立て乙
0008デフォルトの名無しさん
2005/05/20(金) 13:01:570009デフォルトの名無しさん
2005/05/20(金) 13:11:51俺もVC以外使わないから
事実上はVCが世界の標準なわけだし、
0010デフォルトの名無しさん
2005/05/20(金) 13:16:58http://www.nantekotta.com/stl.html
0011デフォルトの名無しさん
2005/05/20(金) 13:19:560012デフォルトの名無しさん
2005/05/20(金) 13:59:11>事実上はVCが世界の標準なわけだし
>事実上はVCが世界の標準なわけだし
>事実上はVCが世界の標準なわけだし
バカが勃てたスレにバカが。
0013デフォルトの名無しさん
2005/05/20(金) 14:01:450014デフォルトの名無しさん
2005/05/20(金) 15:51:160015デフォルトの名無しさん
2005/05/20(金) 15:52:56それ、99%おまえのコーディングミス。
C++の基礎事項をチェック。
0016デフォルトの名無しさん
2005/05/20(金) 15:56:410017デフォルトの名無しさん
2005/05/20(金) 16:13:43↑↑糞なVC6だけに必要なプラグマですね(プ
0018デフォルトの名無しさん
2005/05/20(金) 19:12:420019デフォルトの名無しさん
2005/05/20(金) 19:50:440020デフォルトの名無しさん
2005/05/20(金) 23:19:280021デフォルトの名無しさん
2005/05/20(金) 23:25:15速攻STLPortにしますた。
0022デフォルトの名無しさん
2005/05/20(金) 23:33:340023デフォルトの名無しさん
2005/05/20(金) 23:48:08正しくはO(N logN)ね、
愚かな人間のくせになまいきな・・
0024デフォルトの名無しさん
2005/05/21(土) 22:40:11562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。
このスレが不要である事に疑いの余地は無い。
0025デフォルトの名無しさん
2005/05/22(日) 06:17:48テンプレートを使わないスタイルの人や
テンプレートの相談なんて必要無い人(vector,list,stringの一般的な使い方で十分な人)も
まだまだ多いからC++スレにテンプレート厨を入れたく無いってのが本当の理由だろうな。
いってみりゃただの隔離スレw
でも、必要でしょ?テンプレート厨ウザイからw
0026デフォルトの名無しさん
2005/05/22(日) 15:14:21余計間違ってるし・・・
0027デフォルトの名無しさん
2005/05/23(月) 19:37:34int main(void)
{
string str;
//寿命の短いほげほげ
{
str = "HogeHoge";
}
//スコープ外れても大丈夫?
printf(str.c_str());
return 0;
}
0028デフォルトの名無しさん
2005/05/23(月) 20:09:39>std::stringって文字列受け取ったときに内部のバッファにコピーするんでしたっけ?
する。
ちなみに、文字列リテラルはプログラムの実行中ずっと生きてる。
0029デフォルトの名無しさん
2005/05/25(水) 10:39:43vector<int>::const_iterator p=v.begin();
こういう使い方をしていると、v の型を(たとえばlist<int>などに)変えたときに
「vector<int>::」の箇所も変えなくてはならなくて不便なので、
v.const_iterator p=v.begin();
という感じのことをしたいのですが、これだとコンパイルエラーになってしまいます。
このようなことをする方法ってありますか?
0030デフォルトの名無しさん
2005/05/25(水) 11:01:07typedef vector<int> v_type;
v_type v;
v_type::const_iterator p = v.begin();
or
template<typename Iterator> void do_something(Iterator p);
do_something(v.begin());
0031デフォルトの名無しさん
2005/05/25(水) 11:01:31003227
2005/05/25(水) 11:42:12どうもありがとうございました。
ところでちょこっとスレ違いになりそうな気もしますが、
文字列って27のようにスコープ外れたり極端な例でいえば
char* getString()
{
char* p = "HogeHogeHoge";
return p;
}
みたいな文字列でもプログラムの実行中は生きてるのでしょうか?
0033デフォルトの名無しさん
2005/05/25(水) 13:05:06yes
0034デフォルトの名無しさん
2005/05/25(水) 15:45:130035デフォルトの名無しさん
2005/05/25(水) 17:27:320036デフォルトの名無しさん
2005/05/27(金) 06:27:320037デフォルトの名無しさん
2005/05/27(金) 06:45:45単にstd::random_shuffleを知らないってだけの話なのか、
それとも何かひねったこと訊いてるのか。
0038デフォルトの名無しさん
2005/05/28(土) 00:01:46市販の本で、STLのvectorとかlistの説明で
vector<char>
とか
list<int>
とか簡単な例が載っていますが、これってほとんど実用性がありません。
で、考えたのですが、例えば構造体のポインタ(アドレス)を格納するようにして、
#include <vector>
using namespace std;
struct Hoge
{
double A[ 3];
int B[ 5];
};
vector<Hoge*> VHoge;
などとして、
Hoge* T=new Hoge;
VHoge.push_back(T);
:
:
とかってやったらかなり便利かな、と思ったのですが、
こういう例って見たこと無いんです。
ポインタ(アドレス)を要素に使っちゃダメとかいうことってあるのでしょうか?
0039デフォルトの名無しさん
2005/05/28(土) 00:04:04ただ、deleteするのを忘れるなよ
0040デフォルトの名無しさん
2005/05/28(土) 00:04:24理由は>>41から
0041デフォルトの名無しさん
2005/05/28(土) 00:05:39普通はそうやって使う。
0042デフォルトの名無しさん
2005/05/28(土) 00:05:50文法的には全然問題ないが、動的に確保したオブジェクトを生ポインタで持つのはタブー。
boostかLokiあたりのスマートポインタを使うべし。
>これってほとんど実用性がありません。
んなこたぁ無い。
0043デフォルトの名無しさん
2005/05/28(土) 00:07:31>動的に確保したオブジェクトを生ポインタで持つのはタブー。
誰のタブーだよ?
0044デフォルトの名無しさん
2005/05/28(土) 00:07:340045デフォルトの名無しさん
2005/05/28(土) 00:08:300046デフォルトの名無しさん
2005/05/28(土) 00:10:27一般論だぞ。
たとえば38のpush_backが例外を投げたらHogeが一個リークする。
>>44
確かにそうだがauto_ptrは使えないのでしょうがない。
0047デフォルトの名無しさん
2005/05/28(土) 00:14:41を
vector<Hoge> VHoge;
とやったら、構造体(クラス)Hogeに標準コンストラクタと
演算子<と==を定義しないといけないんですよね。
となると、やっぱりアドレス格納方式のほうが良いかなぁ、と思いますが。。。
0048デフォルトの名無しさん
2005/05/28(土) 00:15:57何の話だ
0050デフォルトの名無しさん
2005/05/28(土) 00:26:30そうではなく
> とやったら、構造体(クラス)Hogeに標準コンストラクタと
> 演算子<と==を定義しないといけないんですよね。
は何の話だって事。
どっから仕入れた。
0051デフォルトの名無しさん
2005/05/28(土) 00:29:48どうやってんだ?
っていうかまったくsmartptr知らないんだけどさ。
0052デフォルトの名無しさん
2005/05/28(土) 00:32:360053デフォルトの名無しさん
2005/05/28(土) 00:35:31boostのshared_ptrみたいなスマートポインタは、デストラクタで
確実に資源の解放をする
Stroustrupの「資源の獲得は初期化である」戦術に沿ってるわけだ。
つか、それをやらないと例外安全なコードが書けないのがC++。
0054デフォルトの名無しさん
2005/05/28(土) 00:37:59クラスがデフォルトのコンストラクタを定義し、
<と==の演算子のオーバーロードバージョンを提供する必要あり、
って手元の本には書いてあるよー。
コンパイラのSTLの実装方法によっては、その他の比較演算子も
必要になることもあるって。( ^∀^)つ" ∩ヘェー
0055デフォルトの名無しさん
2005/05/28(土) 00:40:13STL使うときって面倒くさいね。
かなり巨大なクラスになってからだと、やっかいだな。
そもそも、比較演算なんて想定していないクラスはどーすんだ?
0056デフォルトの名無しさん
2005/05/28(土) 00:41:59STLが予期しない結果や動きをすることもあるってことだろ?
これまでの原因不明のバグは、これだったのかと...orz
0057デフォルトの名無しさん
2005/05/28(土) 00:42:11ゆえにエラーにならない
んじゃなかったか
005851
2005/05/28(土) 00:42:27>スマートポインタは、デストラクタで確実に資源の解放をする
それは予想内のことだけど、そのスマートポインタのデストラクタが、
例外が投げられた後どうやって呼ばれるかと疑問に思っているわけだが?
0059デフォルトの名無しさん
2005/05/28(土) 00:43:33なんだかよくわからんな。スタック巻き戻しの際にデストラクタをいちいち
よんでやるのはC++の基本機能だろ。
0060デフォルトの名無しさん
2005/05/28(土) 00:43:38世界に5人しかいないだろうって言ってたな。
0061デフォルトの名無しさん
2005/05/28(土) 00:44:55コンパイルされないと実行時どうなっちゃう?
0062デフォルトの名無しさん
2005/05/28(土) 00:46:040063デフォルトの名無しさん
2005/05/28(土) 00:46:06あのね、実行時必要になるような(=つかってる)コードはもちろん
コンパイルされるの。
ぜんぜん使ってないコードは、コンパイルされないわけ。
もちろんテンプレートに限った話だよ。
0064デフォルトの名無しさん
2005/05/28(土) 00:47:11そうなのか?本のタイトルは?
俺の本(Generic Programming -STLによる汎用プログラミング-)には
vector< T >
型の要件: T は代入型のモデルである。
代入型
有効な式:
X(x); x は X のオブジェクト、X(x) は x のコピー。
X x(y); y は X のオブジェクト、y は x のコピー。
x = y; 戻り値の型はX&、x は y のコピー。
とあるぞ。
あるいは最後の x = y だけを以って代入型とする場合もある。
>>60
最近はもっと増えた思う。
0065デフォルトの名無しさん
2005/05/28(土) 00:47:51ダイナミックリンクならぬダイナミックコンパイルみたいだ。
0066デフォルトの名無しさん
2005/05/28(土) 00:49:38006751
2005/05/28(土) 00:50:05一体どういうスコープなのそれって?
スタックにsmartpointerをインスタンス化するってこと?
そんなんじゃ、そのvector自体、関数内のローカルな寿命でしかないじゃん。
使えないよそれじゃ。
0068デフォルトの名無しさん
2005/05/28(土) 00:50:29そうそう、テンプレートはそういう面倒くささと高度な技術を
実装系にもとめちゃうわけ。
初期のCfrontは、とりあえずリンクしてみて、(テンプレートがらみで)
たりないものがあったら再度コンパイラを走らせる
みたいな実装だったらしいよ。
0069デフォルトの名無しさん
2005/05/28(土) 00:51:43まあ君がなにも分かっていないことが、よくわかった
0070デフォルトの名無しさん
2005/05/28(土) 00:52:42コンパイルエラーが意味不明になりがちなのは欠点だよね
007151
2005/05/28(土) 00:56:49まぁ、キミは表面的な理解しかしてないが、とりあえず「スマートポインタ」
とか言ってみたかっただけだという事が判った。
0072デフォルトの名無しさん
2005/05/28(土) 00:57:31vector破棄->スマートポインタ破棄->オブジェクト破棄
の連鎖が成り立つことが重要。
そのvector自体もスマートポインタで管理されてるかも知れないけど、
連鎖を逆にたどっていっていつかはローカル変数にたどり着くなら、
その関数が例外で終了したときにすべて破棄されることが保障される。
0073デフォルトの名無しさん
2005/05/28(土) 00:59:56標準講座C++
基礎からSTLを利用したプログラミングまで
P559、P565あたりかな。
intやcharの組み込み型は既に用件を見てしているから無問題だって。
ユーザーが定義した型(構造体やクラス)だと必要なのかな?
0074デフォルトの名無しさん
2005/05/28(土) 01:01:19×見てしているから
○満たしているから
007551
2005/05/28(土) 01:01:31そうだね。たとえ行き着く先のsmartptrがstaticであっても破棄されるね。
0076デフォルトの名無しさん
2005/05/28(土) 01:03:38オブジェクトの集合が順序集合じゃなきゃダメってことか?
なんか使いにくいのねー。
0077デフォルトの名無しさん
2005/05/28(土) 01:04:51いやだから、比較が必要なコンテナやアルゴリズム、メソッドが
使えないというだけ
0078デフォルトの名無しさん
2005/05/28(土) 01:05:19vector使うだけなら要らんぞ。mapは必要だがな。
0079デフォルトの名無しさん
2005/05/28(土) 01:06:43そうなの。少し安心。
0080デフォルトの名無しさん
2005/05/28(土) 01:07:250081デフォルトの名無しさん
2005/05/28(土) 01:07:42スタック巻き戻しだけでなく、
コンストラクタの最中におちた場合にも、基底やそん中で生成された
オブジェクトのデストラクタは起動されるし、
何かがdelete(delete[])される際には、そのオブジェクトの
デストラクタは起動される。
これ以上の確実性は、手作業では保証できんのよ。だから、「資源獲得は
初期化である」テーゼが重要なの。
0082デフォルトの名無しさん
2005/05/28(土) 01:09:29テンプレートはファーストフードのマニュアル対応みたいなもん
インターフェースだけあわせておけばとりあえず店員として通用する
それがテンプレートクオリティ
0083デフォルトの名無しさん
2005/05/28(土) 01:11:23インターフェースにクラスを強要してしまっていることだ
つまりファーストフードの店員に板前の真似事を無理矢理強要させるのと同じ
0084デフォルトの名無しさん
2005/05/28(土) 01:11:24008551
2005/05/28(土) 01:11:39もう判った。ごめんごめん。
あとは、pointee_ に代入するオーバーヘッドの問題だけだな。
0086デフォルトの名無しさん
2005/05/28(土) 01:12:14それは違う
組み込み型や組み込みの配列やただの関数ポインタが使えるのが
STLのいいとこじゃないか
0087デフォルトの名無しさん
2005/05/28(土) 01:12:34みなさん、ありがとうございました。
0088デフォルトの名無しさん
2005/05/28(土) 03:53:34>インターフェースにクラスを強要してしまっていることだ
これは,例えばコンテナの要件がbeginやendなどをメンバ関数として実装していることを
要求していることを指している,と解釈して良いですか?
で,これを
>STLの唯一の間違い
と指摘する具体的な理由も聞いてみたいです.後半の
>つまりファーストフードの店員に板前の真似事を無理矢理強要させるのと同じ
という文章だけだと抽象的過ぎてあまり良く理解できなかったので・・・.
0089デフォルトの名無しさん
2005/05/28(土) 06:51:55ファーストフードの店員にスマイルを強要する程度じゃないか?
0090デフォルトの名無しさん
2005/05/28(土) 08:10:14以後数十レスほど混沌とし続ける予感
0091デフォルトの名無しさん
2005/05/28(土) 08:24:17vector< vector< double > > x(SIZEX, vector< double >(SIZEY));
はうまくいくのですが
vector< vector< vector< double > > > x(SIZEX, vector< double >(SIZEY),vector< vector< double > >(SIZEZ));
3次元の場合、コンパイルエラーになります。
どこが間違えているのでしょうか?
0092デフォルトの名無しさん
2005/05/28(土) 08:32:36こうじゃないか?
vector<vector<vector< double > > > x(SIZEX, vector<vector<double > >(SIZEY, vector<double>(SIZEZ)));
0093デフォルトの名無しさん
2005/05/28(土) 12:15:37ちょっとした開発環境ならメンバ関数の候補を出す機能くらい備えてる。
これが関数ベースだとそうは行かない。
特に関数テンプレートはそのパラメータが受け取れる型についてプログラマに殆ど情報を与えてくれない。
push_front( vec, val );
が正しいかどうかはコンパイルしてみないと判断できない。
STLの実装によっては問題なくこれを受け入れてしまうかもしれない。
むしろvector< bool >のほうがよっぽど大きな間違いだろう。
0094デフォルトの名無しさん
2005/05/28(土) 12:34:50メンバ関数だけ候補出してもらってもさほどうれしくない
全部関数の方が、見た目の統一性があってよかったよ
0095デフォルトの名無しさん
2005/05/28(土) 12:38:230096デフォルトの名無しさん
2005/05/28(土) 20:57:260097デフォルトの名無しさん
2005/05/28(土) 21:06:08D&Eにテンプレート引数に対する要件を記述するテクニクみたいなのが
載っていたよ
あくまでテクニクでありtipsだけど
0098デフォルトの名無しさん
2005/05/28(土) 22:10:04Cとの互換性はそろそろ犠牲にしてもよし。
あとvector<bool>を思いついたバカをこの機会に処刑。
0099デフォルトの名無しさん
2005/05/28(土) 22:29:53本からの知識をひけらかすのは楽しいものだが
0100デフォルトの名無しさん
2005/05/28(土) 22:31:410101デフォルトの名無しさん
2005/05/28(土) 22:32:450102デフォルトの名無しさん
2005/05/28(土) 22:43:50以下の通り。
・23.1-3 から要素の型は CopyConstrutible でかつ Assignable である必要がある。
・Sequence(vector, deque, list)については他になさそう。
・Associative container(set,map,multiset,multimap)については key の比較が必要
だけど、同値は比較から導出するから必要ない(23.1.2-3)。
テンプレートで指定してやれば、比較が operator < である必要はない。
無論、各メンバ関数では remove で operator == が必要、だとかさらに要求が
つく場合はあるけど。
で、関係ないけど恥ずかしながらポインタの比較について知らなかったことを晒してみる。
・同じオブジェクトを指している場合、同じ配列中の要素を指している場合以外に、
同じ集成体(構造体等)のメンバを指している場合もポインタの比較が規定されている。・ただしアクセス指定子で分けられている場合を除く。
・C では規定外の場合は未定義、C++ では不定
んが、20.3.3-8 で
>For templates greater, less, greater_equal, and less_equal, the
>specializations for any pointer type yield a total order, even if
>the built-in operators <, >, <=, >= do not.
とされているため、ポインタを associative container などに突っ込むことができる、と。
逆に規格を厳密に解釈した場合、例えば list<T*> に対して sort() は意味のある結果を
返さないかもしれないが、sort(less<T*>) は意味のある結果を返すということになるね。
後、おまいら STL における比較は strict weak ordering が必要って知ってましたか?
>98
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96
vector<bool> はやめて別の名前にする方針みたいっすよ?
しかしま、豪快なタイトルですな。
0103デフォルトの名無しさん
2005/05/28(土) 23:04:44参考になった。乙。
>後、おまいら STL における比較は strict weak ordering が必要って知ってましたか?
当たり前だと思ってたんだが、何か意外な点でもあるのか?
0104デフォルトの名無しさん
2005/05/29(日) 00:12:360105デフォルトの名無しさん
2005/05/29(日) 00:16:400106デフォルトの名無しさん
2005/05/29(日) 00:31:44boolの配列は作れないということですか?
0107デフォルトの名無しさん
2005/05/29(日) 00:47:440108デフォルトの名無しさん
2005/05/29(日) 08:17:25実際にはポインタや参照ではないことがまずいと読んだが。
0109デフォルトの名無しさん
2005/05/29(日) 09:08:43vec.push_back(true);
bool* p = &vec[0];
ができないわけだな
0110デフォルトの名無しさん
2005/05/29(日) 20:10:45いえ、結果からすれば当たり前ではあるんですが無意識のうちに使っていたもので。
一度 strict weak ordering というのをおいてから equivalence を導出して、最終的に同値類での strict な全順序を
持ってくるところと、
・comp(a,a) は常に false
・comp(a,b) && comp(b,c) ならば comp(a,c)
・equiv(a, b) を !comp(a,b) && !comp(b,a) として equiv(a,b) && equiv(b,c) ならば equiv(a,c)
という 3 つの制約で定義しているのが面白い、と。
確かに、これで comp(a,b) と comp(b,a) が同時に成立しない、とか最終結果が出てくるんですよね。
後、単純に比較させるだけなら ≦ を使っても良かったと思うんですけど、そうしなかったのは
equality と equivalence とを区別する意味からなんだろうなぁとか。
と思ったら、既にそんなことを書かれてる人がいますね。
ttp://d.hatena.ne.jp/Cryolite/20040529
0111デフォルトの名無しさん
2005/05/30(月) 08:49:21二項関係
ttp://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E9%96%A2%E4%BF%82
同値関係
ttp://ja.wikipedia.org/wiki/%E5%90%8C%E5%80%A4%E9%96%A2%E4%BF%82
順序集合
ttp://ja.wikipedia.org/wiki/%E9%A0%86%E5%BA%8F%E9%9B%86%E5%90%88
この辺を参照のこと。
0112デフォルトの名無しさん
2005/05/31(火) 12:32:37なぜか、eofの前に余計な1バイトをget()してしまいます。
テキストファイルをバイナリエディタで開いて確認しても、そんな文字はないのですが
どういうことでしょうか?
0113デフォルトの名無しさん
2005/05/31(火) 12:39:44バイナリモードならEOFだろ。
0114デフォルトの名無しさん
2005/05/31(火) 12:41:40というか、一度でもいいから、テキストファイルをバイナリエディタで
覗いてみろと小一時間。
0115デフォルトの名無しさん
2005/05/31(火) 12:55:52ifstream.eof()の前に、get()が"4294967295"という値を取得してしまうんです。
0116デフォルトの名無しさん
2005/05/31(火) 12:59:00それ、-1(EOF)だって。
0117デフォルトの名無しさん
2005/05/31(火) 13:01:28どうしてもeof()を使いたいなら、istream& istream::get(char& c); を
使った方がいいよ。ストリームがeofになったら、cの値を捨てればいいから。
0118デフォルトの名無しさん
2005/05/31(火) 14:46:38よく、
while(!in.eof()){
c = in.get();
..色々処理
}
ってソース見るけど、
while(!in.eof()){
c = in.get();
if(!in.eof()){
..色々処理
}
}
にしなきゃいけないの?(getして値を使う前にeofチェック??)
とりあえず上記で解決したようですが。
0119デフォルトの名無しさん
2005/05/31(火) 14:59:03お前らが語っているそれは STL ではない。
0120デフォルトの名無しさん
2005/05/31(火) 15:21:36117の言うように、
char c;
while(!in.get(c).eof()){
// 色々処理
}
とするのがわかりやすいんじゃないか。
0121デフォルトの名無しさん
2005/05/31(火) 15:52:23スマン。すぐ終わる。
>>118
CもC++も、値を読み込んで初めてEOFかどうか判断できる。
その書き方はBASICのそれだ。
istream& istream::get(char& c);は返却値がistreamなんだから、
operator !() を使って、
while (!in.get(c)) {
なんかの処理
}
とやるのがスマートだろう。
これは余談だが、C++でfstream関連についてあまり分かってない人が
多い。多分cstdioを使う方が速いからだろうが、大学で情報処理を
とってきた人でもfstreamはさっぱり・・・・という人がほとんどだ・・・orz
0122デフォルトの名無しさん
2005/05/31(火) 17:31:50多分抽象化し過ぎなんだよな。
a << "aaa" << "bbb" << endl;
これはC系言語C++にとって異質。
0123デフォルトの名無しさん
2005/05/31(火) 17:37:26んな事ねーーーーー
慣れの問題。
0124デフォルトの名無しさん
2005/05/31(火) 19:47:24クラス階層が複雑だとか
ものによっては入力系の先読みがウザいとか
まあ嫌う理由はいろいろあるな
複雑なフォーマットとか、printf系では一発でも
iostreamではゴテゴテとしたマニュピレータが必要になるし。
0125デフォルトの名無しさん
2005/05/31(火) 20:21:56iostreamは仮想継承で全部の階層の全部の関数がリンクされるそうだから。
boostのlexical_castやformatもstream& operator>>(stream& o, ...)を使ってるのでデカデカになる。
0126デフォルトの名無しさん
2005/05/31(火) 21:23:28while (in.get(c)) {
処理
}
だと思うのだが。
0127デフォルトの名無しさん
2005/05/31(火) 22:07:48ケチケチすんなよ
0128デフォルトの名無しさん
2005/05/31(火) 23:32:43MinGW+STLportなら、-D_STLP_USE_DYNAMIC_LIB をコンパイルオプション
に指定して主要部分をDLLに追い出せば、プログラムをたくさん作っても、
ほとんどCと変わらんよ。
速度的には、そりゃあ多量のデータをファイルに書いたり読んだりすれば遅いけど、
小さなデータならあっという間だし、現時点でcstdioを使う必要はあまりなくなって
来たなあ。意味があるとすれば、ベンチマーク時くらいかね。
0129デフォルトの名無しさん
2005/05/31(火) 23:42:240130デフォルトの名無しさん
2005/06/01(水) 00:07:23とかいうエラーが出るんだけどこれってどうすればいいの?
0131デフォルトの名無しさん
2005/06/01(水) 00:21:20MS本社の場所はサポートセンターに問い合わせてください。
0132デフォルトの名無しさん
2005/06/01(水) 07:22:41後氏ね。
0133デフォルトの名無しさん
2005/06/01(水) 07:42:29まぁヒントぐらいにはなったな。
うむごくろう。
0134デフォルトの名無しさん
2005/06/01(水) 08:28:570135デフォルトの名無しさん
2005/06/01(水) 17:29:570136デフォルトの名無しさん
2005/06/01(水) 21:10:540137デフォルトの名無しさん
2005/06/01(水) 21:38:56は保証されているんだっけ?
ついでにsizeof(char)は1で8ビットは保証されているんだっけ?
0138デフォルトの名無しさん
2005/06/01(水) 21:47:130139デフォルトの名無しさん
2005/06/01(水) 21:52:26charは8ビット「以上」でなければならない。(<climits>のCHAR_BITS)
8ビットでなくても良いということだな。
0140デフォルトの名無しさん
2005/06/01(水) 23:54:09std::cout << (sizeof(char) < -1) << std::endl;
0141デフォルトの名無しさん
2005/06/01(水) 23:58:200142デフォルトの名無しさん
2005/06/02(木) 00:39:120143137
2005/06/02(木) 16:19:17・・・numeric_limitsで場合わけするか。
0144デフォルトの名無しさん
2005/06/03(金) 09:29:18(画像処理のライブラリー)
STLのデフォルトアロケータと何か問題を起こしてるみたいだ。
std::vector<char> newVec(10)
でこける
なんとかならないのか
環境はVC++.net2003
0145デフォルトの名無しさん
2005/06/03(金) 09:43:17STLport入れてみ。
0146デフォルトの名無しさん
2005/06/03(金) 09:44:300147デフォルトの名無しさん
2005/06/03(金) 09:59:04boost::poolでも使ってみろ。
0148デフォルトの名無しさん
2005/06/03(金) 11:21:380149デフォルトの名無しさん
2005/06/03(金) 12:25:02糞だなw
0150デフォルトの名無しさん
2005/06/03(金) 12:28:01多分、その「独自のメモリー管理機能」にバグが残っていると見た。
STLのせいにする点で、糞。
0151デフォルトの名無しさん
2005/06/03(金) 13:23:410152デフォルトの名無しさん
2005/06/03(金) 13:40:29vector< vector< int > > vwork(X, vector<int> (Y))
でYの部分をなぜ(Y)にしないと、コンパイルエラーが起きるのでしょうか?
0153デフォルトの名無しさん
2005/06/03(金) 13:44:25OpenCVとIPL
IPLは基本部分がバイナリーで与えられてるので改造できない。
アロケーターにバグあっても対処できね
0154デフォルトの名無しさん
2005/06/03(金) 16:23:24vector<int>(Y) がコンストラクタだと気付いてないとしても
vector<int> Y が文法的におかしいことには気付いて欲しい。
0155デフォルトの名無しさん
2005/06/03(金) 23:59:42そもそもなぜこれでこけるのかが分からない。
operator newの置き換えでもやってるんだろうか?
0156デフォルトの名無しさん
2005/06/04(土) 00:02:36>>144の頭がこけてるんだよ。
0157デフォルトの名無しさん
2005/06/04(土) 00:17:55文法的に禁止されているのでしょうか?
class Base
{
public:
Base(){}
};
class Derived : public Base
{
int hoge_;
public:
Derived(int hoge):hoge_(hoge){}
int test() {return hoge_;}
};
int main()
{
Derived a(3);
vector<Base> b_list;
b_list.push_back(a);
Derived& b = static_cast<Derived&>(b_list[0]);
cout << b.test() << endl;
}
上のコードをコンパイル・実行すると 3 が出力される事を
期待しているのですが不定値が出力されてしまいます。
(環境: Intel compiler 8.1 Windows版)
上の例は文法的に間違っているかどうか、詳しい方がいらっしゃいました
らご教授ください。m(__)m
0158デフォルトの名無しさん
2005/06/04(土) 00:22:14常識的には間違っている。スライシングが起こるから。
vector じゃなくても、
Base b = Derived();
とかやると何が起こるか考えてみよう。
0159デフォルトの名無しさん
2005/06/04(土) 00:22:48vector<Base>に何か入れようとするとコピーコンストラクタが発生して
Derivedを入れようとしてもBaseのオブジェクトとして格納される。
こういうときにはBase *とかboost::shared_ptr<Base>をvectorに入れるようにすれば良い。
0160157
2005/06/04(土) 00:31:38>>159
お二人とも素早いレス、どうもありがとうございます。
大いに勉強になりました。なるほど、スライシングですね。
Base* を利用してみる事にします。
とても助かりました。ありがとうございます!
m(__)m m(__)m m(__)m m(__)m
0161デフォルトの名無しさん
2005/06/04(土) 22:27:34wikipediaのリンク外さない?
0162デフォルトの名無しさん
2005/06/04(土) 22:30:40次スレはないのでそんな心配は無用です。
0164デフォルトの名無しさん
2005/06/04(土) 22:52:56それがdllのメリットじゃん。
なにか疑問でも?
0165デフォルトの名無しさん
2005/06/05(日) 00:15:30でもVC以外のSTLの準拠率が話題に上ることはあまりないな…
他は全て完全準拠してるのか!?
0166デフォルトの名無しさん
2005/06/05(日) 00:44:45テンプレにマジレスカコワルイ!
0167デフォルトの名無しさん
2005/06/05(日) 04:47:23半年ROMれ
0168デフォルトの名無しさん
2005/06/05(日) 11:14:49クラスの内容をファイルに簡単に書き出せるけど
stlのコンテナにシリアライズはできないの?
0169デフォルトの名無しさん
2005/06/05(日) 11:33:08つ[boost::Serialization]
0170デフォルトの名無しさん
2005/06/05(日) 11:49:48thx
0171デフォルトの名無しさん
2005/06/05(日) 13:26:170172デフォルトの名無しさん
2005/06/05(日) 13:28:120173デフォルトの名無しさん
2005/06/05(日) 14:05:29またこの関数を使う上で注意点ってありますか?
0174デフォルトの名無しさん
2005/06/05(日) 14:14:09>stringのc_str()が返すポインタは、いつまで有効なのでしょうか?
次にそのstringの非constメンバ関数を呼ぶまで。
0175デフォルトの名無しさん
2005/06/05(日) 14:46:29const char* cp = str.c_str();
if (str[0] == '$') {
とやったら、3行目でおじゃんかよ
ほんとかよ?
0176デフォルトの名無しさん
2005/06/05(日) 14:47:40ほんとです。
COWで実装されてたらあたりまえだろう。
0177デフォルトの名無しさん
2005/06/05(日) 14:51:56ま、Writeしてないのに、勝手にCopyしてリソースを浪費するのは
実装として話にならんと思うが・・・
0179デフォルトの名無しさん
2005/06/05(日) 15:11:10operator[]がプロキシを返すことは許されてないんだし。
0180デフォルトの名無しさん
2005/06/05(日) 15:12:060182デフォルトの名無しさん
2005/06/05(日) 15:13:11その定義がなんとも不自然だなあと思うだけで
0183デフォルトの名無しさん
2005/06/05(日) 15:13:33COWを使わなくなったからどうでもいいんだが。
0184デフォルトの名無しさん
2005/06/05(日) 15:34:27ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263
ここで修正されている 21.3/5 には「要素に対する参照、ポインタ、イテレータ」が無効になるような
basic_string の使われ方が列挙されている。
ここと、 21.3.6/2 に書かれている c_str() の戻り値が無効になるタイミングが
食い違っているのがおかしいような気がする。
0185デフォルトの名無しさん
2005/06/05(日) 15:38:51実装が終端に'\n'を持つかどうかの自由度を残したんじゃないですかね?
0186デフォルトの名無しさん
2005/06/05(日) 15:39:53template<class T>
T const &as_const(T &x){ return x; }
char const *cp = str.c_str();
if(as_const(str)[0] == '$'){
は安全ですね.
0187デフォルトの名無しさん
2005/06/05(日) 23:57:320188デフォルトの名無しさん
2005/06/06(月) 00:08:04なんでやねん。stringに代入したりすると、ポインタが変わったりするぞ?
0189デフォルトの名無しさん
2005/06/06(月) 00:18:00そんなことするぐらいなら string をコピーしとけばいいだろ。
0190デフォルトの名無しさん
2005/06/06(月) 00:39:31釣られてみる。
strdup()は、「標準に含まれていない」という理由だけでも使う価値はない。
百歩譲ったとしても、「strdup()が確保するメモリの開放方法はない」という
点においてもまた、使うべきでない。
昔からこんな関数考えたやつの気が知れんのだが。
0191デフォルトの名無しさん
2005/06/06(月) 00:41:42> strdup()が確保するメモリの開放方法はない
は?free()すればいいのでは?
> 昔からこんな関数考えたやつの気が知れんのだが。
char * p = malloc(strlen(s)+1);
strcpy(p, s);
と毎回書くのが面倒だったからでしょ。
0192デフォルトの名無しさん
2005/06/06(月) 00:48:23規格にない以上、strdup()が確保したメモリがfree()で開放されるとは
保証されていない。
0193デフォルトの名無しさん
2005/06/06(月) 00:53:23規格に無い関数の仕様を規格で判断してどないすんだっちゅーの。
「CreateWindowは規格に無い以上、その動作は保証されていない」
とか言うのかよ。
現実問題として、free()で開放できないstrdup()の実装なんぞ
見たことがないぞ。
0194デフォルトの名無しさん
2005/06/06(月) 00:53:350195デフォルトの名無しさん
2005/06/06(月) 00:59:23>「CreateWindowは〜」
その通り。
>現実問題
書いてないことは決まっていない。
>>194
その通り。
0196デフォルトの名無しさん
2005/06/06(月) 01:05:14俺はGUIやsocketやDBの存在する現実の世界で生きるから
0197デフォルトの名無しさん
2005/06/06(月) 01:06:58言い切っちゃうところがすごいねw
0198デフォルトの名無しさん
2005/06/06(月) 01:15:08メモリの開放方法ってどこに書いてあるの?
0199デフォルトの名無しさん
2005/06/06(月) 01:16:24たとえばこんな風にだ(これはfreeBSDのmanからの引用)
The strdup() function allocates sufficient memory for a copy of the
string str, does the copy, and returns a pointer to it. The pointer may
subsequently be used as an argument to the function free(3).
0200デフォルトの名無しさん
2005/06/06(月) 02:02:52だからfree()できない。
0201デフォルトの名無しさん
2005/06/06(月) 02:04:030202デフォルトの名無しさん
2005/06/06(月) 02:06:480203デフォルトの名無しさん
2005/06/06(月) 02:11:38はいはい、規格に無いんだったら free() できる仕様かもしれないし、そうでないかもしれないし、
あんまり短い文章で論理破綻しないでくれよ。
0204デフォルトの名無しさん
2005/06/06(月) 02:14:43規格厳密合致がこんだけ好きなくせにどうして規格にないことが言い切れるんだろうね
>>200
規格にない関数は独自のメモリ管理をしなくてはならないなんて規格には書いてない。
0205デフォルトの名無しさん
2005/06/06(月) 02:26:330206デフォルトの名無しさん
2005/06/06(月) 02:41:17複製してくれるとは限らないしな。
0207デフォルトの名無しさん
2005/06/06(月) 02:43:40餌乙
0208デフォルトの名無しさん
2005/06/06(月) 02:50:10否定されてファビョっている奴。情けねー
0209デフォルトの名無しさん
2005/06/06(月) 02:53:560210デフォルトの名無しさん
2005/06/06(月) 02:54:10ちゃんと読もうねw
0211デフォルトの名無しさん
2005/06/06(月) 02:59:01余程悔しいようだな。strdup()は 非 標 準 で す。
0212デフォルトの名無しさん
2005/06/06(月) 03:06:23よほど日本語が読めないようですが、誰もstrdup()を否定してません。
ファビョるっていってるくらいだから、かの国由来なのかな。
0213デフォルトの名無しさん
2005/06/06(月) 03:21:56よく読め。strdup()なんかを薦めてしまった>>187と
strdup()をものすごい勢いで否定してる>>190と
それを肴に悪乗りしてるその他大勢がいるだけだから。
0214デフォルトの名無しさん
2005/06/06(月) 03:26:350215デフォルトの名無しさん
2005/06/06(月) 03:30:36なんだが、わかってるのかな。
0216デフォルトの名無しさん
2005/06/06(月) 03:32:00第4版だけど strdup() で確保される領域は malloc() で確保されると書いてあるね。
ttp://www.caldera.com/developers/devspecs/
>System V Interface Definition Fourth Edition
>Volume 1a
>string(BA_LIB)
0217デフォルトの名無しさん
2005/06/06(月) 03:40:120218デフォルトの名無しさん
2005/06/06(月) 03:43:45くあしく
0219デフォルトの名無しさん
2005/06/06(月) 03:46:44どっかの高速道路の事故現場の中継で、つきのわぐまの轢死体が写ってた。
0220デフォルトの名無しさん
2005/06/06(月) 05:11:550221デフォルトの名無しさん
2005/06/06(月) 05:27:10ttp://www.opengroup.org/onlinepubs/009695399/functions/strdup.html
0222デフォルトの名無しさん
2005/06/06(月) 07:12:34牛が思い浮かんで笑えたんで。
0223デフォルトの名無しさん
2005/06/06(月) 10:16:55実際、COW が嫌いな人は Mad COW Disease なんて呼んだりもする。
0224デフォルトの名無しさん
2005/06/06(月) 10:25:480225デフォルトの名無しさん
2005/06/06(月) 16:22:590226デフォルトの名無しさん
2005/06/07(火) 02:49:490227デフォルトの名無しさん
2005/06/07(火) 13:21:520228デフォルトの名無しさん
2005/06/07(火) 13:59:580229>>228
2005/06/07(火) 14:32:110230144
2005/06/07(火) 18:43:15iplでは
画像格納してるの先頭のポインターのアドレスがなぜか
変動する
0231デフォルトの名無しさん
2005/06/07(火) 20:57:18バッファを大きめにとって
バッファ先頭+画像横幅+1あたりにポインタを移動してるとか
0232デフォルトの名無しさん
2005/06/08(水) 15:09:380233デフォルトの名無しさん
2005/06/09(木) 20:43:36ちゃんとメモリーのアドレスどおりに並んでない場合ってあるの?
std::vector<float> vf(10)
float *p_float= vf..begin()
なら
p_float[0]==vf[0]
p_float[1]==vf[1]
p_float[2]==vf[2]
...
だよね? ならない場合ってあるの?
0234デフォルトの名無しさん
2005/06/09(木) 20:46:42std::vector<bool>を除くstd::vector<>は、配列と同じメモリレイアウトに
なっていることが保証されている。
begin()の前のドットは1つな。
0235デフォルトの名無しさん
2005/06/09(木) 21:21:19アドレス通りに並んでいることは保証されているけど、
vector<float>::begin()が返す型であるvector<float>::iterator型が
float型のtypedefである保証は無い。
float *p_float= &vf[0];
とやらなきゃダメ。
0236デフォルトの名無しさん
2005/06/09(木) 21:57:230237デフォルトの名無しさん
2005/06/09(木) 22:06:180238デフォルトの名無しさん
2005/06/09(木) 23:15:55プログラミング言語C++嫁。
0239デフォルトの名無しさん
2005/06/09(木) 23:22:06サイズ変更する関数呼ばなければ
の間違いか
0240デフォルトの名無しさん
2005/06/09(木) 23:49:490241デフォルトの名無しさん
2005/06/10(金) 13:56:22質問ですが、
std::wstring wstr;
で
wstr.c_str()はwchar_t*を返しますが、
char*(マルチバイト文字)を返す関数、または方法はありますか?
できれば、一つの関数でchar*を得たいのですが。
よろしくお願いいたします。
0242デフォルトの名無しさん
2005/06/10(金) 13:56:520243デフォルトの名無しさん
2005/06/10(金) 14:03:53DBCS -> MBCSに変換したいっつーことか?
0244241
2005/06/10(金) 14:14:16いえ、変換の仕方は知ってますが、
std::wstring wstr;
を関数一つの呼び出しでchar*を得られるものがあるのかどうかを知りたいだけです。
たぶん無いと思いますが。
0245デフォルトの名無しさん
2005/06/10(金) 14:20:36std::wstringにそういうメンバ関数はない。
0246デフォルトの名無しさん
2005/06/10(金) 15:34:25得る方法はありませんか?
0247デフォルトの名無しさん
2005/06/10(金) 15:40:38すでにFAQだな。
0248デフォルトの名無しさん
2005/06/10(金) 16:18:120249デフォルトの名無しさん
2005/06/10(金) 16:40:210250デフォルトの名無しさん
2005/06/10(金) 18:11:370251デフォルトの名無しさん
2005/06/10(金) 18:55:480252デフォルトの名無しさん
2005/06/10(金) 18:58:400253デフォルトの名無しさん
2005/06/11(土) 11:30:14vector<HOGETYPE*>でなく、こんなvector<HOGETYPE>だったら、かなり痛いよね。
class HOGETYPE{
...
hoge& operator = ( const hoge& right ) {
if( ptr ) { delete ptr; ptr = new float[NUM]; memcopy( ptr, right.ptr, NUM*sizeof(float)) }
}
float* ptr;
};
vector<HOGETYPE> buffer;
おまけに、
swap( T& a, T& b ) { T temp = a; a = b; b = temp; }
なので、1回の並べ替えでコピーコンストラクタが3回も呼ばれる。
0254デフォルトの名無しさん
2005/06/11(土) 11:33:02class HOGETYPE{
...
hoge& operator = ( const hoge& right ) {
if( ptr ) { delete ptr; }
ptr = new float[NUM]; memcopy( ptr, right.ptr, NUM*sizeof(float)) }
}
float* ptr;
};
0255デフォルトの名無しさん
2005/06/11(土) 11:34:390256デフォルトの名無しさん
2005/06/11(土) 11:35:53swap を特殊化すれば回避できるだろう。
0257デフォルトの名無しさん
2005/06/11(土) 12:39:26あれだよな、vector<HOGE*>だと関数オブジェクト書くのがめんどいんだよな。
vector<HOGE>だとHOGEの実装をハンドル持つようにして=の最適化かvectorっぽくswapの特殊化だよな。
>>255
まじで全部特殊化してんの?
0258デフォルトの名無しさん
2005/06/11(土) 16:15:510259デフォルトの名無しさん
2005/06/11(土) 17:28:12>>256
std::swapを特殊化してもそれらがstd::sortから呼ばれる保証はどこにもないですよ.
それにクラステンプレートの場合std::swapを特殊化することができないです.
0260デフォルトの名無しさん
2005/06/11(土) 17:39:030261デフォルトの名無しさん
2005/06/11(土) 17:47:56std::memcpyをコピーコンストラクタの代わりに用いるのは
C++では大抵の場合間違いだが、
この場合はそれでいいし効率も勝る訳か。特殊例だな。
0262デフォルトの名無しさん
2005/06/11(土) 17:48:58やだよ。ソート基準が関数ポインタになっちゃうじゃん。
0263デフォルトの名無しさん
2005/06/11(土) 18:12:55どの場合?
0265デフォルトの名無しさん
2005/06/11(土) 18:27:02じゃあ、listに入れてsortしろ
特殊化とかアホなことするの無意味
0267デフォルトの名無しさん
2005/06/11(土) 18:35:19listはマージソートが出来るから、quick_sortの約1/2程度の速度でソートできる。
そのため、listにはメンバ関数にsort()が用意されている。
その他には、make_heapでヒープを作っておき、sort_heapでソートするという変態技
もあるが、RandomAccessIteratorを必要とするので、listには使えない。
0268261
2005/06/11(土) 18:36:11おまえは偽者だな!!
おれが本物の>>261だ!!
とかいうのはさておき、qsort()ならswapはmemcpy()つかてるでしょ
と思ったの。
でも、今VC++のCRTのソース見たら、swapするのにmemcpy()つかわず
なぜか手動でバイトコピーしてるな。
なんでだろう。
0269デフォルトの名無しさん
2005/06/11(土) 18:38:33んな話じゃなくて、listならコンストラクタ走らねえってこと
0270デフォルトの名無しさん
2005/06/11(土) 18:41:51重要だから
sort()でコピーコンストラクタを走らせないためだけにlistを
選ぶってのはどうかと
0271デフォルトの名無しさん
2005/06/11(土) 18:44:44あるいは、無理やり同サイズの構造体にでもキャストして、sortを呼ぶか
0272デフォルトの名無しさん
2005/06/11(土) 18:48:59保障はないみたいだが。
0273デフォルトの名無しさん
2005/06/11(土) 18:54:240274デフォルトの名無しさん
2005/06/11(土) 19:20:11後置++とか+とかの演算子の一時オブジェクトのコピーについて、最適化としては=のコストを検討すること。
じゃねーの?
0275デフォルトの名無しさん
2005/06/11(土) 19:26:40日本語壊れててよくわからない。
0276デフォルトの名無しさん
2005/06/11(土) 22:54:50世の中にはnewしていないものをdeleteしたくない人だって居る。
0277デフォルトの名無しさん
2005/06/11(土) 22:57:070278デフォルトの名無しさん
2005/06/11(土) 23:15:17>You can, however, use delete on a pointer with the value 0.
ISOの規格は知らんが、MSDNにはこうあるな。
勉強になったな俺もお前も
0279デフォルトの名無しさん
2005/06/11(土) 23:21:090280デフォルトの名無しさん
2005/06/11(土) 23:27:090281デフォルトの名無しさん
2005/06/11(土) 23:31:09delete内でもNULLチェックぐらいやっているって。
0282デフォルトの名無しさん
2005/06/11(土) 23:36:320283デフォルトの名無しさん
2005/06/11(土) 23:39:50中でやるより外でやったほうが速いわな
0284デフォルトの名無しさん
2005/06/11(土) 23:46:51最適化で同じになるだろ。
0285デフォルトの名無しさん
2005/06/11(土) 23:50:010286デフォルトの名無しさん
2005/06/12(日) 00:08:310287デフォルトの名無しさん
2005/06/12(日) 00:10:35delete i;
delete i;
てやったら2回目のdeleteで堕ちた。。。
0288デフォルトの名無しさん
2005/06/12(日) 00:12:11if(p) delete p;
にしといたほうが、おばかなコンパイラには優しそうだ。
0289デフォルトの名無しさん
2005/06/12(日) 00:14:13プログラマの気持ちが伝わってくるのはいいんじゃね?
大勢に影響は無いのは事実だし。
0290デフォルトの名無しさん
2005/06/12(日) 00:14:46・コピーコンストラクタの話なのに、なぜ HOGETYPE(const HOGETYPE&)
ではなく operator=( const hoge& right ) をあげているのでしょう?
・デフォルトコンストラクタには触れてないけど ptr は NULL に初期化なのか、
ptr = new float[NUM] なのかどっちのつもりでしょう?
・delete ptr ではなく delete [] ptr ではないでしょうか?
0291デフォルトの名無しさん
2005/06/12(日) 00:27:32そりゃそうだ。
deleteはデストラクタを呼んでポインタの指す領域を解放するだけで、
ポインタ変数の値を0にしてくれはしない。
0292デフォルトの名無しさん
2005/06/12(日) 00:35:55null pointerかどうかのチェックでは不完全であって、deleteしちゃいけない
ケースは山のようにある
そして移植性の高い方法では、完全なチェックは事実上不可能だ
そういった中でnull pointerかどうか「だけ」をチェックするのは意味がないし、
そもそもnull pointerをdeleteするのは安全であることが
規格で保証されている以上、間抜けなコードだと言われても仕方が無かろう
0293デフォルトの名無しさん
2005/06/12(日) 00:40:20ISO/IEC 14882:1998 5.3.5 Delete -4
[Note: the value of a pointer that refers to deallocated storage is indeterminate.]
0294デフォルトの名無しさん
2005/06/12(日) 00:57:21本流から外れてる気がしないでもないが。
例えば、あるクラスがあってコンストラクタでnewして
デストラクタでdeleteするような設計だったならば
delete内のNULLチェックがそもそも冗長ってことになる。
まあ仕様で決まってるんだから、ウダウダ言っても仕方ないんだけれども。
>null pointerかどうかのチェックでは不完全であって、deleteしちゃいけない
>ケースは山のようにある
そんなケースある?
0295デフォルトの名無しさん
2005/06/12(日) 01:01:23deleteしていいのは
newで確保されて、
まだ開放されておらず、
もう誰も使っていないポインタだけ
だろ
他のポインタは全部deleteしちゃだめ
0296デフォルトの名無しさん
2005/06/12(日) 01:34:29i=new int[ 100];
:
:
if(i) delete [ ] i;
i=NULL;
:
:
ってやってるほうが精神的に落ち着く自分がいる。
っていうか、ポインタ変数ってNULLで初期化しておくのが
定石かとおもたら違うの?
0297デフォルトの名無しさん
2005/06/12(日) 01:38:57メモリを指しているときは!NULLであるということを徹底してる。
だから騒然、最初にポインタ変数宣言するときはNULLで初期化するし、
処理の途中でdeleteしたら必ずNULLを入れるようにしている。
deleteしっぱなしだと、使いまわしているポインタだと、
わけわからなくなるから、これはやめられない。
0298デフォルトの名無しさん
2005/06/12(日) 01:40:01したがって、NULLでポインタはinvalidであるという約束事にしておく必要がある。
HOGETYPE::HOGETYPE() { Resume(); }
HOGETYPE::~HOGETYPE() { Suspend(); };
void HOGETYPE::suspend() { if( ptr ) { delete[] ptr; ptr = NULL;} }
void HOGETYPE::resume() { if( ptr == NULL ) { ptr = HOGETYPE[size]; }
0299デフォルトの名無しさん
2005/06/12(日) 01:41:54ソースでアピールする意味でもif(p) delete p;ってやるな。
俺ならだけど。
0300デフォルトの名無しさん
2005/06/12(日) 01:44:190301デフォルトの名無しさん
2005/06/12(日) 01:44:350で初期化すると、実は2度deleteしているような分かりにくいバグを
発見するのが難しくなる。
一方で、0で初期化しないと、0で初期化していたときには何故か動いて
いたものが肝心なときに限って(納品の直前とか?)落ちることが多くなる。
どっちがいいかはジレンマですな。宗教戦争の予感がする。
0302デフォルトの名無しさん
2005/06/12(日) 01:49:10それってプログラムをちゃんと組めてないだけ。
設計思想とかそういうレベルの話じゃない。
0303デフォルトの名無しさん
2005/06/12(日) 01:53:20そのsuspend()は
単に
void HOGETYPE::suspend() { delete[] ptr; ptr = NULL; }
でいい気がするんだが
という話ではなくて?
0304デフォルトの名無しさん
2005/06/12(日) 01:54:32マクロを使うようなコードも良く見るね
0305デフォルトの名無しさん
2005/06/12(日) 01:55:33全部自分でやれる内はいいが、ライブラリのような
ある程度使い方を他人に委譲せざる得ない場合もあるしねえ
0306デフォルトの名無しさん
2005/06/12(日) 01:58:17deleteのときは必ずNULL代入するから、
2度deleteとかはありえないですよ。
0307デフォルトの名無しさん
2005/06/12(日) 02:00:04それは自分が管理している範疇じゃないから、
原因特定するときも、むしろわかりやすいよ。
0308デフォルトの名無しさん
2005/06/12(日) 02:00:38NULL代入したら、二度目のdeleteは実質的に安全になるからな。
でも、二度deleteを呼んでしまうこと自体はあり得て、それが
ソフトウェアクラッシュに結びつかないから、露見しにくくなる、と
>>301は言っているのだろう。
それをバグと言うべきかどうかは微妙なところだと思うが。
0309デフォルトの名無しさん
2005/06/12(日) 02:01:14そんなときでも、使用していないポインタはNULLの原則は守れますよね。
0310デフォルトの名無しさん
2005/06/12(日) 02:03:53ちゃんと、if(p) delete p; p=NULL;してるから
2度deleteは無いんです。はい。
0311デフォルトの名無しさん
2005/06/12(日) 02:04:18ああそういう意味か。
0312デフォルトの名無しさん
2005/06/12(日) 02:05:160313デフォルトの名無しさん
2005/06/12(日) 02:06:000314デフォルトの名無しさん
2005/06/12(日) 02:07:350315デフォルトの名無しさん
2005/06/12(日) 02:07:45strdup()しかり。
0316デフォルトの名無しさん
2005/06/12(日) 02:12:50もし>>190=>>301だったらどうする?
0317デフォルトの名無しさん
2005/06/12(日) 02:14:59どちらにせよ、あなたのポインタを0にセットするとクラッシュするっていうバグが
「pointerをNULLで初期化すべきでない」という論の論拠にはならないってことだ。
0318デフォルトの名無しさん
2005/06/12(日) 02:23:51って単純に思っちゃう私はおばかチャン?
NULLにしとけば、アクセス時に確実にクラッシュするから、
むしろバグ発見しやすいって思ってたんだけどな。
newし忘れとか、するタイミングを間違ってるとか。
0319デフォルトの名無しさん
2005/06/12(日) 02:25:19デフォルトコンストラクタは黙ってれば
メンバ変数はNULLで初期化してくれるんですよね?
0320デフォルトの名無しさん
2005/06/12(日) 02:29:040321デフォルトの名無しさん
2005/06/12(日) 02:35:090322デフォルトの名無しさん
2005/06/12(日) 03:31:48とりあえずstd::sortがstd::swapを
呼ぶと仮定して話を進める。
前述どおりソートを改良するにはswapの
特殊化が最適だろう。
swapも対象が4byteに収まるなら
デフォルトのインプリメントが最も速いが
4byteで収まらない場合、メモリへの書き戻しが
発生してストールする可能性が出る。
ならば強制的にレジスタのみを使ってswapをするようにしれば
速くなるのではないか?
具体的にはmmレジスタ or xmmレジスタをテンポラリに使って
値の交換を行う。この際ふたりはプリフェチを忘れないように。
では>>321実験よろしく。
0323デフォルトの名無しさん
2005/06/12(日) 11:50:54アクセス前に全部 NULL チェック入れるの?
そうじゃないと中途半端だよね?
0324デフォルトの名無しさん
2005/06/12(日) 12:12:08後で判定に使いたきゃ0ポインタにしておけばいいし、delete後にすぐ変数破棄するなら0いれる意味は無い。
0325デフォルトの名無しさん
2005/06/12(日) 12:29:13int *ip = new int[Num];
は、NGで
int *ip = NULL;
ip = new int[Num];
だとよ、なんつうか地味に鬱なコード書かされる
理由を聞いても意味不明なこというだけだし
0326デフォルトの名無しさん
2005/06/12(日) 13:14:42( ´∀`)すまぽ
0327デフォルトの名無しさん
2005/06/12(日) 13:45:291000回繰り返すテストを行ったら下記のようになった。
MMXは最適化は全然してなくてこれなんで結構使えるかも。
SSEにしたらもっとよくなるかな?
std::swap = 121532867 clock
std::memcpy = 149840084 clock
MMX = 26874815 clock
0328デフォルトの名無しさん
2005/06/12(日) 14:02:39ださっ...そんな部署なら移動してよかっただろ。
0329デフォルトの名無しさん
2005/06/12(日) 14:11:17昔からこういう規則になってるというのならいざ知らず
去年、突然意味不明に導入された規則なところがまた笑える
0330327
2005/06/12(日) 14:13:04std系まで速くなってしまった。
アライメントって大事なんだな、へたな最適化より効果あるし。
std::swap = 98215796
std::memcpy = 107130904
MMX = 26091994
SSE = 22441920
0331デフォルトの名無しさん
2005/06/12(日) 14:17:180332デフォルトの名無しさん
2005/06/12(日) 14:31:37これってMMXは、下のようにmovqで64ビット単位で転送しているだけでその性能がでているの?
//VC.Net 2003
#include <iostream>
#include <iterator>
int main(int argc, char* argv[])
{
long data1[2] = {100, 200};
long data2[2] = {300, 400};
std::copy(data1, data1 + 2, std::ostream_iterator<long>(std::cout, " ")); std::cout << std::endl;
std::copy(data2, data2 + 2, std::ostream_iterator<long>(std::cout, " ")); std::cout << std::endl;
__asm {emms}
__asm{
movq mm0, data1
movq mm1, data2
movq data1, mm1
movq data2, mm0
}
__asm {emms}
std::copy(data1, data1 + 2, std::ostream_iterator<long>(std::cout, " ")); std::cout << std::endl;
std::copy(data2, data2 + 2, std::ostream_iterator<long>(std::cout, " ")); std::cout << std::endl;
return 0;
}
0333デフォルトの名無しさん
2005/06/12(日) 17:15:140334デフォルトの名無しさん
2005/06/12(日) 17:18:53万人がそこまでやるやらないは別として、
何もわかっちゃいないアフォに強制するコードとしては、
そのほうがいいのかもしれない。
ポインタでヴァグを出しまくりのヤツには
仕方のない仕打ちかと思われ(アナタのことじゃないよ)。
0335デフォルトの名無しさん
2005/06/12(日) 17:24:050336デフォルトの名無しさん
2005/06/12(日) 17:50:38そんな奴にC++でコード書かせるなよ、と
0337デフォルトの名無しさん
2005/06/12(日) 18:17:490338デフォルトの名無しさん
2005/06/12(日) 19:04:09こんな感じです。
でもひとつの構造体を使いまわしてるし
信憑性は低そう。
ttp://www.uplo.net/www/vip15568.zip
0339デフォルトの名無しさん
2005/06/12(日) 20:26:350340デフォルトの名無しさん
2005/06/12(日) 22:53:560341デフォルトの名無しさん
2005/06/12(日) 22:56:27メモリが確保されているかいないかを判断するのって、
ポインタにNULLが入ってるかいないか以外にどうやって判断してるの?
なんか確認できる関数ってあったっけ?
0342デフォルトの名無しさん
2005/06/12(日) 23:09:57何かを指すかもしれないし指さないかもしれないポインタに
0を入れて「何もさしていない」と明示するのは、今の話題とは違うだろ。
0343デフォルトの名無しさん
2005/06/12(日) 23:14:010344デフォルトの名無しさん
2005/06/13(月) 00:29:17swap を特殊化するならコピーする必要はないでしょ。
ポインタをswapすればいいだけ。
0345デフォルトの名無しさん
2005/06/13(月) 00:50:30メモリリークやりたい放題したい放題だね。
0346デフォルトの名無しさん
2005/06/13(月) 00:52:25だから「そもそも」って改めて聞いてるんだけど。。。
0347デフォルトの名無しさん
2005/06/13(月) 00:56:45それ、どこにレス付けてんの?
0348デフォルトの名無しさん
2005/06/13(月) 00:58:220349デフォルトの名無しさん
2005/06/13(月) 01:00:47COMのAddRef()/Release()に比べりゃよっぽど管理しやすい
0350デフォルトの名無しさん
2005/06/13(月) 01:24:44ふつー CComPtr か CComQIPtr 使うでしょ。
0351デフォルトの名無しさん
2005/06/13(月) 01:29:310352デフォルトの名無しさん
2005/06/13(月) 01:48:36いや_com_ptr_tだろ
0353デフォルトの名無しさん
2005/06/14(火) 07:03:300354デフォルトの名無しさん
2005/06/14(火) 16:11:34std:vectorは、デフォルトで、どれだけのサイズが設定されているのでしょうか?
たとえば、
std::vector<int> nVal:
とすれば、デフォルトのベクター配列のサイズというものがあると思いますが。
0355デフォルトの名無しさん
2005/06/14(火) 16:19:20引数無しのコンストラクタで初期化したら初期サイズは0だよ。
0356デフォルトの名無しさん
2005/06/14(火) 20:52:430357デフォルトの名無しさん
2005/06/14(火) 21:20:090358デフォルトの名無しさん
2005/06/14(火) 21:36:01すごい質問だな。
C++ で Composite パターンを実装するときに
std::vector を用いることはあるかもしれないけど・・・
0359デフォルトの名無しさん
2005/06/14(火) 23:33:32capacity() については規定されてなさげ。以下、俺メモ。
> 23.2.4.1
> Complexity: The constructor template <class InputIterator> vector(InputIterator first, InputIterator last)
> makes only N calls to the copy constructor of T (where N is the distance between first and last) and
> no reallocations if iterators first and last are of forward, bidirectional, or random access categories.
> It makes order N calls to the copy constructor of T and order logN reallocations if they are just input
> iterators.
no reallocations ということは最初に要素数を調べて最低でもその分は capacity() を確保しておく、と。
InputIterator の場合は、reallocation が発生するので N ではなくて O(N) のコピーコンストラクタ呼び出しが発生する、と。
O(logN) の reallocation ということは、capacity() を倍々にしていく、みたいな方法がとられると考えられる、と。
0360デフォルトの名無しさん
2005/06/17(金) 00:05:35priority_queueとの違いがよくわかりません。
単にインターフェースが違うだけなのか、それとも計算量自体異なるのか…。
両方とも2分木探索をしているのではないですか?
0361デフォルトの名無しさん
2005/06/17(金) 00:21:02mapの「ソートされている」という性質はあくまで二次的なもので、
「key-valueのペアを格納し、keyを指定しての高速なデータアクセスを提供する」
のがmapの目的。
全然違うでしょ。
0362デフォルトの名無しさん
2005/06/17(金) 00:21:57priority_queueにはempty(),size(),top(),pop(),push()しかなく、内部では
heapを使っている。
mapはその他たくさんのメンバを持っていて、2分木探索をしているという
保証まではしていない(計算量のみ)。
0363360
2005/06/17(金) 00:47:39>>361
ソートされているという性質が二次的なものであったとしても、
実際問題、イテレータを使ってpriority順にアクセスできるのであれば
目的に適っていると思うのですが…。
そうしたい場合のpriority_queueの効率がmapよりも優れている、
というのであれば納得です。
>>362
heapもmapも、要素挿入は対数時間、priority最大要素の取得は定数時間、
という認識は間違っていないでしょうか??
2分木探索をしている保証はなくても、計算量が保証されていれば私としては十分なのですが…。
0364360
2005/06/17(金) 00:49:04つまり、聞きたかったことはpriority_queueの存在意義です。
0365デフォルトの名無しさん
2005/06/17(金) 00:55:53まあその分、make_heapするたびにコピーとかいっぱいしてそう。
0366デフォルトの名無しさん
2005/06/17(金) 01:57:26std::priority_queue<>::push()ではstd::push_heap()を、std::priority_queue<>::pop()
ではstd::pop_heap()を使っているだろうし(少なくともそうしたときと同じ効果である
事が保証されているから)、毎回std::make_heap()するわけじゃないからそこまで
なさそう。
>>364
ということで、計算量の保証に対する認識としては正しい。std::map<>というよりも
std::set<>の方が近いかもしれないけれども。std::priority_queue<>自体は、感覚と
してはstd::make_heap()、std::push_heap()、std::pop_heap()とコンテナをカプセル化
したと考えればいい。普通の実装を考えればstd::set<>の方が各ノードのポインタ
の分余計にスペースをとっているから、その分単なるシーケンスである
std::priority_queue<>の方が省スペースだろう。もしかしたらstd::set<>の方が挿入
や削除に時間がかかるかもしれない。例えば赤黒木で実装されていたら木の組み
換えの際にビット操作を行っている場合もある。計算量の保証だけで十分なので
あればどちらを使っても構わない。無能な上司のせいで後で仕様が変わって、中を
いじらなければならなくなるかもしれない。そうでなければstd::priority_queue<>を
使うのが必要十分だろうね。
0367360
2005/06/17(金) 02:07:48むはー。ありがとうございます。
私もなんとなく>>365さんのように「コンテナを別に持ってそれに演算を加えてたら
余計な計算たくさんしてそう」程度に考えてたのですが、
map(set)も結局コンテナ構造の維持に手間を割いているわけですね。
私の用途だとpriority_queueの方が意味的にあっているので、そちらを使う踏ん切りがつきました。
どうもでしたー。
0368デフォルトの名無しさん
2005/06/17(金) 02:43:03平衡探索木などとは対照的に一般の要素の削除が平均・最悪でO(N)かかります.
一方で空間消費量の点で大きな強みがあり,
最小(最大)要素の削除のみを必要とする,あるいはそれが主たる演算となる
priority queueの実装にヒープが最適な場合が多いというのが通説だったと思います.
0369デフォルトの名無しさん
2005/06/17(金) 06:13:18listを使ってるのですが、
class USER
{
public:
int age;
char name[16]
char memo[64];
};
std::list<USER> userlist;
これをUSERのメンバのnameでソートしたい場合どのようにすればいいのでしょうか?
sortを使った場合、入門サイト見る限りはstd::list<int> numlist;のような場合は出来るようですが、個々のメンバに対しては出来ないようなので・・・
また、nameを検索したい場合、algorithmでそのような関数は用意されてますか?
0370デフォルトの名無しさん
2005/06/17(金) 07:34:54template<class Compare>
void std::list::sort(Compare comp);
0371デフォルトの名無しさん
2005/06/17(金) 15:36:20std::vector<std::vector<float>> matrixA(10)
って感じで作ったけど
for(i=0;i<10;i++)
matrixA[i].resize(20)
って感じで初期化しないといけないよね。
でもこうすると2次元配列がメモリー上でちゃんとならんでくれない
つまり
float *pf=&matrixA[0][0]
としたとき
pf[i*20+j]=matrixA[i][j]
になってくれない。ちゃんとメモリーに並ぶように
2次元配列を作る方法ないのかな
0372デフォルトの名無しさん
2005/06/17(金) 15:45:59おとなしく boost::multi_array 使っとけ。
0373デフォルトの名無しさん
2005/06/17(金) 15:52:14matrixを使いたい。あれもメモリー上で
きちんと並んでることは保障されてるの?
0374デフォルトの名無しさん
2005/06/17(金) 16:03:39用途が全然違うんだが…。
0375デフォルトの名無しさん
2005/06/17(金) 16:13:06boost::numerics::ublas::c_matrix<10,20>
が目的のものだった。
0376デフォルトの名無しさん
2005/06/17(金) 20:09:280378デフォルトの名無しさん
2005/06/19(日) 17:01:22nposとは何をさしてるのでしょうか?
http://www.wakhok.ac.jp/~sumi/stl/header/string.html
0379デフォルトの名無しさん
2005/06/19(日) 17:12:56ISO/IEC 14882:1998 21.3 Template class basic_string -6
namespace std {
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
class basic_string {
public:
//...
static const size_type npos = -1;
0380デフォルトの名無しさん
2005/06/19(日) 17:49:22そんな風に書くと>>378が直接-1と比較するコードを書いてしまいそうだ。
0381デフォルトの名無しさん
2005/06/19(日) 17:49:350382デフォルトの名無しさん
2005/06/19(日) 17:53:32何も刺してないからnposなんだと
0383デフォルトの名無しさん
2005/06/19(日) 17:58:51最低でも禿本くらいは読め
0384378
2005/06/19(日) 18:18:38それで問題なくプログラムが動いてます。
ハイ。
MFCのCStringやCArrayからSTLへ移植中です。
0385デフォルトの名無しさん
2005/06/19(日) 18:23:02おいおい....
「動けばいいってモンじゃねーだろ」という言葉をプレゼントしておこう
きみ、
EOFもつねに-1と書いて
NULLはつねに0と書いて
Cならプロトタイプ宣言など絶対にせず
nとかiとかいうグローバル変数を定義するタイプか?
0386デフォルトの名無しさん
2005/06/19(日) 18:24:21-1使うな。std::string::npos使え。
0387デフォルトの名無しさん
2005/06/19(日) 18:29:060388384
2005/06/19(日) 18:38:03nposというメンバがあるんですね。
知りませんでした。
本当に、すいませんでした。
0389デフォルトの名無しさん
2005/06/19(日) 18:52:23>>379で真っ先に書いてある。
0390デフォルトの名無しさん
2005/06/19(日) 22:05:350391デフォルトの名無しさん
2005/06/20(月) 03:19:500392デフォルトの名無しさん
2005/06/20(月) 03:28:39失敗がEXIT_FAILUREだけってのも使いものにならんし
0393デフォルトの名無しさん
2005/06/20(月) 05:42:04それは同じであることが保証されてるぞ
NULLと違って
0394デフォルトの名無しさん
2005/06/20(月) 06:11:28EXIT_SUCCESS なんて使った事がないんだが、それより
() 付けちゃうってのがアレだなあ。
0395デフォルトの名無しさん
2005/06/20(月) 06:18:350396デフォルトの名無しさん
2005/06/20(月) 06:45:24何でもない。忘れて。吊ってくるから…orz
0397デフォルトの名無しさん
2005/06/20(月) 09:54:190398デフォルトの名無しさん
2005/06/20(月) 16:24:10するんだよな。
newとかdeleteとか、全部括弧がついていたら苦労しないのにと思ったことも
あったような希ガス。
0399デフォルトの名無しさん
2005/06/20(月) 16:45:37VC++6,.NET 2003, gcc-3.3.3 でデフォルト構築したテンポラリをコピーしやがりますよ?
#include <iostream>
#include <vector>
class V {
public:
V() : m_v(num++) {print("Constructor"); }
V(const V& v) { m_v = v.m_v; print("CopyConstructor"); }
V& operator=(const V& v) { m_v = v.m_v; print("="); return *this; }
virtual ~V() { print("Destructor"); }
private:
void print(const char* s) { std::cout << s << ":" << m_v << std::endl; }
static int num;
int m_v;
};
int V::num = 0;
int
main()
{
std::vector<V> v(5);
return 0;
}
0400デフォルトの名無しさん
2005/06/20(月) 18:18:19これがコンストラクタ。当然そうなるわな。
explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());
0401デフォルトの名無しさん
2005/06/20(月) 22:46:30・ループで push_back()
・back_inserter を使って generate_n()
他、どんなもんでしょ?
0402デフォルトの名無しさん
2005/06/21(火) 00:35:140403デフォルトの名無しさん
2005/06/21(火) 02:17:06typedef struct {
char str[512];
} t_str512;
std::vector<t_str512> strings;
という風に固定幅(片方の次元が)の2次元配列を作成するのに、
いつも固定幅の配列の方を定義してるんですが、
便利な方法はありませんか
std::vector<char[256]>のような直感的な書き方がしたいのです。
0404デフォルトの名無しさん
2005/06/21(火) 02:24:43固定幅の配列をテンプレートで書けば良い。
std::vector<array<char, 512> > strings;
boost::arrayがまさにそれ。
0405デフォルトの名無しさん
2005/06/23(木) 15:01:11string->vector は
std::string s;
std::vector<char> v;
std::copy(s.begin(), s.end(), std::back_inserter(v));
みたいなので出来るかと思うのですが、逆はどうしたら良いのでしょうか。
std::getline() が使えると嬉しいのですが。
0406デフォルトの名無しさん
2005/06/23(木) 15:13:35back_inserterはstringにも使えるが。
そもそも、
std::string s;
std::vector<char> v(s.begin(), s.end()); /* string -> vector */
std::string s1(v.begin(), v.end()); /* vector -> string */
で十分じゃないか?
0407デフォルトの名無しさん
2005/06/23(木) 15:26:23struct myData
{
float key;
Dtata data;
}
格納される順番は myData.key の昇順で並ぶようにしたい。
priority_queueでこんなことできるの?
0408デフォルトの名無しさん
2005/06/23(木) 15:42:58keyで比較する関数オブジェクトを比較関数(第三テンプレート引数)に指定するべし。
0409デフォルトの名無しさん
2005/06/23(木) 21:36:460410デフォルトの名無しさん
2005/06/24(金) 22:58:45Primer一回立ち読みでもしてみては?
0411デフォルトの名無しさん
2005/06/25(土) 00:17:22for (set<X>::iterator it = foo.begin(); it != foo.end(); ++it)
if (it->IsInvalid())
foo.erase(it);
って想定通りの挙動してくれないでしょうか
set<X>::iterator it = foo.begin();
while (it != foo.end()) {
if (it->IsInvalid()) {
if (foo.erase(*it)==0)
++it;
else
it = foo.begin();
}
}
こんなコードしか思いつかなくて泣きそうなんですが…
0412デフォルトの名無しさん
2005/06/25(土) 00:21:27if (it->IsInvalid()) {
foo.erase(it);
it = foo.begin();
}
else
++it;
です
0413デフォルトの名無しさん
2005/06/25(土) 00:23:52it = foo.erase(it);
setに限らずSTLコンテナのeraseは削除した要素の次を指すイテレータを返す。
0414411
2005/06/25(土) 00:33:30Σ(゚д゚lll)ガーン
私の手元の資料だとiteratorを引数にとるeraseの戻り値はvoidで
実際アドバイスどおりのコーディングすると「許されない型」と怒られます…
0415デフォルトの名無しさん
2005/06/25(土) 00:51:070416デフォルトの名無しさん
2005/06/25(土) 00:57:04ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130
Defect とされてはいるものの、現行の規格では
AssociativeContainer(set,map,multiset,multimap) の
erase() は void を返すと決められているので
it = foo.erase(it) が動作しない環境のほうが多いんじゃないか?
Effective STL かなんかに載ってたと思うが、
erase() が void であっても動くコードにしとくのが正解だろう。
set<X>::iterator it = foo.begin();
while (it != foo.end()) if (it->IsInvalid()) foo.erase(*it++); else ++it;
0417411
2005/06/25(土) 01:06:26簡潔な例にするためにsetで書きましたが
実装はmapでやってたのでこんな不気味な演算子になりました
pool_t::iterator it = m_Pool->begin();
while (it != m_Pool->end())
{
if (it->second.IsAlone())
m_Pool->erase(it++->first);
else
++it;
}
0419デフォルトの名無しさん
2005/06/25(土) 01:16:17iteratorを引数に取るeraseを呼べば良くないですか?
m_Pool->erase(it++);
eraseの内部実装的にも恐らくこちらが速いでしょうし.
ただ,multi(set|map)の場合はkeyを引数に取るeraseと
iteratorを引数に取るeraseで意味が異なるので注意が要りますけれど.
0420419
2005/06/25(土) 01:17:000421デフォルトの名無しさん
2005/06/25(土) 02:08:21あなたゎこの1ヶ月以内に好きな人と両思い
またゎ付き合っている子ゎすごくLOVE2になります!!
それにゎこの文章をコピーして他の掲示板に3回別の掲示板に
はればOK!!!たったこれだけであなたわぁ
最高の生活がおくれます!!
ただしこれをしなかったら
きっと両思いになることゎないでしょう!!(/□≦、)
やった子ゎ今でゎ学校1のLOVE2カップルです!!
これをやらなかった子ゎすぐに彼氏と別れてしまいました
0422デフォルトの名無しさん
2005/06/25(土) 14:21:18好きな人がいません。どうしたら良いですか。
0423デフォルトの名無しさん
2005/06/25(土) 15:55:06あいちゃんとLOVE2になれますか?
私は30代独身です。彼女いない暦=年齢です。
0424デフォルトの名無しさん
2005/06/26(日) 01:12:12君が恋愛する事自体が犯罪
0425デフォルトの名無しさん
2005/06/26(日) 03:20:46あいちゃんてOOスレに出てくるアンチOOのお猿さんでしょ?
0426デフォルトの名無しさん
2005/06/26(日) 03:23:40諦めろ。君の恋愛の対象となった女の子の人生が可愛そうな事になる。
0427デフォルトの名無しさん
2005/06/26(日) 03:23:45予定外の動作をするSTLって、正直ダメなんじゃないか?
STLを使う前からインターフェースだけ見てその罠を全て見抜ける天才なんか存在しないわけだし。
そんなfragileなライブラリってやっぱダメだろ?
0428デフォルトの名無しさん
2005/06/26(日) 03:44:23それは、あんたの頭がパーだから。STL向きじゃないので、すぐにC++を
触るのをやめましょう。
0430デフォルトの名無しさん
2005/06/26(日) 04:28:310431デフォルトの名無しさん
2005/06/26(日) 04:56:46図星を突かれたからと言って、ファビョんなよw
0432デフォルトの名無しさん
2005/06/26(日) 05:18:590433デフォルトの名無しさん
2005/06/26(日) 05:33:23なんか改善案があるなら教えてくれよ。
0434デフォルトの名無しさん
2005/06/26(日) 06:07:16そう思うんならC++標準委員会で発言してみろ。
できない癖に偉そうな口聞くんじゃない。
0435デフォルトの名無しさん
2005/06/26(日) 15:01:360436デフォルトの名無しさん
2005/06/26(日) 21:49:42,.∩ `ヽ
〃∪'´ ̄`二二人\ ヽ
| ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ',
|ハ ,ニ、 ,. - 、 | | | l |
| ハ ィハ ,二ヽ. | | | | | 同じ板にコピペするとそのままだけど、
| | | じ' |トJ〉 /)} l | 違う板にコピペすると鬼のような怖い顔
| ハ 、'_,  ̄,, 厶イ川| に変わる摩訶不思議な佳子様コピペ。
l l /\ .. イV\川 |
,' l l ,イ `l ̄´ / /ヽl l
l | l ハ `メ、 〃 ヽヽ、__ノ
l ∨ └‐イ「ト--ァ'´ ハヽ__ノ
ヽ/ } l」」 / / }`ー
〈_n| 八 / / /ノ
〈二二人 c /\/ / , イ
/ /厂 /\__>< {_
0437436
2005/06/26(日) 21:50:10全然かわんねーじゃん!!
騙された・・・orz
0438デフォルトの名無しさん
2005/06/26(日) 23:30:35「一部の馬鹿を冷徹に置き捨てることを厭わない」言語だからねえ。
どうしても、肯定派の会話は戦略会議的に、否定派の会話はしゃべり場的に
なっちゃうね。
0439デフォルトの名無しさん
2005/06/26(日) 23:41:04┃┌╋──╋┐┃
└╋┘ └╋┘
┃ ・ ・ ┃ ┌━━┐
●━╋┐ ┌╂━━━━╂┐ ┃
└━┷┴━━╂┘ └╋━┘
┌╋┐ ┌╋┐
バカには出来ない ┃└╋╋━━╋╋┘┃
C++です ┃ ┃┃ ┃┃ ┃
┃ ┃┃ ┃┃ ┃
└━┘┘ └└━┘
0440デフォルトの名無しさん
2005/06/27(月) 03:37:24C++ならではのバグに悩まされて泣き言言っている連中がよく言うぜw
笑わせるな凡人風情がw キミたちの為にJavaはある。
0441デフォルトの名無しさん
2005/06/27(月) 10:05:37>C++ならではのバグ
詳 し く
0442デフォルトの名無しさん
2005/06/27(月) 10:50:32Javaで書き直すしかないのかな
0443デフォルトの名無しさん
2005/06/27(月) 23:37:300444デフォルトの名無しさん
2005/06/28(火) 01:15:43ARM C++用に、boostとSTLを自分で書く。
0445デフォルトの名無しさん
2005/06/28(火) 03:51:45しゃべり場の参加者にその質問は酷。
0446デフォルトの名無しさん
2005/06/28(火) 18:09:030447デフォルトの名無しさん
2005/06/29(水) 13:35:38ttp://www.gamedev.net/community/forums/topic.asp?topic_id=327860
0448デフォルトの名無しさん
2005/06/30(木) 00:01:32"Go ahead and use the STL" と書いてあるのが見えないのか?
0449デフォルトの名無しさん
2005/06/30(木) 03:20:31馬鹿だ・・・・
0450デフォルトの名無しさん
2005/06/30(木) 13:31:03カスタムアロケータを使えと書いてある
0451デフォルトの名無しさん
2005/06/30(木) 15:51:36なんか凄い間抜けな仕様だと聞いた事がある。
0452デフォルトの名無しさん
2005/06/30(木) 22:27:10vigra::MultiArray
のほうが機能が充実してて使いやすい気がするんだけど
俺だけ?
0453デフォルトの名無しさん
2005/06/30(木) 23:03:27|ω・´)バイアグラ?
0454デフォルトの名無しさん
2005/06/30(木) 23:28:16スレ違い
0455デフォルトの名無しさん
2005/07/01(金) 13:22:47vigraは画像処理がメインのターゲットだけど
vigra::MultiArray は一般的に使える
例えば行列演算のvigra::Matrixは
vigra::MultiArrayの特殊化
数値計算関係はboostは充実してないって結論に達したけど
反論求む
boostの行列演算
boost::numerics::ublas::matrix
は、ublas::matrixViewクラスがないので使いにくい
boost::numerics::ublas::matrixは
boost::multi_arrayの派生クラスになってないよね?
0456デフォルトの名無しさん
2005/07/01(金) 13:29:120457デフォルトの名無しさん
2005/07/01(金) 20:44:02別にいいんじゃねえ?
話題ねえし
0458デフォルトの名無しさん
2005/07/01(金) 21:35:140459デフォルトの名無しさん
2005/07/01(金) 23:31:22「反論求む」とかバカじゃねえの?
0460デフォルトの名無しさん
2005/07/02(土) 06:35:19このスレは要らなくなったわけだが。
0461デフォルトの名無しさん
2005/07/02(土) 17:59:07(ssはstringstreamの変数名としてます)
ss.flush(); とか ss << std::flush; とか何も起こらないみたいですがどうなってるんでしょうか?
0462デフォルトの名無しさん
2005/07/02(土) 18:34:07ss.str(""); でいい。
flush()は、std::stringstreamがデバイスに連結されている訳ではないので、
何も起きない。継承上の残骸と思えばいい。
0463デフォルトの名無しさん
2005/07/02(土) 18:49:52そうだったんですか。
どうもありがとうございます!
0464デフォルトの名無しさん
2005/07/02(土) 20:26:28>boostの行列演算
>boost::numerics::ublas::matrix
>は、ublas::matrixViewクラスがないので使いにくい
matrixView ってどんなクラス?意味がわからん。
ExpressionTemplate なら実装されてるが。
>boost::numerics::ublas::matrixは
>boost::multi_arrayの派生クラスになってないよね?
派生クラスである必要は全くないし、
派生クラスだったらむしろ困る。
メモリの並び方とか指定できないじゃん。
0465デフォルトの名無しさん
2005/07/03(日) 19:49:06賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。
プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/
理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
0466デフォルトの名無しさん
2005/07/04(月) 10:29:39void insertion(list<string> & a, int l, int r)
{int i, j;
for(i=l+1; i<=r; i++)
{
string temp = a[i];
j = i;
while((j>l) && (temp < a[j-1]))
{
a[j]=a[j-1];
j--;
}
a[j] = temp;
}
}
上記の挿入ソートにリストを受け渡そうとしていたのですがvectorやdequeのように ls[] とするとエラーになってしまいます。
list<string> ls;
ls.push_back("c");
ls.push_back("a");
ls.push_back("b");
insertion(ls, 0, ls.size()-1);
そこで、list<string>::iterator it = ls.begin();などとして、なんとかリストの受け渡しをしようと試行錯誤してみたのですがうまくいきません、大変お手数ですが、何かアドバイスなどございましたら、お聞かせいただけないでしょうか。
0467デフォルトの名無しさん
2005/07/04(月) 11:14:28listはランダムアクセス出来ないから無理。
対処としてはsetを使う。
0468デフォルトの名無しさん
2005/07/04(月) 11:19:31listを渡すのではなく、iteratorを二つ渡せば?
んで、operator[]を使わずにiteratorを++すると。
#つーか、std::sort()の実装でも見てみたら?
0469デフォルトの名無しさん
2005/07/04(月) 11:52:51>>467 さま
setをどのように利用すればよろしいでしょうか。
>> 468 さま
iterator を2つといいますと、ls.begin();に対して2つ設定するということでしょうか。
大変申し訳ございませんが、再度ご教授お願いします。今からsetおよびstd::sort
()に関して調べてきます。
0470デフォルトの名無しさん
2005/07/04(月) 11:57:32但し、O記法で、本来のオーダーが出なくなってしまう物があるので、
そういうのはSTLには入っていない。
0471デフォルトの名無しさん
2005/07/04(月) 11:58:28set について調べれば使い方がわかるだろう。
sort について調べれば「iteratorを二つ」の意味がわかるだろう。
質問は自分で調べてからにしような。
0472468
2005/07/04(月) 12:03:32それでも分からなければ教示しないでもないが。
0473デフォルトの名無しさん
2005/07/04(月) 12:13:010474デフォルトの名無しさん
2005/07/04(月) 15:28:30調べることを頑張らないまま皮肉を頑張りに来るぞ。
0475デフォルトの名無しさん
2005/07/04(月) 16:50:580476デフォルトの名無しさん
2005/07/04(月) 16:58:48string限定という糞ぶり、こんなの書いてきたらグーパンチだろうが、何かの参考にどうぞ
template <typename BidirectionalIterator>
void insertion(BidirectionalIterator first, BidirectionalIterator last) {
for (BidirectionalIterator i = ++first; i != last; ++i) {
string temp = *i;
BidirectionalIterator j = i, current = j;
while ((current = j) != first) *current = *(--j);
*current = temp;
}
};
list<string> ls;
insertion(ls.begin(), ls.end());
0477デフォルトの名無しさん
2005/07/06(水) 18:45:56それともvectorのように再配置が起きて使えなくなる、といったことがあるのでしょうか?
0478デフォルトの名無しさん
2005/07/06(水) 19:01:08問題ない。
23.1.2の8
The insert members shall not affect the validity of iterators and references to the container, and the erase
members shall invalidate only iterators and references to the erased elements.
0479デフォルトの名無しさん
2005/07/06(水) 21:30:260480デフォルトの名無しさん
2005/07/06(水) 22:56:14STLport(4.6.2)をmakeしてインストールしたら
コンパイルは通るようになったが、リンクでlibc(d).libと
バッティングしてしまいました。
lb_test error LNK2005: ____lc_codepage_func は既に LIBCD.lib(initctyp.obj) で定義されています。
なかんじで。対処法ご存知でしたら教えていただけないでしょうか?
0481デフォルトの名無しさん
2005/07/06(水) 23:20:50Tribial C++とか言う本がありそうだな。
0482481
2005/07/06(水) 23:21:250483デフォルトの名無しさん
2005/07/07(木) 00:14:20○.net2003のVCでSTLを使った初心者丸出しコードがコンパイル通らないので
0484デフォルトの名無しさん
2005/07/07(木) 00:49:10マルチスレッドDLLを選択しろ。
0485デフォルトの名無しさん
2005/07/07(木) 11:57:00const文脈においてdereference演算子の返り値をT * constではなくconst T*にする、
あるいはbegin(), end()の返り値をstl::vector<T*>::const_iteratorではなく
stl::vector<const T*>::iteratorにする、あるいはコピーコンストラクタで
引数stl::vector<T*>を受けてstl::vector<const T*>(ライクな型)に変換する
お約束の方法などはあるのでしょうか?
boostのiterator_adaptorsが多分目的に適っているのですが、
自前で簡潔に書けるのであればなるべくそうしたいのです。
0486デフォルトの名無しさん
2005/07/07(木) 14:47:08C++ではconst属性に対する抜け道もちゃんと用意されている。
const_cast<T*>(p);
0487デフォルトの名無しさん
2005/07/07(木) 15:25:24vector<const T*> const_vec(nonconst_vec.begin(), nonconst_vec.end());
0488485
2005/07/07(木) 18:22:17どうもありがとう。
>>486
std::vector<const T*>::const_iterator
begin(void) const { return std::vector<const T*>::const_iterator(const_cast<const T**>(&*m_vector.begin())); }
これでうまくいくのを確認したのですが、こんなもんでしょうか?
スマートでなければ指摘して頂けるとありがたいです。
>>487
イテレータを渡すのですね。どうもです。
0489485
2005/07/07(木) 18:46:47std::vector<const T*>::const_iterator
begin(void) const { return std::vector<const T*>::const_iterator((T**)(&*m_vector.begin())); }
としてもよいのですね…。
0491デフォルトの名無しさん
2005/07/08(金) 00:26:40T** から vector<T*>::const_iterator は変換 construct できるとは限らないのでは?
0492デフォルトの名無しさん
2005/07/08(金) 00:52:00実装依存でいいならあとはコンパイルさえ通れば大丈夫だろうけど、
規格上 std::vector<const T*>::const_iterator が const T** で初期化できるなどという保証は無い。
さらに、たとえポインタの指す先の const が違うだけでも、
要素型の違う std::vector の間で iterator を相互変換できる保証も無い。
class vector_485
{
std::vector<T*> m_vector;
↑こんな感じで標準コンテナに準拠したラッパーを作るって話なら
iterator 型をポインタの typedef にすれば実装できそう。
0493デフォルトの名無しさん
2005/07/08(金) 00:54:30コンパイルが通って、なおかつその処理系のドキュメントが
期待する動作を保証しているならば、ね。
0494デフォルトの名無しさん
2005/07/08(金) 01:17:06エラーになるんですが、これって標準なんですか?
'\0'も一応文字だと思うんですが、なぜエラーに・・
0495デフォルトの名無しさん
2005/07/08(金) 01:22:04basic_string<char>::basic_string(char);
こういうコンストラクタがないからじゃないか?
0496デフォルトの名無しさん
2005/07/08(金) 01:22:14'\0' は文字と言えるが、 NULL は断じて文字ではない。
0497デフォルトの名無しさん
2005/07/08(金) 01:22:460498デフォルトの名無しさん
2005/07/08(金) 01:50:440499485
2005/07/08(金) 01:59:10ありがとうございます。
> 要素型の違う std::vector の間で iterator を相互変換できる保証も無い。
まさにここを解決したかったわけですが、うまい方法はないようですね。
>>492の方法も試してみます。書いてみて格好悪かったら…とりあえず>>489でいきます。
> 規格上 std::vector<const T*>::const_iterator が const T** で初期化できるなどという保証は無い。
重々承知ですm_ _m
でもvectorのiteratorをポインタで初期化できない実装って存在するのでしょうか?
ただの興味ですが。
0500デフォルトの名無しさん
2005/07/08(金) 02:12:29> でもvectorのiteratorをポインタで初期化できない実装って存在するのでしょうか?
#include <vector>
std::vector<int>::iterator x(int* p) { return p; }
$ g++ -fsyntax-only
: In function `__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > x(int*)':
:2: error: conversion from `int*' to non-scalar type `__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >' requested
0501デフォルトの名無しさん
2005/07/08(金) 02:36:17Metrowerks CodeWarrior for Windows v8.3
エラー: 'int *'から'std::__wrap_iterator<std::vector<int, std::allocator<int>>, int *>'への
不当な暗黙の変換です。
0502デフォルトの名無しさん
2005/07/08(金) 05:56:17std::string str( '\0' );
とやっても不正アクセス例外になりますよ・・
長さゼロのstd::stringインスタンスが存在できるということは
内部的に長さゼロの文字列は('\0')を持つことと同義ですよね。
うー納得いかねえ
0503デフォルトの名無しさん
2005/07/08(金) 06:09:35だからそういうコンストラクタはないっつーに。
std::string str(""); ならわかるが。
0504デフォルトの名無しさん
2005/07/08(金) 06:46:10うわーやっとわかりました。
いままで'\0'と"\0"の違いがわかってなかったです。
ありがとう君。
0505デフォルトの名無しさん
2005/07/08(金) 06:59:310506デフォルトの名無しさん
2005/07/08(金) 10:33:510507485
2005/07/08(金) 10:39:28#include <vector>
std::vector<int>::iterator x(int* p) { return std::vector<int>::iterator(p); }
で通りますが…。
0509デフォルトの名無しさん
2005/07/08(金) 11:15:49#include <vector>
std::vector<int>::iterator x(int* p) { return std::vector<int>::iterator(p); }
$ g++ -D_GLIBCXX_DEBUG -fsyntax-only
: In function `__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*,
__gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > > x(int*)':
:2: error: no matching function for call to `__gnu_debug::_Safe_iterator<
__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >,
__gnu_debug_def::vector<int, std::allocator<int> > >::_Safe_iterator(int*&)'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/debug/safe_iterator.h:122: (略
0510デフォルトの名無しさん
2005/07/08(金) 11:18:090511485
2005/07/08(金) 15:43:43おぉ。ありがとうございます。
手元のg++(3.3.1)ではg++ -D_GLIBCXX_DEBUG -fsyntax-onlyで通りますが、
3.4.4では駄目なのですね。
0512485
2005/07/08(金) 15:55:56知らないことだらけだ…。スレ違いご容赦。
0513デフォルトの名無しさん
2005/07/08(金) 20:40:25普通にコンパイルすると恥ずかしながら通った。#define _MSL_DEBUGすると
通らない。
エラー: 関数呼び出し '[std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>].__debug_iterator({lval} int *)' が一致しません。
std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator()'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator(const std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0> &)'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator<...>(const std::__debug_iterator<std::vector<int, std::allocator<int>>, __T1_0, 0> &)'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator(const std::vector<int, std::allocator<int>> *, int *const &)'
main.cpp 行: 4 std::vector<int>::iterator x(int* p) {return std::vector<int>::iterator(p);}
0514デフォルトの名無しさん
2005/07/09(土) 01:19:50vector<bool> 以外は clear するとメモリを開放するんですね。
意外でした。
0515デフォルトの名無しさん
2005/07/09(土) 04:18:03人はそれを環境依存と呼ぶ。
0516デフォルトの名無しさん
2005/07/10(日) 08:16:173つ以上コンテナの積和をSTLを使ってエレガントに実現
する方法はありませんか?
予定では3つから7つ程度のコンテナの積和が必要になり
ますが、できればSTLで実現したいと思っています。
以下自作コードです。
---------------------
template<class Iter1, class Iter2, class Iter3, class T>
T inner_product3( Iter1 f1, Iter1 l1, Iter2 f2, Iter3 f3, T init )
{
for( ; f1 != l1; f1++,f2++,f3++ )
init = init + ( *f1 * *f2 * *f3 );
return init;
}
#include<iostream>
void main()
{
int a[] = {1,2,3,4,5};
int b[] = {1,2,3,4,5};
int c[] = {1,2,3,4,5};
int sum = inner_product3( a, a+5, b, c, 0 );
std::cout << "sum=" << sum << std::endl;
}
0517デフォルトの名無しさん
2005/07/10(日) 12:50:28文字列検索の案件をしてるんですが、
std::stringでfindを呼び出し解析をしてましたが、
ためしに、CString(MFC)に変えてFind検索をしたら
劇的に早くなりました。
その辺どうなのでしょうか?
開発環境はVCです。
これは単にSTLが重いということでよろしいのでしょうか?
0518デフォルトの名無しさん
2005/07/10(日) 12:54:250519517
2005/07/10(日) 13:05:27思わず笑っちゃいました。
あまりの処理速度の違いにですw
もちろんMFCのほうが速いんですが。
時間を計測したら50倍ほど早く処理できてますね。
アルゴリズムには問題はないと思ってましたので、
どうしてこんなに重いのかと悩んでたら、
癌はSTLでした。
STLを使うのはやめようと思います。
0520デフォルトの名無しさん
2005/07/10(日) 13:23:43あーはいはいそれはよかったね。
ここはお前の日記じゃないから。チラシの裏にでも書いてろ。
0521デフォルトの名無しさん
2005/07/10(日) 13:24:22ついでに書くと、std::stringはSTLじゃないから。馬鹿ですねー
0522デフォルトの名無しさん
2005/07/10(日) 13:32:09あんまりきれいじゃないけど
template<class Iter1, class Iter2, class Iter3, class T>
T inner_product( Iter1 f1, Iter1 l1, Iter2 f2, Iter3 f3, T init )
{
vector <T> tmp (distance (f1, l1));
transform ( f1, l1, f2, tmp.begin (), multiplies <T> () );
transform ( tmp.begin (), tmp.end (), f3, tmp.begin (), multiplies <T> () );
return accumulate ( tmp.begin (), tmp.end (), init );
}
0523デフォルトの名無しさん
2005/07/10(日) 13:33:53速度にこだわるならstrstrのほうがCString::Findより3倍近く高速ですよ( ´∀`)
0524デフォルトの名無しさん
2005/07/10(日) 13:45:39strstrの逆検索バージョンはあるのでしょうか?
0525デフォルトの名無しさん
2005/07/10(日) 13:52:48ずっと速いだろうに。
0526デフォルトの名無しさん
2005/07/10(日) 13:56:00ttp://www2.starcat.ne.jp/~fussy/algo/algo7-4.htm
0527522
2005/07/10(日) 13:58:17コンテナ増えたらIteratorでなめる回数が増えて遅くなりそうだ
たぶん516の方がマシですね
忘れて
0528デフォルトの名無しさん
2005/07/10(日) 14:02:00STLは、標準化の際に大幅に内容を削除されたからね。
元々3D用のinner_product3D() なんてアルゴリズムもあったのかもしれない。
0529デフォルトの名無しさん
2005/07/10(日) 15:53:170530デフォルトの名無しさん
2005/07/10(日) 17:23:10VCについてくるSTLはあまりできがよくない。
STLPortを使うべきだろう。
0531デフォルトの名無しさん
2005/07/10(日) 18:38:350532デフォルトの名無しさん
2005/07/10(日) 21:17:110533デフォルトの名無しさん
2005/07/10(日) 22:18:54何か根本的なところで間違っている気がする
0534デフォルトの名無しさん
2005/07/10(日) 22:51:180535デフォルトの名無しさん
2005/07/10(日) 23:09:1650倍とか言われると流石に気になるだろ
給料50倍なら、2年働けば生涯年収越えちゃうんだぜ
0536デフォルトの名無しさん
2005/07/11(月) 00:40:47MFCって今後どうなっちゃうんだろう?
0537デフォルトの名無しさん
2005/07/11(月) 00:47:040538デフォルトの名無しさん
2005/07/11(月) 00:55:21察するに、参照カウント使って
共有してるかどうかの差が出たんじゃないか?
0539デフォルトの名無しさん
2005/07/11(月) 01:02:07簡単そうに見えるが。
0540デフォルトの名無しさん
2005/07/11(月) 14:41:48struc functor
{
operator()(Iterator it)
{
return (it+1)
}
}
0541デフォルトの名無しさん
2005/07/11(月) 14:48:39となりのとなり?
0542デフォルトの名無しさん
2005/07/11(月) 16:01:03Input Iterator なら隣に行ったらもう戻れない
Forward Iterator なら問題なし
it + 1 なんて書き方ができるのは Random Access Iterator
0543デフォルトの名無しさん
2005/07/11(月) 16:16:280544デフォルトの名無しさん
2005/07/11(月) 16:45:07functorは使えないんだね
operator()( 今いるとこ)
{
return (前 + 今いるとこ + 後)/3;
}
0545デフォルトの名無しさん
2005/07/11(月) 18:04:57Bidirectional Iterator(--と++ができるイテレータ)を取ればできるんじゃ。
std::listは双方向リストなので、Bidirectional Iteratorが使える。
ただし、現実的には、過去2つの値をメンバ変数に保存しておいて、
現在の値との平均を返した方がよさそう。
// functorを使うということは、iterativeなアルゴリズムだろうから
0546デフォルトの名無しさん
2005/07/11(月) 18:14:40{
int* average;
int index;
funct0( int* average_ ) : average(average_), index(0){}
result_type operator ()( argument_type arg ) const
{
average[index++] += arg;
}
};
struct funct1 : public std::unary_function< void, int >
{
int* average;
int index;
funct1( int* average_ ) : average(average_), index(0){}
result_type operator ()( argument_type arg ) const
{
average[index] += arg;
average[index++] /= 3;
}
};
0547デフォルトの名無しさん
2005/07/11(月) 18:15:12{
std::vector<int> srcarr:
std::vector<int> average( arcarr.size() - 2, 0);
for_each( srcarr.begin() + 0, srcarr.end() - 2; func0(average));
for_each( srcarr.begin() + 1, srcarr.end() - 1; func0(average));
for_each( srcarr.begin() + 2, srcarr.end() - 0; func1(average));
}
流石に無理あるな。
0548546-547
2005/07/11(月) 18:30:100549543
2005/07/11(月) 20:51:29こういうことがしたいの?
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
int main() {
using namespace std;
int a[] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,};
int size = sizeof(a)/sizeof(a[0]);
vector<int> v;
transform(a, a + size - 1, a + 1, back_inserter(v), plus<int>());
transform(a, a + size - 1, v.begin() + 1, v.begin(), plus<int>());
transform(v.begin(), v.end() - 1, ostream_iterator<int>(cout, "\n"), bind2nd(divides<int>(), 3));
}
0550デフォルトの名無しさん
2005/07/11(月) 21:07:06このvの中のいくつかがヌルポインターなんだけど、どうやって消したらいいの?
0551デフォルトの名無しさん
2005/07/11(月) 21:13:090552550
2005/07/11(月) 21:18:35ありがとうございます。
せっかくだからもうちょっとわかり易く教えていただけますか?
0553デフォルトの名無しさん
2005/07/11(月) 21:46:34std::remove()は3つ目の引数に一致する要素を探し、それを列の後ろへ集める。
そしてその集めた部分の先頭の位置を返し、そこからend()までは今回ヌルポインタの要素が集まっている。
そこをerase()で削除すればいいというわけ。
0555デフォルトの名無しさん
2005/07/11(月) 21:52:100556デフォルトの名無しさん
2005/07/12(火) 01:09:44な?
0557デフォルトの名無しさん
2005/07/12(火) 01:12:24あぁ。SGIのドキュメントにも載ってるぜ。
ttp://www.sgi.com/tech/stl/remove.html#1
0558デフォルトの名無しさん
2005/07/12(火) 01:17:42俺はstlの「シーケンスを変更するアルゴリズム」はそういうものだと理解すべきだと思うが。
remove_copyとの対称性もあるし。
0559デフォルトの名無しさん
2005/07/12(火) 01:54:39計算機世界の語感的にremoveは削除の意味で使われるケースが多いと思うので(辞書的には「移動」だけど)
(remove_copyも含めて)やっぱりわかりにくいと思います。
move_backwardとかの方がベタでわかりやすい…。
0560デフォルトの名無しさん
2005/07/12(火) 04:28:20「後ろ向きに動く」????
0561デフォルトの名無しさん
2005/07/12(火) 04:48:350562デフォルトの名無しさん
2005/07/12(火) 05:19:30??????
思わず辞書引いちまったじゃないかモルァ
0563デフォルトの名無しさん
2005/07/12(火) 06:48:560564デフォルトの名無しさん
2005/07/12(火) 10:42:57・・・長いな。
除く・詰める・最後尾を返す、の3点はどれも、省くと片手落ちの説明になるしなぁ。
0565デフォルトの名無しさん
2005/07/12(火) 12:55:46いや、俺は「削除」で良いと思う。
stlのアルゴリズムで要素を削除するというのは、それを後ろに移動して、
境目のイテレータを返すことに他ならない。
標準ライブラリなんだから、そういう知識を利用者に要求してでも
名前を簡潔にすることは正しい選択だと思う。
それに、こうやって理解しないと、removeとremove_copyを統一的に把握できない。
uniqueとunique_copyについても同様。
0566デフォルトの名無しさん
2005/07/12(火) 16:26:01君たちは根本的に勘違いしているj。
{1,0,5,7,0,6,4,0,4,8,3}
↓remove(..., 0);
{1,5,7,6,4,4,8,3,4,8,3}
ここを指すiteratorを返す
後ろに移動はしない。移動させる変な処理系もあるかもしれないが、それは定められた操作ではない。
0567デフォルトの名無しさん
2005/07/12(火) 16:57:26std::list::removeの動作はまた違うわけだが…
>>551
v.erase……
0568デフォルトの名無しさん
2005/07/12(火) 17:01:02まあその通りやね。
std::remove()の動作は、「削除した要素」は、「削除されなかった要素で
上書きされる」だから。
0570デフォルトの名無しさん
2005/07/12(火) 21:00:37確かにコンテナのサイズを変えるような処理はメンバ関数じゃナイトで金罠
0571デフォルトの名無しさん
2005/07/12(火) 21:05:07うん、だからヒープオブジェクトへの頭の悪いポインタのコンテナに対して
迂闊にremoveやuniqueを使うとメモリリークする
0572デフォルトの名無しさん
2005/07/13(水) 01:28:250573デフォルトの名無しさん
2005/07/13(水) 01:42:410574デフォルトの名無しさん
2005/07/13(水) 02:52:26アロケータのメンバ関数allocate()、deallocate()について調べてみ。
0575デフォルトの名無しさん
2005/07/13(水) 22:55:15っていうのがいまだに引っかかる
boostのホームページには
abstruction のコストは2倍ぐらいって
書いてあったんだけど
50倍って本当?
0576デフォルトの名無しさん
2005/07/13(水) 23:12:21たぶんdebug版でbuildして遅いとか言ってるんじゃないの?
もしdebug版を使っていたとすると、関数がinline化されなくて遅くなるから、それでSTLが癌と勘違いしたのでは。
俺はこの可能性が一番高いと思う。
まぁ単純にCStringが物凄い速い可能性もあるけど、さすがに50倍は無いと思う。
速度を計測してないから自信は無いけど。
0577デフォルトの名無しさん
2005/07/13(水) 23:20:100578デフォルトの名無しさん
2005/07/13(水) 23:31:27あとは、CString 同士の Find() は最近の結果をキャッシュしているとかかな。
MFC は触ったことさえないが。
0579デフォルトの名無しさん
2005/07/13(水) 23:59:38まあ、50倍ってのは無知が適当に書いただけにしか見えんが。
0580デフォルトの名無しさん
2005/07/14(木) 01:14:350581デフォルトの名無しさん
2005/07/14(木) 01:15:350582デフォルトの名無しさん
2005/07/14(木) 07:35:32http://pc8.2ch.net/test/read.cgi/tech/1119793525/529-540
0583デフォルトの名無しさん
2005/07/15(金) 03:49:04using namespace std;
wcout.imbue(locale("japanese"));
mbstate_t state = mbstate_t();
string in("波浪ワールド");
wstring out(in.size(),L'.');
cout << "Before:" << endl;
cout << in << endl;
wcout << out << endl << endl;
string::iterator in_it = in.begin();
wstring::iterator out_it = out.begin();
locale loc("japanese");
const codecvt<wchar_t,char,mbstate_t>& cdcvt = use_facet<codecvt<wchar_t, char, mbstate_t> >(loc);
cdcvt.in( state, in.begin(), in.end(), in_it, out.begin(), out.end(), out_it);
cout << "After:" << endl;
cout << in << endl;
wcout << out << endl;
0584デフォルトの名無しさん
2005/07/15(金) 04:54:03STLportにはstd::locale("japanese")なんか実装されてなかった希ガス。
0585デフォルトの名無しさん
2005/07/15(金) 11:08:27単に1文字ごとに static_cast< wchar_t > してただけだったような気がする。
0586デフォルトの名無しさん
2005/07/15(金) 12:27:450587デフォルトの名無しさん
2005/07/15(金) 15:42:46金もらわずに半ば趣味で作ってる人がほとんどだから、
「規格はこちらで決めるから、後はwchar_t関連などは、それぞれの国で
実装してちょ」って感じなんでしょ。ほとんどが7bit圏の人ばかりだったり、
そうでなくても7bitで我慢している人がほとんどだろう。
日本なんかはまだ恵まれている方。
0588583
2005/07/15(金) 18:27:07const codecvt<wchar_t,char,mbstate_t>& cdcvt =
use_facet<codecvt<wchar_t, char, mbstate_t> >(loc);
で成功しました.
stringのiteratorを渡せるのはreleaseモードの場合だけでした
c_locale_win32.cでMultiByteToWideCharを呼び出していました
0589デフォルトの名無しさん
2005/07/15(金) 18:56:20なんじゃそりゃ
localeの設定に関係なく、MultiByteToWideChar()で結局ACP依存の変換やっとるのか
バグっつーか腐ってるな
0590デフォルトの名無しさん
2005/07/15(金) 19:07:08バグではなくて、意図的な手抜きだろ。
0591デフォルトの名無しさん
2005/07/15(金) 19:28:44バグでしょ。あきらかに。>>588のコードで
CP932からUnicodeへの変換が行われるのが仕様通りだとでも?
0592デフォルトの名無しさん
2005/07/15(金) 19:49:22お前が直せ。これは手抜きだ。
0593デフォルトの名無しさん
2005/07/15(金) 20:14:200594デフォルトの名無しさん
2005/07/16(土) 00:05:08FromとToの関係が逆なような希ガス
copy(_Elem *_First1, const _Elem *_First2, size_t _Count)
において、_First2 → _First1 の方向にコピってるようだが...
0595デフォルトの名無しさん
2005/07/16(土) 00:06:160596デフォルトの名無しさん
2005/07/16(土) 00:13:17// copy [_First1, _First1 + _Count) to [_First2, ...)
って書いてあるし、ヘルプにもそうある(゚Д゚)
0597デフォルトの名無しさん
2005/07/16(土) 00:22:48コメントと、参考にしたこれ↓の説明文が間違ってた。
ttp://www.cc.nao.ac.jp/vppman/HTML/japan/langCpls/stl/stdref/cha_3696.htm#Value%20Functionscopy()
0598デフォルトの名無しさん
2005/07/16(土) 00:55:14public:
void scr(){
std::cout << "A!" << std::endl;
};
};
int main(){
std::vector<A> AV;
AV[8798].scr();
return 0;
}
結果:
A!
釈然としないんですが、規格上こうなんですか?
0599デフォルトの名無しさん
2005/07/16(土) 01:03:37偶然。
ってかA::scr()がAのプロパティに触らないからアクセス違反が起きないだけ。
0600デフォルトの名無しさん
2005/07/16(土) 01:28:170601デフォルトの名無しさん
2005/07/16(土) 01:36:020603598
2005/07/16(土) 01:42:46ありがとうございます。
0604デフォルトの名無しさん
2005/07/16(土) 01:44:07そこにチェックが入って速度落とされちゃたまらないからね。
標準ライブラリの実装によっては、デバッグモードを使えば安心できるかもしれない。
0605デフォルトの名無しさん
2005/07/16(土) 01:54:50at()はチェックする(範囲外は例外を投げる)。
使い分けできるようになってんだよ。
0606デフォルトの名無しさん
2005/07/16(土) 02:29:51Windows標準添付にしないのか、なぜもっとc++をプッシュしないのか?
0607デフォルトの名無しさん
2005/07/16(土) 07:35:24msvcpXX.dllならWin98のあたりから標準搭載だけど。
0608デフォルトの名無しさん
2005/07/16(土) 07:37:57他をプッシュしてるということでは?
0609デフォルトの名無しさん
2005/07/16(土) 08:49:57>STLのiostreamとstring,wstringなどを
帰れ。
0610デフォルトの名無しさん
2005/07/16(土) 11:11:48ベクタ型の配列
[0] vector<int> 〜
[1] vector<int> 〜
[2] vector<int> 〜
[3] vector<int> 〜
0611デフォルトの名無しさん
2005/07/16(土) 11:19:26でできました。すみません。
0612デフォルトの名無しさん
2005/07/16(土) 11:34:29のほうがいいんじゃない?
0613デフォルトの名無しさん
2005/07/16(土) 11:40:46元のほうは可変の必要が無いので大丈夫です。有難う御座います。
0614デフォルトの名無しさん
2005/07/16(土) 20:43:38仕様どおりな希ガス
0615デフォルトの名無しさん
2005/07/16(土) 20:48:420616デフォルトの名無しさん
2005/07/16(土) 20:54:20printf("%p", a + 4096);
は未定義ということでいいのかな?
参照剥がししない限り、こういうコードは問題なく動く処理系が
多いとは思うけれど。
0617デフォルトの名無しさん
2005/07/16(土) 20:55:16ちなみに、どこが未定義ですか?
0618デフォルトの名無しさん
2005/07/16(土) 20:56:42a+10までは大丈夫だけど
ただし*(a+10)は未定義
でも&*(a+10)は大丈夫
0619デフォルトの名無しさん
2005/07/16(土) 21:01:080620デフォルトの名無しさん
2005/07/16(土) 21:04:21>>616はどこも参照剥がし
*(a+10)
をしていないと思うんだが。
ついでにいえば、>>598も、thisポインタは必要だが
参照剥がしはしないから動くんだと思うんだが。
0622デフォルトの名無しさん
2005/07/16(土) 21:09:300623デフォルトの名無しさん
2005/07/16(土) 21:12:420624デフォルトの名無しさん
2005/07/16(土) 21:13:02at と同じ実装である可能性もある
0625デフォルトの名無しさん
2005/07/16(土) 21:15:43じゃあ、一行目の「未定義」ってのは、何が未定義だと言ってるんだ
0626デフォルトの名無しさん
2005/07/16(土) 21:16:32operator[]が例外を投げるのなら、未定義動作にはならないと思う
0628デフォルトの名無しさん
2005/07/16(土) 21:18:06例を作ってそれを未定義だと言ってるだけ?
アフォじゃないの?
0629デフォルトの名無しさん
2005/07/16(土) 21:18:28...は未定義ということでいいのかな?
を受けて、言ってるんだが。
読解力無いのか?
0630デフォルトの名無しさん
2005/07/16(土) 21:18:59で、参照剥がしはしていないんだが、なんで未定義なの?
0631デフォルトの名無しさん
2005/07/16(土) 21:21:16>>618は「最後の一個後の要素」の扱いについて、親切に解説を加えてある
だけなのね。
誤読してたわ。
0632デフォルトの名無しさん
2005/07/16(土) 21:26:310633デフォルトの名無しさん
2005/07/16(土) 21:28:22AV.empty() なので AV[0] も規格に従い未定義動作です。
0634デフォルトの名無しさん
2005/07/16(土) 21:47:39public:
static void scr(){
std::cout << "A!" << std::endl;
};
};
int main(){
std::vector<A> AV;
AV[8798].scr();
return 0;
}
これなら規格通りだろ?
0635デフォルトの名無しさん
2005/07/16(土) 21:51:00それだとAV[8798]を評価せずともscr()を呼び出せるけど
AV[8798]を評価するならば、その時点で未定義になるんじゃないの
0636デフォルトの名無しさん
2005/07/16(土) 22:00:51「規格通り」って何が言いたいんだ?
とりあえず、そのコードが未定義動作を引き起こしても規格通りだよ。
0638デフォルトの名無しさん
2005/07/16(土) 22:05:10printf/scanfがcout/cinになったように<sstream>に<<と>>で入出力するstringstreamがある。
0639デフォルトの名無しさん
2005/07/16(土) 22:06:270640デフォルトの名無しさん
2005/07/16(土) 22:08:26staticメンバ関数呼び出し時のメンバアクセス演算子の左辺は常に評価される。
0641デフォルトの名無しさん
2005/07/16(土) 22:08:55いいえ違います。
0642デフォルトの名無しさん
2005/07/17(日) 00:24:17VC7.1+STLportで追いかけてみたけど、operator[]で、AV[8798]
のアドレスを計算していたけど、その後のメンバ関数コールは静的に
解決されていて、折角計算したアドレスは使用してなかった。
これが仮想関数だったりすると、動的解決なので、まずクラッシュ
するだろうな。
0643デフォルトの名無しさん
2005/07/17(日) 00:31:23へえ、最適化してもわざわざAV[8798]評価してるんだ。意味無いのに。
それともデバッグ版のコードの話?
0644デフォルトの名無しさん
2005/07/17(日) 00:40:20STLportのデバッグじゃないけど、VCのデバッグで最適化無しのコード。
最適化したら、コード通りにバイナリ吐いてくれない事があるから。
0645デフォルトの名無しさん
2005/07/17(日) 00:43:29class A {
public:
virtual void scr() {
std::cout << "A!" << std::endl;
}
};
int main()
{
std::vector<A*> AV;
AV[8798]->scr();
}
0646デフォルトの名無しさん
2005/07/17(日) 00:43:55最適化無しなら、評価してる限りコードが出るのは当然だな。
って、オマエ、コード通りのバイナリ吐く最適化なんて意味無いじゃん。
最適化の意味わかってんのか?
0647デフォルトの名無しさん
2005/07/17(日) 00:49:50お前の噛み付き方だけが意味不明だぞ。
ちょっと落ち着けよ。
0648デフォルトの名無しさん
2005/07/17(日) 02:24:13何でも噛みつけばいいってもんじゃないよ、知ったかぶりさん。
0649デフォルトの名無しさん
2005/07/17(日) 02:43:48まあまあ、ちょっと落ち着いて。
0650デフォルトの名無しさん
2005/07/19(火) 00:41:20落ち着けっ!
落ちぼああああああ着がはぁあああああああああああ!!
0651デフォルトの名無しさん
2005/07/19(火) 05:49:050652デフォルトの名無しさん
2005/07/19(火) 11:35:25ごめんなさい、ごめんなさい、ごめんなさい、暑さで脳をやられてます。
0653デフォルトの名無しさん
2005/07/19(火) 11:52:36ω・`)っ旦旦 冷えた麦茶ドゾー
0654デフォルトの名無しさん
2005/07/20(水) 01:13:38void func()
{
vector<T> ve;
vector<T>::iterator itrt = ve.begin(); *
}
*でコンパイルエラーが出るのですが、どのように記述すればいいのでしょうか?
0655デフォルトの名無しさん
2005/07/20(水) 01:17:56class Tとか。std::vectorとか。typename vector<T>::iteratorとか
0656デフォルトの名無しさん
2005/07/20(水) 01:21:14ありがとうございます
試してみます
0657デフォルトの名無しさん
2005/07/20(水) 19:34:03Visual Studio .NET 2003を使っています。
STLを使おうかと思ってるのですが、VS2003のSTLも糞ですか?
SGIやSTLPort版を使うべきですか?
エロイ人教えて!
0658デフォルトの名無しさん
2005/07/20(水) 20:15:180659デフォルトの名無しさん
2005/07/20(水) 23:25:08STLPortを使え
0660デフォルトの名無しさん
2005/07/20(水) 23:56:35ソースのなかにP.J. Plaugerという署名がポロポロ……
0661デフォルトの名無しさん
2005/07/20(水) 23:58:16ポロポロがボロボロに読めて吹き出してしまったよ
0662デフォルトの名無しさん
2005/07/21(木) 12:13:22STLPortとくらべて具体的にどこがどう悪いのか指摘してくれないかな。
昔は確かに問題が多かったけど最近はよくなってきてると思うけど。
0663デフォルトの名無しさん
2005/07/21(木) 16:00:02それは逆に君が
VCSTLが以前と比べどのように改善したのか
述べてくれるといいと思うよ。
0664デフォルトの名無しさん
2005/07/21(木) 17:24:29vector<void (__cdecl *)()> pf;
これではエラーでした。
どうすればいいのでしょうか?
0665デフォルトの名無しさん
2005/07/21(木) 17:53:02void
foo()
{
cout << "hello, world" << endl;
}
int
main()
{
vector<void(*)()> pf;
pf.push_back(&foo);
(*pf.begin()) ();
return 0;
}
0666デフォルトの名無しさん
2005/07/21(木) 18:08:45ありがとうございます。
以下でやったら通りました。ありがとうございました。
void f::f1(){
AfxMessageBox("f2");
}
void f::fmain()
{
vector<void (*)()> pf;
pf.push_back(&f::f1);
}
0667デフォルトの名無しさん
2005/07/21(木) 20:31:28そのf::f1へのポインタ型はvoid (*)()だけど、
もしstaticじゃなければその関数へのポインタ型はvoid (f::*)()になる。
0668デフォルトの名無しさん
2005/07/21(木) 20:32:000669デフォルトの名無しさん
2005/07/21(木) 21:23:58すみませんstaticじゃ無いほうがいいんでアドバイスどおり
void (f::*)()
とやったんですが、以下の部分でコンパイルが通りません。
(*pf.begin()) ();
0670デフォルトの名無しさん
2005/07/21(木) 21:57:59インスタンスが無いんじゃないの?
↓
pf.push_back(&f::f1);
f F;
(F.**pf.begin())();
0671デフォルトの名無しさん
2005/07/21(木) 22:02:58メンバ関数の中でそのメンバの関数ポインタを呼んでるので、
インスタンスは呼ばなくていいんじゃないのですか?
error C2171: '*' : オペランドが不正です。
というエラーになります。
0672デフォルトの名無しさん
2005/07/21(木) 22:12:25void f::fmain()
{
vector<void (f::*)()> pf;
pf.push_back(&f::f1);
(this->*pf.front())(); //(this->*(*pf.begin()))()相当
}
.*と->*はそれぞれ1つの演算子で、.や->と*には分けられないからthisを補う必要がある。
pf.front()は先頭要素を返すから*pf.begin()相当。
0674デフォルトの名無しさん
2005/07/22(金) 11:25:35コンパイル通りました。
回答ありがとうございました。
0675デフォルトの名無しさん
2005/07/22(金) 13:11:11が VC7,1 の STL では int& になってしまうのですが、これは正しいのでしょうか?
std::list<int const> l(1, 1);
*l.begin() = 2;
l.back() = 3;
がコンパイルを通ってしまい複雑な心境です。
0676デフォルトの名無しさん
2005/07/22(金) 14:23:41int constって値の要件を満たしてないので
コンテナに入れられないような気がする
0677675
2005/07/22(金) 21:02:15言われてみればそうでしたね。
vector や deque 以外は、コンテナに入る型が
assignable じゃなくても良いのだと勘違いしていました。
0678662
2005/07/22(金) 21:44:51>それは逆に君が
>VCSTLが以前と比べどのように改善したのか
>述べてくれるといいと思うよ。
いかにも2ch的な反応ですね(苦笑)
それでは実際に自分が体験した範囲でだけ述べます。
Ver6と.NET2003との比較では
1.streamクラスでメモリーリークが起きていた。
2.string::push_backが極端に遅かった。
この2点が改善されています。
STLPortとの比較ではVer6の頃コンテナクラスの速度を
比べてみたことがありますががSTLPortの方がやや早かった(数%〜十数%)
記憶があります。
この点は最近テストしてないのでどうなっているかはわかりません。
0679デフォルトの名無しさん
2005/07/22(金) 23:34:04仕様の間違いが修正されてる点でしょ。
例えば、list::sort()の比較関数がちゃんと利用できるようになってる点とか。
0680デフォルトの名無しさん
2005/07/22(金) 23:38:280681デフォルトの名無しさん
2005/07/23(土) 00:00:050682デフォルトの名無しさん
2005/07/23(土) 00:38:15メンバ関数テンプレート?
0683デフォルトの名無しさん
2005/07/23(土) 00:43:52ああ、なるほどそれのせいか。
0684デフォルトの名無しさん
2005/07/29(金) 20:39:18vector<Choge> v; のように宣言し
v.push_back(v()); とすると
Chogeのコンストラクタが呼ばれるのは分かるんですが
デストラクタまで呼ばれてしまうのは何故でしょうか?
また、呼ばれないような使い方はありますでしょうか?
どなたかご教授頂けると幸いです
0685684
2005/07/29(金) 20:44:07v.push_back(Choge());
の間違いです。
0686デフォルトの名無しさん
2005/07/29(金) 20:46:34v.push_back(CHoge());の間違いだよな。
v.push_back(CHoge())ではこんな流れになる。
CHogeの一時オブジェクトが作られる。(コンストラクタが呼ばれる)
push_backの中の人がvの末尾に引数のコピーが作る。(コピーコンストラクタが呼ばれる)
式が終わったので一時オブジェクトが破壊される。(デストラクタが呼ばれる)
その後、vのデストラクタで要素の開放が行われ、CHogeのデストラクタが酔うその数だけ呼ばれる。
つまりちゃんとコピーコンストラクタを用意すれば無問題。
コピーコンストラクタのコストがどうしても無視できないほど馬鹿でかければ生ポインタやスマートポインタをvectorの要素にする。
0687デフォルトの名無しさん
2005/07/29(金) 21:21:10お早いレス感謝です。
v.push_backの挙動について、一時的にオブジェクトが作られるため
デストラクタが必然的に呼ばれるということですね。
デストラクタ内の処理を、一時オブジェクトに行わせたくない
部分を隔離する事で解決しました。
ありがとうございました。
0688デフォルトの名無しさん
2005/07/29(金) 22:46:55隔離?どうやって隔離するのん?
0689デフォルトの名無しさん
2005/07/30(土) 00:20:070690デフォルトの名無しさん
2005/07/30(土) 03:12:460691デフォルトの名無しさん
2005/07/30(土) 19:47:42if (!vc.empty()) vc.clear();
cout << "\nEnter a filename of a collection of strings to sort: ";
cin >> filename;
userin.open(filename);
while(userin)
{
userin >> temp;
vc.push_back(temp);
}
userin.close();
としてCase文でファイルにかかれている文字列をVectorに格納しようとしてるの
ですが、ファイル実行後、1回目はうまく読み込んでくれるものの、2回目にファイ
ルを読み込もうとするとプログラムviolationが表示され、強制的にプログラムを
停止しなくてはいけなくなってしまいます。clearの利用方法が間違っているので
しょうか。アドバイスなどありましたら、よろしくお願いします。
0692デフォルトの名無しさん
2005/07/30(土) 19:57:11Case文ってなんだ? filename, userin, temp の型は?
とりあえず、 vector はデフォルトで空だから最初の clear() は要らない。
0693デフォルトの名無しさん
2005/07/30(土) 20:07:51レスありがとうございます。型は
char menu, filename[80];
ifstream userin;
string temp = "aaaaa";
となっています。
while (done != 1){
cout << "1: ファイルを読み込む." << endl;
cout << "9: Exit." << endl;
cout << "command? : ";
cin >> menu;
switch (menu) {
case '1'{
if (!vc.empty()) vc.clear();
:
: //691の内容
}
break;
case '9':done = 1;
break;
default: cout << "Invalid Command Try Again." << endl;
のように、2回目以降ファイルを読み込む際に、vcの中身をclearしようとしてい
るのですが、コンパイル後にプログラムを実行すると下記のエラーが表示されて
しまいます。
Unhandled exception at 0x0041f156 in hw5.exe: 0xC0000005: Access violation reading location 0x00000018.
0694デフォルトの名無しさん
2005/07/30(土) 21:07:40clearしないとどうなる?
0695デフォルトの名無しさん
2005/07/30(土) 21:26:54落ちるのはvc.clear()であってvc.empty()でないのは確実かい?
全然関係ない落ちが待ってそうな悪寒。
0696デフォルトの名無しさん
2005/07/30(土) 21:30:16if (!vc.empty()) vc.clear();をコメントアウトし、clearしないで、再度vectorにpush_backしようとしても前の情報が残ったまま、上書きしてくれないようです。結局前に保存した情報が表示されてしまいます(TДT)
0697デフォルトの名無しさん
2005/07/30(土) 21:40:35今試しにclear()だけにもしましたが、同様にコンパイル後、実行時にviolationがで
てしまいます。 あと>>696の追記ですが、if文の一行をコメントアウト時はプログラ
ム実行後もviolationは表示されません。結果をプリントアウトしても1度目に読み
こんだ内容と同じものになってしまいます。なんだろう、、バッファとかそういった問題
でしょうか。
0698デフォルトの名無しさん
2005/07/30(土) 21:43:46落ちるのはその表示じゃないの?
1回目はfile読み込み成功して2回目は失敗してない?
0699デフォルトの名無しさん
2005/07/30(土) 21:44:10情報小出しウザイ。エラーが再現するソース貼れ。
0700デフォルトの名無しさん
2005/07/30(土) 21:47:50どこで落ちるか調べるのにステップ実行できないの?
それがダメなら昔ながらのprintf()挟みまくり。
怪しい箇所をコメントアウトして全体を実行しても見当外れのことがあるよ。
0701デフォルトの名無しさん
2005/07/30(土) 22:21:21>>693では無くなってるよな。
どうせ>>691のvc生成の記述はデタラメで、本当は別のところに、
まだこのスレで説明していない形で書いてあるんだろ。だから>>696のようなことが起こる。
情報小出し野郎が示した乏しい情報が、一発目の冒頭からいきなり
実際と違っているケースはよくあるが、今回もそれなんじゃないかと。
0702デフォルトの名無しさん
2005/07/30(土) 22:21:21試しに別のcaseオプションを作り、clear()させて、内容がなくなっているのを確認し
てから読み込んでも同様の結果になってしまうので、この文かと思います。
>>699
すいませんでした。↓にあげましたので、よろしくお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/820.txt
問題のif文はコメントアウトしてある状態です。
>>700
今ステップ実行というものを試してみました。700さんの言うとおり、なんか違う場所が原因のような気がしてきました。(userinかも、、)もう少し、試してみます。
0703デフォルトの名無しさん
2005/07/30(土) 22:37:41のすぐ下に
userin.clear();
を入れたらどうなる?
0704デフォルトの名無しさん
2005/07/30(土) 22:50:24@@ -107,7 +106,6 @@
string temp = "aaaaa";
string max="A",min="Z";
int exchange=0, compare=0;;
- ifstream userin;
vector<string> vc;
vector<string>::iterator it;
@@ -129,17 +127,16 @@
{
case '1':
{
- //if (!vc.empty()) vc.clear();
+ vc.clear();
cout << "\nEnter a filename of a collection of strings to sort: ";
cin >> filename;
- userin.open(filename);
+ ifstream userin (filename);
while(userin)
{
userin >> temp;
vc.push_back(temp);
}
- userin.close();
for (int i=0;i<vc.size()-1;++i)
0705デフォルトの名無しさん
2005/07/30(土) 22:55:19はい、 userin.clear(); をつけるまでは、ステップ実行した時に while(userin) の
ループに入っていなかったのが、付けたことによってキチンとvectorに保存できるよう
になりました。しかしまだ上に記述しなかった別の場所に問題があるようなので、今
からそれを調べてみようと思います。ありがとうございます。
0706デフォルトの名無しさん
2005/07/30(土) 23:06:01ありがとうございます!なんだかウソのように直りました! 違いについては今から勉強し
てみます。本当にありがとうございました。
0707デフォルトの名無しさん
2005/07/30(土) 23:09:37いずれの回答も、キーワードは「ストリームの状態フラグ」だ。
0708デフォルトの名無しさん
2005/07/30(土) 23:22:47関連した参考ページをたくさん見つけることができました。ご親切にありがとうござい
ます。あとSTLのスレなのに、汚してすみませんでした。
0709デフォルトの名無しさん
2005/07/30(土) 23:33:070710デフォルトの名無しさん
2005/08/03(水) 15:52:31>コピーコンストラクタのコストがどうしても無視できないほど馬鹿でかければ生ポインタやスマートポインタをvectorの要素にする。
一旦、空のデータをpush_backして
data[data.size()-1].setValue();
のほうがコスト少なくない?
0711デフォルトの名無しさん
2005/08/03(水) 16:55:04そういった場合は、xtreeの中にカウンターを設けるべきでしょうか。何かアドバイスな
どありましたら、よろしくお願いします。
0712デフォルトの名無しさん
2005/08/03(水) 17:04:19コピーコンストラクタのコストが無視できないほど馬鹿でかい時って、
大抵は「引数をとらないコンストラクタ + データセット」のコンボも負けずにでかくないか?
0713デフォルトの名無しさん
2005/08/03(水) 19:13:15xtreeなんて標準にないぞ。まぁ、他スレでVCのSTL弄れっていう宿題を
質問している香具師だろうけど
0714デフォルトの名無しさん
2005/08/03(水) 22:07:53一般的には、
push_back() の時点でコピーコンストラクタが呼ばれるんだから意味が無い。
格納する型が「空」という状態を持つとは限らない。
つまり、格納する型が「空」という状態を持ち、且つ
「空」のインスタンスのコピーはコストが無視できるという条件付きで
そのやり方のほうがコストが少ない。
0715デフォルトの名無しさん
2005/08/03(水) 22:10:430716デフォルトの名無しさん
2005/08/03(水) 22:16:45boost::shared_ptr<std::vector>
boost::shared_array
0717デフォルトの名無しさん
2005/08/04(木) 01:55:170718デフォルトの名無しさん
2005/08/04(木) 08:51:53class CData{
public:
int *pointer
int data
CData()pointer(&data) {}
setVal(int v){data=v}
};
std::vector<CData> dataArray;
dataArray.resize(100).
dataArray[3].setVal(3);
std::cout << *dataArray[3].pointer;
どうなると思う?
0719デフォルトの名無しさん
2005/08/04(木) 09:53:56デフォルトコンストラクタとデストラクタはちゃんと呼び出されます。
嘘書くな。
0720デフォルトの名無しさん
2005/08/04(木) 11:37:210721デフォルトの名無しさん
2005/08/04(木) 12:06:300722デフォルトの名無しさん
2005/08/05(金) 14:17:44{}
0723デフォルトの名無しさん
2005/08/05(金) 14:45:41#include <vector>
#include "position.hh"
int main(){return 0;}
position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
position.hh:15: error: invalid use of ‘::’
position.hh:15: error: ‘Vector3’ declared as an ‘inline’ field
position.hh:15: error: expected ‘;’ before ‘<’ token
position.hh:17: error: ‘Vector3’ has not been declared
position.hh:17: error: expected ‘,’ or ‘...’ before ‘<’ token
position.hh:18: error: ‘Vector3’ has not been declared
...
position.hhの15行目 inline Vector3<float>& get_pos();
position.hhでもSTLはまったく使っていないのですが、
自前テンプレートクラスのVector3の部分でエラーが出ます。。
また、STLをインクルードしないでposition.hhを使っている分にはエラーは出ないのですが。
0724デフォルトの名無しさん
2005/08/05(金) 14:50:47・インクルードする順番を変えてみる。
・position.hhの1-15行を晒してみる。
0725デフォルトの名無しさん
2005/08/05(金) 14:51:43Vector3がtemplateクラスとして宣言されてないように見えるな
0726デフォルトの名無しさん
2005/08/05(金) 15:02:30/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:426: error: ‘vector’ is not a template
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:821: error: wrong number of template arguments (2, should be 1)
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:426: error: provided for ‘template<class _Alloc> class std::vector’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h: In member function ‘void std::vector<_Alloc>::swap(int&)’:
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:823: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:824: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:826: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/vector.tcc: At global scope:
...
0727デフォルトの名無しさん
2005/08/05(金) 15:03:34#ifndef _POSITION_H
#define _POSITION_H
#include "vector.hh"
namespace namae {
/*!
@brief 3d position class
*/
class Position
{
public:
inline Vector3<float>& get_pos();
inline const float* get_pos_vec(); //irane('A`)
inline void set_pos(Vector3<float>& spos);
inline void move_pos(Vector3<float>& spos);
protected:
Vector3<float> pos;
};
}
こんなかんじです。
0728デフォルトの名無しさん
2005/08/05(金) 15:04:29template<class Ctype>
class Vector3
{
protected:
//class member value
union {
struct {
Ctype x, y, z;
};
Ctype vec[3];
};
...
と、templateクラスなんです。(今まで普通に使ってきましたし)
0729デフォルトの名無しさん
2005/08/05(金) 15:05:04Vectorもnamespace namaeに入ってる?
違うならusingか::指定が必要だが
0730デフォルトの名無しさん
2005/08/05(金) 15:05:360731デフォルトの名無しさん
2005/08/05(金) 15:07:00全部namespaceに入ってます。。
0732730
2005/08/05(金) 15:07:31vector.hh内でvector内の宣言と名前がぶつかっているって落ちっぽいね。
namespaceをきちんと正しく宣言し、無闇とusing namespaceしないこと。
0733デフォルトの名無しさん
2005/08/05(金) 15:30:28手作業で疲れました。。
0734デフォルトの名無しさん
2005/08/05(金) 15:45:44>position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
>position.hh:15: error: invalid use of ‘::’
invalid use of ‘::’の::はどれ?
晒してる?
0735デフォルトの名無しさん
2005/08/05(金) 15:47:010736デフォルトの名無しさん
2005/08/05(金) 16:15:01すいません、これです。
SDLとか使ってるし、makefileは自分専用もいいとこ(かつグチャグチャ)ですが。
もうSTLは使わない方向でいこうかと思い始めました。。
0737デフォルトの名無しさん
2005/08/05(金) 16:26:50g++ (GCC) 3.3.5 (Debian 1:3.3.5-13)
で-Wallでコンパイルしてみたが
何も言わずコンパイル成功。。
0738デフォルトの名無しさん
2005/08/05(金) 16:38:44私の環境が悪いのかしら。gcc バージョン 4.0.1 20050727 (Red Hat 4.0.1-5)
0739デフォルトの名無しさん
2005/08/05(金) 16:49:08bkl内に>>723のmain.ccを作る。これで>>737とまったく同じ状態だとおもうんですが、結果は
g++ main.cc
position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
position.hh:15: error: ‘Vector3’ declared as an ‘inline’ field
position.hh:15: error: expected ‘;’ before ‘<’ token
position.hh:17: error: ‘bkl::Vector3’ has not been declared
...
涙そうそう
0740デフォルトの名無しさん
2005/08/05(金) 17:38:05関係ないのかも知れんないけど
このへんはどうかな?
$ cat morio2.diff.gz.base64
H4sICIIj80IAA21vcmlvMi5kaWZmAKVVwY6bMBA9l6+YXiIWcAC3dBPSriL1XvXUS1WtCJBd
VIKRYVF3q/57DQYCxHZIwsXAe/NmPH4aR8l+D+jlG4UDoQnBS0Kf7IKG9u53auekSMqEZMvn
5xYWQRpC6Ez0O+w4HnJWyPHA9XwP+9hbOt0DprN2HM00TUWWkcS9j1c+/nQisd0CcrHlsm++
bLcahGlQFPC9ldLgrwb5yy5NQl9DAEmWJlkMP+KwJPTD531KgvJhAU9x+ciy63ebASkkWVFC
QzE6xmMVh2NWRZIIijae7cL3p+IFQ05DDqSKz8aYoCqVoaoaGTy7uI47qyoAYE2lpGRwHPn1
95gJjLfRIpXZqiZAYLUekBmtJ1xrM7EAM9nax1hosvuV5a7B5Ettsn7D+tfyNWcn+seC9u21
f3vjreqY/Kg4tq9+/qrR2hRd6xrkAUge04D9AKTf8ePdqFhmqzvGF1DJgxeD6C/ScGVWdFNW
dGVW46asxpVZ7Zuy2lfvlTslnLu3jn5mL5eo2kPV4ygSWlQET7w5bNmRrnAjb5I48WXKU8fJ
lY0LlaeukivbFypPnaOqeXqqslLVx3nqDllhRx2oR1x3zcyYhj1VMA6b+9z5aLmYXeh8rYdt
HcZ5wa44Om74F6tmZUboQYEvGkKQJm+xPm7MOHDYi1FEM8V5KRFhVy0lkT5NkSumBYSUFAWP
k8wK1wIJgm/RzUcWFG9hyuqaIxMXVDsqc5bEICX8a0xmG++1/8ZdaxK+CgAA
$ < morio2.diff.gz.base64 base64-decode | gunzip - > morio2.diff
0741デフォルトの名無しさん
2005/08/05(金) 18:21:25エラーが1行だけ短くなりました。>>739の'inline'てやつです。
クラス宣言のときはtemplateの型を書かなくてもいいなんて始めて知りました。というか書くのは間違いなんですかね。
あとusing namespaceを消したときに気になってたんですが、例えば
template<class Ctype>
Vector2<Ctype> Vector2<Ctype>::operator +(const Vector2<Ctype>& v) const
は
template<class Ctype>
bkl::Vector2<Ctype> bkl::Vector2<Ctype>::operator +(const Vector2<Ctype>& v) const
とするだけで、引数にbkl::は付けなくてもダイジョブなんですね。戻り値には付けないとエラーになるのが超不思議です。
0742デフォルトの名無しさん
2005/08/05(金) 18:52:10get_vec()でvecを返す代わりに& xを返すように修正。
$ g++ -Wall -pedantic main.cc
$ g++ --version
g++ (GCC) 3.3.1 (cygming special)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat main.cc
#include <vector>
#include "position.hh"
int main(){return 0;}
$ pwd
/cygdrive/c/tmp/morio2/src/bkl
なんだろね。いっそRedHatのvectorを疑ってみるか?w
0743デフォルトの名無しさん
2005/08/05(金) 19:45:31言われた通り疑ってSTLport(5.0-RC4)を使うようにしたらwarningすら出ないでコンパイルいけました!!!
みなさんお騒がせして済みませんでした。ありがとうございました。
#でも他の環境だと通るのはなんでだろう、、、
0744742
2005/08/05(金) 23:39:52つーことで、乙。
こんなことくらいでstlを嫌いにならないでね。
0745デフォルトの名無しさん
2005/08/11(木) 15:11:320746デフォルトの名無しさん
2005/08/11(木) 15:20:43std::stringは一般的に文字列の加工用のメソッドしかないと思っていいかと。
#検索や抽出関係は豊富です。
フォーマット出力はstringstreamを使えと言うことなのでしょう。
0747デフォルトの名無しさん
2005/08/11(木) 15:21:151. std::stringstream を使う
標準の範囲内で完結できる
2. boost::format
外部ライブラリに依存するが、簡単で割と多機能。
0748デフォルトの名無しさん
2005/08/12(金) 00:14:03コンパイルエラーが出てうまくいきません。どうすればいいでしょうか?
map<string, vector<double>> m;
0749デフォルトの名無しさん
2005/08/12(金) 00:21:140750デフォルトの名無しさん
2005/08/12(金) 00:29:500751デフォルトの名無しさん
2005/08/12(金) 00:37:55うまくいきました。
STL使いへの道は長い(´・ω・`)
0752デフォルトの名無しさん
2005/08/12(金) 05:20:300753デフォルトの名無しさん
2005/08/12(金) 09:34:51みたいにvector を初期化、あるいはいっぺんに要素を追加する方法はありますでしょうか。
0754デフォルトの名無しさん
2005/08/12(金) 09:42:21Boost Assignment Library
std::vector<int> v;
v += 1, 2, 3, 4, 5, 6, 7, 8, 9;
0755デフォルトの名無しさん
2005/08/12(金) 09:50:02int hoge[] = {0, 1, 2, 3, 4, 5} ;
std::vector<int> v(hoge, hoge+6); // 初期化
std::vector<int> v;
v.assign(hoge, hoge+6); // 初期化
v.insert(v.end(), hoge, hoge+6); // 追加
ってなやり方しかねえかな?
0756デフォルトの名無しさん
2005/08/12(金) 09:59:18std::vector<int> v(hoge, hoge + sizeof(hoge) / sizeof(*hoge));
0757デフォルトの名無しさん
2005/08/12(金) 10:07:57ちなみにsizeofの後ろの括弧は要らんぞ
0759デフォルトの名無しさん
2005/08/12(金) 18:44:32数学数式のような美しさを求める人とほぼ同レベル。つまり初心者。
0760デフォルトの名無しさん
2005/08/12(金) 19:43:500761デフォルトの名無しさん
2005/08/12(金) 20:15:48テキストエディタで括弧の前後に移動できるメリット。
Grepをかけたときの曖昧さを減らすメリット。
各演算子の優先順序に対する曖昧さを減らすメリット。
「使わなくても良い」を「使ってはいけない」に脳内変換する宗教信者もコーディングに不向き。
0762デフォルトの名無しさん
2005/08/12(金) 21:16:33全然説明になっていない。
0763デフォルトの名無しさん
2005/08/12(金) 21:17:53・教祖がいる。
・教典がある。
0764デフォルトの名無しさん
2005/08/12(金) 21:36:360765デフォルトの名無しさん
2005/08/12(金) 21:40:23fuctorの中でコピーコンストラクター呼ばれないようにしさえすれば
計算速度は同じだよね?
0766デフォルトの名無しさん
2005/08/12(金) 21:45:25そうだよ。
0767デフォルトの名無しさん
2005/08/12(金) 23:55:11・マルクス
・資本論
とかですね。「宗教はアヘン」だそうだが厳密には「異教は(ry」なわけで。
0768デフォルトの名無しさん
2005/08/13(土) 00:03:46あやまるよw
0769デフォルトの名無しさん
2005/08/13(土) 00:44:510770デフォルトの名無しさん
2005/08/13(土) 02:29:13まあ、怒るほうも怒るほうだとは思うが、わざわざ言うほどのことでもなかったろうね。
演算子の優先順位の話とかでも、ときどきある騒ぎ・・・
0771756
2005/08/13(土) 02:44:32#つーか、>755に対して突っ込みを入れる時点で自分も突っ込まれることは想定済み。
0772デフォルトの名無しさん
2005/08/13(土) 03:30:22・教祖 … >>759
・経典 … >>759
0773デフォルトの名無しさん
2005/08/13(土) 04:58:58このスレ覗いただけで寿命が3年伸びるよ。
0774デフォルトの名無しさん
2005/08/13(土) 16:42:310775デフォルトの名無しさん
2005/08/14(日) 10:16:470776デフォルトの名無しさん
2005/08/14(日) 20:48:44どうしたらよいでしょうか。
0777デフォルトの名無しさん
2005/08/14(日) 21:54:21[cppll:4783] Re: <fyi> CppUnit 1.9.10 snapshot
ttp://www.tietew.jp/cppll/archive/4783
0778デフォルトの名無しさん
2005/08/15(月) 12:40:18ありがとうございます。
wstringをstringに変換しよう↓のようにやってみました。
しかしなんだか半角で「ヘヘヘヘヘヘ・…ンンンンンン」みたいな結果になります。
何か原因と考えられる事はあるでしょうか?
string narrow(const wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
string result = buffer;
delete[] buffer;
return result;
}
/////////////////////////////////
wstring text;
text = L"こんにちは";
MessageBox(NULL,narrow(text).c_str(),"",MB_OK);
0779デフォルトの名無しさん
2005/08/15(月) 13:05:060780デフォルトの名無しさん
2005/08/15(月) 13:24:06stl知らない人に聞いて通じる話なのか分からないのです。
0781デフォルトの名無しさん
2005/08/15(月) 13:40:23MessageBox呼ばれた時点でスタック破壊って感じ?
0782デフォルトの名無しさん
2005/08/15(月) 13:47:00> stl知らない人
それ、自分に向けてるんだよな?
おまえ、STLってどういうものかわかってるか?
0783デフォルトの名無しさん
2005/08/15(月) 13:52:39つまり、、、どこが悪くてどう直したらよいのでしょうか。
0784デフォルトの名無しさん
2005/08/15(月) 14:02:39ここが悪くて
wstring text;
text = L"こんにちは";
string result = narrow(text);
MessageBox(NULL,result.c_str(),"",MB_OK);
こう直したらよいんじゃないかなあ
0785デフォルトの名無しさん
2005/08/15(月) 14:07:57std::stringはSTLじゃないが標準C++ libraryの所属なので
そのあたりは普通のC++スレの範疇では
0786デフォルトの名無しさん
2005/08/15(月) 14:12:21main()の先頭でstd::locale::global(std::locale(""));しないとロケールが
合ってない。
0787778
2005/08/15(月) 18:38:12ありがとうございました。
std::localeの設定で半分くらい解決しましたが
なんだかまだちょっとおかしいのでC++スレ行ってきます。
stringってSTLかと思い込んでました。すいません。
0788デフォルトの名無しさん
2005/08/15(月) 18:56:56iteratorが用意されてるのにSTLでないとは初耳だな。
0789デフォルトの名無しさん
2005/08/15(月) 19:43:34iostream にもイテレータは用意されているけど、STLに含まれるとは聞いたことがない。
0790デフォルトの名無しさん
2005/08/15(月) 19:59:21http://www005.upp.so-net.ne.jp/episteme/html/stlprog/string.html#string
0791デフォルトの名無しさん
2005/08/15(月) 20:56:30いい感じに狂ってて笑えます ;-)
0792デフォルトの名無しさん
2005/08/15(月) 20:58:07一応向こうにも書いておいたが、リンクをば。
C++相談室 part41
http://pc8.2ch.net/test/read.cgi/tech/1120190961/965
0793デフォルトの名無しさん
2005/08/15(月) 21:00:400794デフォルトの名無しさん
2005/08/15(月) 21:30:160795デフォルトの名無しさん
2005/08/15(月) 21:32:28>>6
0796デフォルトの名無しさん
2005/08/15(月) 21:33:27「STL」という言葉は、C++プログラマ同士で同じ意味を持つべきなんですよ。
規格とか関係なく。
0797デフォルトの名無しさん
2005/08/15(月) 21:39:44指摘されて逆ギレしてるだけだから>規格云々
0798デフォルトの名無しさん
2005/08/16(火) 00:03:43具体例を挙げてみて
0799デフォルトの名無しさん
2005/08/16(火) 00:26:46質問の意味がまったくわからん。
聞いたことがないということの具体例って、たとえばどんなのだ?
0800デフォルトの名無しさん
2005/08/16(火) 01:24:06その点、std::string は STL に含むよ派と含まないよ派がいるのよ。
で、重複スレだって言われるのは
>「STL」という言葉は、C++プログラマ同士で同じ意味を持つべきなんですよ。
そもそも STL を標準ライブラリと分ける意味がない、って理由なわけで。
0801デフォルトの名無しさん
2005/08/16(火) 05:04:24vector<int>←コレ。アルゴリズムとかはオマケみたいな。
0802デフォルトの名無しさん
2005/08/16(火) 07:06:05スタンダードテンプレートライブラリには含めない、ってのも
変な話ではあるんだけどな。
0803デフォルトの名無しさん
2005/08/16(火) 07:35:45562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。
このスレが不要である事に疑いの余地は無い。
0804デフォルトの名無しさん
2005/08/16(火) 07:37:380805デフォルトの名無しさん
2005/08/16(火) 08:00:06> その点、std::string は STL に含むよ派と含まないよ派がいるのよ。
STLをちゃんと知らない奴がでかい顔してる、というただそれだけのこと。
0806デフォルトの名無しさん
2005/08/16(火) 08:11:190807デフォルトの名無しさん
2005/08/16(火) 08:50:47std:::vector<MyClass>やstd::list<MyClass>という使い方をする人は山ほどいるけど
std::basic_string<MyClass>という使い方をする人がそんなにいるのか。
で、STLの元はSGIだかのコンテナと、(たぶんlisp由来の)アルゴリズムでしょ。
そもそも、これらのコンテナがC++標準ライブラリに含まれることが決まり、
それを「STL」という名で呼ぶことが一般的になったときに
C++には標準的な文字列クラスなどというものは無かった。
STLが標準に含まれたために、
そのインターフェースにあわせたbasic_stringクラスが作られ、標準に取り込まれ、
同時にiostreamもtemplateを使った物に書き直された、
というただそれだけのこと。
本当にMayersがbasic_stringをSTLに含まれると言っているのならば
どこでそう言及しているのか俺にも教えてくれよ。
俺も少しは考えを改めるかもしれないから。
「標準ライブラリ」に含まれるのと「STL」に含まれるのとは違うのだけど
それを読者/訳者がちゃんとわかっていない可能性があるからね。
0808デフォルトの名無しさん
2005/08/16(火) 09:02:43> 使えるときにはいつでも私は標準ライブラリーからデータ構造を用いる。このような
> データ構造は、標準テンプレートライブラリー(Standard Template Library: STL)から
> 引っ張ってこられる。STLには、ビット集合(bitset)、ベクトル(vector)、リスト(list)、
> キュー(queue)、スタック(stack)、マップ(map)、集合(set)、などが含まれるので、
と、basic_stringについては触れてないね。
もちろん、これが書かれたときにbasic_stringが無かったのかもしれないけど。
0809デフォルトの名無しさん
2005/08/16(火) 09:29:39どこも当たり前のようにstringを(他のコンテナとは別扱いとはいえ)含めているけど
http://www.ccd.bnl.gov/bcf/cluster/pgi/pgC++_lib/stdlibug/ug1.htm
http://www.sgi.com/tech/stl/table_of_contents.html
同様にauto_ptrやhash setなんかも含めてるんだな。
つまり、単に自分のところで配布しているライブラリのリファレンスだから
「STLとは何か」の説明には使えないな。
0810デフォルトの名無しさん
2005/08/16(火) 10:55:34> 第2章 vectorとstring
0811デフォルトの名無しさん
2005/08/16(火) 13:55:30Effective STL 第0章。
「STL」に公式の定義はなく、この用語を使う人によって異なるものを意味している。
本書では、「STL」は反復子を利用するC++の標準ライブラリの部分を意味する。
STLには標準コンテナ(stringを含む)、iostreamライブラリの部分、関数オブジェクト、
およびアルゴリズムが含まれる。標準コン(ry
全部読みたきゃ買え。
0812デフォルトの名無しさん
2005/08/16(火) 16:50:15「STL=iteratorを用いる部分」という定義に賛同する。
iteratorはC++の言語機能ではなくライブラリ機能なのだから、しっくりくると思う。
0813デフォルトの名無しさん
2005/08/16(火) 17:31:450814デフォルトの名無しさん
2005/08/16(火) 21:24:550815デフォルトの名無しさん
2005/08/16(火) 23:20:32明確な定義があってほしいという気持ちはわからんでもないが、
現状から考えたらそれは無理だということぐらいわかるだろ?
どこまでいっても穴だらけの定義か、ローカル定義にしかならないんだよ。
0816デフォルトの名無しさん
2005/08/17(水) 09:45:350817デフォルトの名無しさん
2005/08/17(水) 11:04:420818デフォルトの名無しさん
2005/08/17(水) 11:34:330819デフォルトの名無しさん
2005/08/17(水) 11:36:320820デフォルトの名無しさん
2005/08/17(水) 13:13:21何を?
0821デフォルトの名無しさん
2005/08/29(月) 10:30:53std::stringをラッパしたクラスを作ろうとしてますが、(MFCのCStringと同等のインターフェースを持つもの)
クラス名はどのようにすればいいでしょうか。
プロの方の命名をお聞きしたいです。
よろしくお願いします。
0822デフォルトの名無しさん
2005/08/29(月) 10:37:090823デフォルトの名無しさん
2005/08/29(月) 11:24:08このサイトだけで問題ないでしょうか?
追加して本を買いたいと思うのですが、
boostを学習する上で助かる参考書はありますか?
ご返答いただけると助かります。
0824デフォルトの名無しさん
2005/08/29(月) 11:25:46http://boost.cppll.jp/HEAD/
0825デフォルトの名無しさん
2005/08/29(月) 11:53:54あと、入門にはLet's boostがいい。リンクから、いくつかboost研究のサイトにもいけるし。
0826デフォルトの名無しさん
2005/08/29(月) 17:46:40見つかった範囲内から更にvalueの一致するイテレータを返す関数を作っています。
このとき、見つからなかった場合にポインタで言うNULLみたいなものを返したいのですが、
なにを返したらいいんでしょう?
0827デフォルトの名無しさん
2005/08/29(月) 18:22:000828sage
2005/08/29(月) 19:10:45ありがとうございます。
試してみます。
0829デフォルトの名無しさん
2005/08/29(月) 21:58:230830デフォルトの名無しさん
2005/08/29(月) 22:05:020831デフォルトの名無しさん
2005/08/30(火) 12:05:08標準アルゴリズムとの整合性をとる意味でも、end() 返しておけばいいところを
わざわざ boost::optional 持ち出すことも無いだろうと混じれ酢
0832デフォルトの名無しさん
2005/08/30(火) 12:20:101. 戻り値をポインタではなく値で返したいが、
DBNull のような無効な値も戻り値で返したい場合
2. try-state なテキストボックスやチェックボックスの値と状態を、
戻り値で一気に取得したいとき
くらいだろうか。
それ以外の場面では、NULL 返すなり、end 返したほうが分かりやすい気がする。
0833デフォルトの名無しさん
2005/09/01(木) 18:13:570834デフォルトの名無しさん
2005/09/08(木) 10:56:38bitset<32> bsVal;
cout << bsVal[0]; // NG
cout << bsVal.test(0); // OK
0835デフォルトの名無しさん
2005/09/08(木) 12:21:57スレ違い。
0836デフォルトの名無しさん
2005/09/14(水) 15:54:420837デフォルトの名無しさん
2005/09/14(水) 15:56:440838デフォルトの名無しさん
2005/09/14(水) 21:57:50sexが楽しい年頃なんだろ
0839デフォルトの名無しさん
2005/09/14(水) 22:47:410840デフォルトの名無しさん
2005/09/14(水) 22:52:440841デフォルトの名無しさん
2005/09/14(水) 23:43:53だから上司は無能ばかり
そういう話があったけどこれって
色々な男とヤリまくってデキちゃったら結婚
だから旦那はDQNばかり
って置き換えられるよね
0842デフォルトの名無しさん
2005/09/15(木) 00:48:44って、スレ違いじゃねぇかああぁぁぁぁぁぁぁっっっヽ(`Д')ノ
0843俺じゃねーよ。
2005/09/15(木) 01:31:350844デフォルトの名無しさん
2005/09/15(木) 02:17:060845デフォルトの名無しさん
2005/09/15(木) 02:23:49Sexually Transmitted Disease ( 性感染症 )のことじゃないんだぞ。
0846デフォルトの名無しさん
2005/09/15(木) 02:49:20/'''''' '''''':::::::::\
. |(○), 、(○)、.:|:
| " ,,ノ(、_, )ヽ、,,"".:::|:
. | ´,rェェェ、` .:::::::::|:
\ |,r-r-| .:::::/…
,,.....イ.ヽヾ`ニニ´ーーノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | |
0847デフォルトの名無しさん
2005/09/15(木) 02:51:12,.-''"´ \
/ ヽ、
/ (Φ), 、(Φ) ヽ
l `ー ,,ノ(、_, )ヽ、,,. l またまたご冗談を
.| /// `-=ニ=-. /// |
l `ニニ´. l
` 、 /⌒⌒i /⌒ヽ /
`/ | | \ /
0848デフォルトの名無しさん
2005/09/15(木) 03:02:390849デフォルトの名無しさん
2005/09/17(土) 12:38:52STLのvectorでイマイチ使い方が上手くないようなのですがご教授ください。
//要素を1つ増やして、増やした要素のインデックスを取得したい
mBin.resize(mBin.size()+1);
return (mBin.size()-1);
//領域を確保して、確保した領域を0で初期化したい
vector <char> mBin;
mBin.resize(Size);
memset(&(mBin[0]),0,sizeof(char)*mBin.size());
とかやってるんですけど、バグってないでしょうか?
また、もっといいやり方ってないでしょうか?
0850デフォルトの名無しさん
2005/09/17(土) 12:58:45前者はそれでおkだと思う
後者は
vector<char> mBin(Size, 0);
という1行だけで可能。これの第2引数は char で0を指定する場合、省略可能。
C++ ではそれなりの理由がない限り memset の使用は推奨できない。
0851デフォルトの名無しさん
2005/09/17(土) 13:11:32size() の呼び出しがダブってるのが気に入らない。
vector_type::size_type const prev_size = mBin.size();
mBin.resize(prev_size + 1);
return prev_size;
0852デフォルトの名無しさん
2005/09/17(土) 13:13:45std::vectorに限りstd::memeset()でいいだろ。
それからstd::vectorのデフォルトコンストラクタは、領域をゼロで初期化するので、
resize()した時点でちゃんとお望み通りの状態になってるよ。
0853デフォルトの名無しさん
2005/09/17(土) 13:16:04俺はmemsetはいいと思うが、850の書き方のほうが短いからいいと思う。
0854デフォルトの名無しさん
2005/09/17(土) 13:51:03即レスありがとうございます。
使わせていただきます。
memsetに関しては不安があったんですよね。
「もしかして、ヤバイとこクリアしてるかも」って思いまして。
ただやっぱりvector <MyClass> mBin;とかの場合はmemsetは駄目ですよね。
ありがとうございました。
0855デフォルトの名無しさん
2005/09/17(土) 14:47:24>std::vectorに限りstd::memeset()でいいだろ。
POD の std::vector ならね
0856デフォルトの名無しさん
2005/09/17(土) 14:57:46うんそう。フォローサンクス。
0857デフォルトの名無しさん
2005/09/19(月) 20:07:28ある要素を指しているite1が、ite2の前に新しく要素を挿入した後も、
引き続き同じ要素を指しているようにするには、
if (ite1 == ite2)
ite1 = list.insert(ite2, p); // ite1が宙ぶらりんにならないように
else
list.insert(ite2, p);
とすりゃいいいんだよね?
0858デフォルトの名無しさん
2005/09/19(月) 20:18:540859デフォルトの名無しさん
2005/09/19(月) 21:28:53std::stringがスレッドセーフではないという非常に痛い状況ですが
みんなどうしてんの?
0860デフォルトの名無しさん
2005/09/19(月) 21:34:47string だからって、他のライブラリオブジェクトと比べて
特別な対策が必要とは思わない。
何の話?
0861デフォルトの名無しさん
2005/09/19(月) 21:48:230862デフォルトの名無しさん
2005/09/19(月) 22:01:27STLPort使えばいいじゃん
0863デフォルトの名無しさん
2005/09/25(日) 04:11:270864KKK
2005/09/25(日) 10:28:010865デフォルトの名無しさん
2005/09/25(日) 10:35:240866KKK
2005/09/25(日) 10:43:21てことは、
stiring str = "abc";
str.max_size(); ←このサイズは常に確保されてるってことですか?
0867デフォルトの名無しさん
2005/09/25(日) 10:57:22いや、必要に応じて拡張されていく。
今どれくらい確保しているかはcapacity()で知れる。
実際に使用している量はsize()あるいはlength()。
0868デフォルトの名無しさん
2005/09/26(月) 10:28:06>>KKK⇒きっと、きっと、楓さん
stringを固定長にして何がたのしいの。
0869デフォルトの名無しさん
2005/10/01(土) 05:34:120870デフォルトの名無しさん
2005/10/01(土) 05:55:29なんで使っちゃダメだと思うの?
0871デフォルトの名無しさん
2005/10/01(土) 06:12:520872デフォルトの名無しさん
2005/10/01(土) 06:20:37malloc() 使ってがんばった可変長配列は良くて
std::vector はダメってことか?そんなわけないよな?
あと、 algorithm なんかは問題なく使えるはずだ。
0873デフォルトの名無しさん
2005/10/01(土) 09:42:51そうじゃなくて、テンプレートのインスタンス化がテンプレート引数毎にそれぞれ行われるから、
C++ソースの見かけ以上に機械語のコードが膨張してしまいやすいので、
実行する機械語のコードのサイズの予測が立たないということ。
0874デフォルトの名無しさん
2005/10/01(土) 09:50:270875デフォルトの名無しさん
2005/10/01(土) 09:50:510876デフォルトの名無しさん
2005/10/01(土) 10:45:320877デフォルトの名無しさん
2005/10/01(土) 10:55:170878デフォルトの名無しさん
2005/10/01(土) 11:09:20きついのは最初だけだし。
0879デフォルトの名無しさん
2005/10/01(土) 11:21:21独自のIntArrayとかStringArrayとか作ってたりする?
0880デフォルトの名無しさん
2005/10/01(土) 13:37:50そういうことをしないとSTLが生き残れない過酷な環境もあるのです
0881デフォルトの名無しさん
2005/10/01(土) 18:10:22コードサイズなんか予測に頼らなくてもマップファイルで確認できるだろ。
0882デフォルトの名無しさん
2005/10/01(土) 18:12:46どれくらいになるかの目処が建てづらい罠
0883デフォルトの名無しさん
2005/10/01(土) 18:16:13やってみればすぐわかることなのに、
なんで頭の中で目処を建てないといけないの?
0884デフォルトの名無しさん
2005/10/01(土) 18:24:29マップファイル上でいくらになるかを予想する。
(それが予想しづらいのがテンプレートを使ったとき)
こう書けば気が済むか。
0885デフォルトの名無しさん
2005/10/01(土) 18:30:41はぁ。そうですね(呆
保守頑張ってください。
0886デフォルトの名無しさん
2005/10/01(土) 18:30:42なにそれ?数当てゲーム?
予想してからマップファイル見て「わーいピッタリだぁ」とかすんの?
ごめん、やっぱり意味がわかんない。
0887デフォルトの名無しさん
2005/10/01(土) 18:31:04結論:>875
0888デフォルトの名無しさん
2005/10/01(土) 18:33:35だから少しでもメモリをケチりたい組み込みではテンプレートが嫌われやすい。
0889デフォルトの名無しさん
2005/10/01(土) 18:35:03すでにソースコードがあることが前提の発言だなw
0890デフォルトの名無しさん
2005/10/01(土) 18:40:11使うか使わないかの話してるのに、
ソースコードが無いってどういう状況だ?
0891デフォルトの名無しさん
2005/10/01(土) 18:47:500892デフォルトの名無しさん
2005/10/01(土) 18:51:380893デフォルトの名無しさん
2005/10/01(土) 18:55:260894デフォルトの名無しさん
2005/10/01(土) 19:04:21問題なく使える箇所では使えばいい。
問題が発生する箇所では使わなければいい。
全体で2択を迫る意味がわからない。
0895デフォルトの名無しさん
2005/10/01(土) 19:11:10>問題なく使える箇所では使えばいい。
>問題が発生する箇所では使わなければいい。
はぁ、それからどういう展開があんの?
もしかしてこれでおしまい?
0896デフォルトの名無しさん
2005/10/01(土) 19:12:53それなら俺にも言えるッ!!!!
0897デフォルトの名無しさん
2005/10/01(土) 19:14:35シラネーヨ。どんな展開期待してんだ?
はじまりが >869 だからこれで終わりでもいいだろ。
0898デフォルトの名無しさん
2005/10/01(土) 19:15:12使うのか?
0899デフォルトの名無しさん
2005/10/01(土) 19:16:31つまらん結論だな。
0900デフォルトの名無しさん
2005/10/01(土) 19:17:05それだけならそれでいいよw
0901デフォルトの名無しさん
2005/10/01(土) 19:20:560902デフォルトの名無しさん
2005/10/01(土) 19:30:24それで済ませるためには、マップファイルとかを読むなどして
問題の原因となっている箇所を特定できる能力が必要だろ。
それができない人(が居ないプロジェクト)は、使っちゃいけないんだよ。
そして「使っちゃいけない」理由が
自分にその能力がないことだと認めたくなくて、
もっともらしい理由を求める人がいる、のかもしれない。
0903デフォルトの名無しさん
2005/10/01(土) 19:42:24標準C++ コンテナまでも改定確定
ヤマト、ロッキー、ガンダムのように永遠に続く
Cマガでは、まだauto_ptr
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1771.html
0904デフォルトの名無しさん
2005/10/01(土) 20:07:07すげー、それで解決かぁ
>>902
能力ってほどのことでもないと思うが。
0905デフォルトの名無しさん
2005/10/01(土) 22:13:10改定されそうだからという理由は覚えなくて良いという理由にはなるかもしれないが、
それが普及するまで時間もかかるだろうし、今のSTLを触れておくくらいやっても損はないよ。
0906デフォルトの名無しさん
2005/10/01(土) 23:36:06右辺値参照というか move semantics のサポートは現在の標準ライブラリに
+α として導入されるもので,現在のもの対する理解が不要になるということは
全然ないんじゃないんですかね.auto_ptr こそ deprecate されますけれど,
auto_ptr が持つ破壊的コピーのセマンティクスの考えも,move semantics に
直接つながるわけですし.
0907デフォルトの名無しさん
2005/10/02(日) 03:09:100908デフォルトの名無しさん
2005/10/02(日) 06:26:45しかしながら、それは、完全のためにここで含まれています。それは、
rvalue参照および動き意味論に関しての非常に重要なライブラリー・
コンポーネントです。unique_ptrは完全に、
後ろに互換性をもたないauto_ptr置換です。したがって、auto_ptrを
大いに非難し、かつauto_ptrを単に固定する代わりに、新しい名前
(unique_ptr)を導入する必要。主な類似性、およびunique_ptrとauto_ptrの
間の差は次のものを含んでいます:auto_ptrのようなコピー・シンタックスの
代わりにlvaluesから動きシンタックスで移動します。しかしながら、それは
ちょうどauto_ptrのようなコピー・シンタックスでrvaluesから移動します。
auto_ptrと異なり、lvaluesから移動する(あるいはコピー)ことを拒絶します。
これは総括的なコード中の安全性の鍵です。それがちょうどauto_ptrのように
、ローカルの自動変数である限り、コピー・シンタックスと共に、機能から
1つ返すことができます。デフォルトdeleter(また「空の」deleters)で、
それはauto_ptrと同じオーバーヘッド(1つのポインター)を持つことができま
す。deleterは参照タイプでありえます。deleterは「ヘビー級」でありえま
す、コピーしない、可能な(そして)移動されました。非デフォルトdeleters
で、他のRAII機能性は達成することができます。配列形式を扱う特殊化があ
ります。配列形式は単に特別のdeleterを越えるものです。インターフェース
は、配列に、より適切な一つに変更されます:
0909デフォルトの名無しさん
2005/10/02(日) 06:44:14移植性なんか元々ないのよ。全部書き換えてください。
いい加減、C++D言語とでも逝ってほしいです。
命名するならC&&D言語がいい。
0910デフォルトの名無しさん
2005/10/02(日) 06:50:25第53回ポインタの安全な使い方(第x回?)
この連載では、今まで何度となくポインタとうまくつきあう方法について
考えてきました。それくらいポインタには悩まされるわけなのですが、
今回は、じゃあポインタがどんな場面で実際に使われるか、という視点で
ちょっと見ていきたいと思います。
これでいいじゃない。
include <memory>
#include <vector>
struct Base {virtual ~Base() {}};
struct Derived : Base {};
int main()
{
typedef std::unique_ptr<Base> BasePtr;
typedef std::unique_ptr<Derived> DerivedPtr;
std::vector<BasePtr> v(3); // 3 default constructed BasePtr's
v.resize(2); // No copy constructor required
v.push_back(DerivedPtr(new Derived)); // No copy constructor required
v.front() = DerivedPtr(new Derived); // No copy constructor required
v.insert(v.begin(), DerivedPtr(new Derived));// No copy constructor required
v.erase(v.begin() + v.size()/2); // No copy constructor required
// BasePtr p = v[0]; // will not compile, copy constructor required
BasePtr p = std::move(v[0]); // ok, ownership transferred to p
}
0911デフォルトの名無しさん
2005/10/02(日) 15:23:03鼻つまんで読めば大筋くらいは把握できるな。
0912デフォルトの名無しさん
2005/10/02(日) 15:29:30safe bool をとるコンストラクタと代入演算子って
どんな意味があるの?
0913デフォルトの名無しさん
2005/10/02(日) 19:39:42>鼻つまんで読めば大筋くらいは把握できるな。
そうなんですよ!プログラミングはinfoseekが使えます。
おすすめはしませんが、ヤフーとか面白いですよ。○×★???
0914デフォルトの名無しさん
2005/10/02(日) 22:33:57>>913
いやっ、英語を感じろよ。
0915デフォルトの名無しさん
2005/10/03(月) 16:20:330916デフォルトの名無しさん
2005/10/03(月) 17:32:08右辺値参照.新しく提案されている言語仕様の1つ.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm
0917デフォルトの名無しさん
2005/10/03(月) 17:57:56てゃんks
まだ読んでる途中だけど、
A.Alex が行ってた mojo みたいなのを、言語でサポートしようってこと?
0918デフォルトの名無しさん
2005/10/03(月) 18:11:58>A.Alex が行ってた mojo みたいなのを、言語でサポートしようってこと?
はい.ほとんどその通りです.
0919デフォルトの名無しさん
2005/10/03(月) 23:14:000920デフォルトの名無しさん
2005/10/03(月) 23:41:20リンク先の「More on A&&」の項のコード見れば一発でわかるよ
0921デフォルトの名無しさん
2005/10/03(月) 23:45:57所有権を完全に貰える場合と複製でなければならない場合を区別できるわけね。
その結果、コピーを作る手間をかける必要ない場面では移動して効率化できると。
計算式の途中では往々にしてそういう場面があるが
組み込み型だとそういう最適化ができるのにユーザー定義オブジェクトだと
それができなくて性能の制約になってたって感じか。
0922デフォルトの名無しさん
2005/10/04(火) 07:22:13さすがC++というしかないな……
0923デフォルトの名無しさん
2005/10/04(火) 10:45:14あー、はいはい。 速度を気にしないボクちゃんはHSPでも使っててくだちゃいねー。
0924デフォルトの名無しさん
2005/10/04(火) 10:59:470925デフォルトの名無しさん
2005/10/04(火) 11:44:200926デフォルトの名無しさん
2005/10/04(火) 14:17:290927デフォルトの名無しさん
2005/10/04(火) 20:36:08>性能の制約
って堅牢性も含めて言ってるんじゃないですか? 代入演算子やなんかで、多くのケースで
例外を送出しない保障ができるでしょう。
0928デフォルトの名無しさん
2005/10/06(木) 00:11:38vector <MyClass> mMy;
↑と宣言したものにresizeやpush_backなどを行うと
内部的にはどうなるのでしょうか?
MyClassのインスタンスは1回全部破棄されて、
すべて新しく作り直されるのでしょうか?
それとも内部的に持っているポインタの配列(のようなもの?)が確保しなおされて
MyClassのインスタンス自体はそのままなのでしょうか?
0929デフォルトの名無しさん
2005/10/06(木) 00:23:20普段は余計にメモリを確保しておいてあるから、そこへresizeやpush_backはコンストラクタを呼ぶだけ。
足りなければ新たにメモリを確保して既存の要素はコピーコンストラクタでコピーされる。
0930デフォルトの名無しさん
2005/10/06(木) 00:27:17レスありがとうございます。
じゃあ、その余分なメモリで足りなくなった場合は、
既存の要素を一度すべて複製、削除しているということですね?
ということは、そういう確保のしなおしが気になるときは
vector <MyClass*> mMy;
を使った方がよいということでしょうか?
0931デフォルトの名無しさん
2005/10/06(木) 00:38:58vector なら reserve() とか。
list<MyClass> でもいいんじゃないかな。
0932デフォルトの名無しさん
2005/10/06(木) 00:42:30vector<MyClass> mMy;
mMy.reserve(1000);
とでもしておけば、あらかじめ1000個分確保してくれる1000個までなら
リサイズやらメモリの再配置はない。が、インスタンスを代入するたびにコピコンが動く。
ので vector<MyClass*> mMy;とした方がいいのかもしんない。
0933デフォルトの名無しさん
2005/10/06(木) 00:56:18レスありがとうございます。
とりあえずvector<MyClass*> mMy;で逝っときたいと思います。
0934デフォルトの名無しさん
2005/10/06(木) 02:10:53質問です。
stringであらかじめ領域を確保しておきたいのですが、
reserve関数で確保した領域というのはどういうときに変化してしまうのでしょうか?
例えば
string str;
str.reserve(20000);
str = "";
str += "ABCDEFGHIJK";
str = "";
str += "ABC";
とやってもreserve関数で確保した領域はそのままなのでしょうか?
0935デフォルトの名無しさん
2005/10/06(木) 04:40:20そのままです。reserve()で予約した領域を変化させるのは、文字列がreserve()で
予約した文字数を超えるか、再びreserve()を呼び出し、現在の容量または文字数
を下回る領域を指定した時だけです。
二番目の場合は、非強制的な要求なので、保証はされていません。
0936デフォルトの名無しさん
2005/10/06(木) 16:40:48レスありがとうございます。
string www;
www.reserve(20000);
int iiiis = www.capacity();
www = "";
int iiii = www.capacity();
www.reserve(20000);
www = "ABC";
int ii = www.capacity();
↑のようなプログラムを書いてデバッガみたところ
www = "";やwww = "ABC";のところでreserveで確保した領域が変更されてしまうようです。
0937デフォルトの名無しさん
2005/10/06(木) 18:42:25だとすれば貴方のstd::stringクラスが、代入時にreserve()を呼び出して
いるんでしょう。つねにshrink-to-fitするように。それじゃあreserve()の
意味があまりありませんね。
0938デフォルトの名無しさん
2005/10/06(木) 19:13:48レスありがとうございます。
この辺は環境依存ということでしょうか。
開発環境はVC.netです。orz
とりあえずstring使わないでなんとかしたいと思います。
おつきあいいただき、ありがとうございました。
0939デフォルトの名無しさん
2005/10/06(木) 20:10:400940デフォルトの名無しさん
2005/10/07(金) 19:18:13regexとfilesysutemが使いたかったのでbjamでvc-7_1-stlportを指定して
インストール。きちんとlibファイルができました。
そこまでは良かったのですが、実際boost::regex,filesystemを使用してみると
リンクの際に未解決の外部シンボルのリンクエラーがいくつか発生しました。
それらがすべてSTL関係っぽいのですが、STL-portとboost間の相性やら
なにかあるのでしょうか?
何か情報がありましたらご教授願います。
以下、発生したエラーのひとつです。
error LNK2019: 未解決の外部シンボル "protected: static bool __cdecl
boost::reg_expression<char,class boost::regex_traits<char>,
class _STL::allocator<char> >::can_start(char,unsigned char const *,unsigned char,
struct boost::re_detail::_narrow_type const &)"
(?can_start@?$reg_expression@DV?$regex_traits@D@boost@@V?$allocator@D@_STL@@@boost@@KA_NDPBEEABU_narrow_type@re_detail@2@@Z) が関数
"public: static bool __cdecl boost::re_detail::access_t<char,class boost::regex_traits<char>,
class _STL::allocator<char> >::can_start(char,unsigned char const *,unsigned char)"
(?can_start@?$access_t@DV?$regex_traits@D@boost@@V?$allocator@D@_STL@@@re_detail@boost@@SA_NDPBEE@Z)
で参照されました。
0941デフォルトの名無しさん
2005/10/07(金) 19:34:19作られたLibファイルをプロジェクトに参加させていないだけでは?
0942デフォルトの名無しさん
2005/10/10(月) 18:01:58private:
vector<A> va;
bool predicate(A a1, A a2) { ~~~ }
public:
void bar()
{
A a(~~~);
find_if(va.begin(), va.end(), bind2nd(ptr_fun(predicate), a));
}
};
↑こんなことやってるんですがpredicate周辺でコンパイルエラーがでます。
「no matching function for call to `ptr_fun(<unknown type>)'」
predicate()がグローバルな関数ならエラー無しで動作するのですが。。
何がいけないのか、どうすれば正しく動くのか、どなたかよろしくお願いします。
0943デフォルトの名無しさん
2005/10/10(月) 18:27:17メンバ関数predicate()をalgorithmに適用するには、第一引数にthisを
バインドしておかないと駄目。
0944デフォルトの名無しさん
2005/10/10(月) 18:31:280945デフォルトの名無しさん
2005/10/10(月) 18:34:17メンバ関数へのポインタを得るためには & が必須
且つ同クラス内でも Foo:: の明示が必要。つまり &Foo::predicate 。
あとは >943-944
0946デフォルトの名無しさん
2005/10/10(月) 20:03:00ただ、通常のbindを使ったものがどうしても動きません。
bind2nd(ptr_fun(predicate), a)
を
boost::bind(&Foo::predicate, this, _1, a)
にしたものは動いたのですが、
bind2nd(bind1st(mem_fun(&Foo::predicate), this), a)
が動かないのです。thisのバインドの仕方が間違っているのでしょうか。
・・でもどう考えてもboost使った方が簡単そうですね。。
0947デフォルトの名無しさん
2005/10/10(月) 20:10:13mem_funいらない・・・・・
0948デフォルトの名無しさん
2005/10/10(月) 20:10:36間違いじゃなくて標準のバインダが貧弱すぎるだけ。
気にせず boost::bind や boost::lambda::bind 使うのが正解。
0949デフォルトの名無しさん
2005/10/10(月) 20:28:26mem_fun消してみたんですがまたもやエラーメッセージの洪水をワッとあびせかけられたので
さすがにギブアップします・・・
>>948
はい、これからboost使うことにします。
ありがとうございました。
0950デフォルトの名無しさん
2005/10/10(月) 21:31:44結論からいって無理だもん。mum_fun は高々一変数のメンバーしか扱えない。
よって代替のインナー関数オブジェクでも作ってbind2に渡すしかないね。
0951デフォルトの名無しさん
2005/10/11(火) 01:28:04関数の合成やから、この場合には適用できへんし。
std::bind1st2()とかstd::bind2nd2()があれば、できたかもしれへんねえ。ま、
boostがあるんやから、そちらでまとめまひょ。
0952940
2005/10/11(火) 12:27:21レスありがとうございます。
VCの場合、stol-port,boost関連のヘッダがインクルードされれば自動的に
libは読み込まれるはずです。念のため手動でプロジェクトに追加してみましたが
結果はかわりませんでした…。
0953デフォルトの名無しさん
2005/10/11(火) 14:29:54>ヘッダがインクルードされれば自動的に libは読み込まれるはず
VCはいつの間に俺の知らない魔法を使うようになったんだ?
0954デフォルトの名無しさん
2005/10/11(火) 14:43:37boostが気を利かせてpragmaでlibをリンクするようにしてくれてる。
0955デフォルトの名無しさん
2005/10/11(火) 15:43:520956940
2005/10/11(火) 17:33:31http://www.tietew.jp/cppll_novice/archive/472
と同じ原因でした。
http://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html
にしたがってSTLPORT_****_PATHのパスの追加とSTLPORT_PATHの修正を
行い、もう一度bjamでライブラリを作成して置き換えたら動作するようになりました。
自分が最初に参考にしたサイトのパス記述方法ではダメだったようです。
0957デフォルトの名無しさん
2005/10/18(火) 15:58:280958デフォルトの名無しさん
2005/10/29(土) 00:59:43error C2027: 認識できない型 'boost::STATIC_ASSERTION_FAILURE<x>' が使われています。
with
[
x=false
]
となるのですが何が問題でしょうか?
0959デフォルトの名無しさん
2005/10/29(土) 01:30:09それはboostが意図的に起こしたコンパイルエラー。
エラーが発生した場所に意図が書いてあるはず。
0960デフォルトの名無しさん
2005/10/29(土) 01:39:19// a) serializing an object of a type marked "track_never" through a pointer.
// b) saving an non-const object of a type not markd "track_never)
// Either of these conditions may be an indicator of an error usage of the
// serialization library and should be double checked. See documentation on
// object tracking.
BOOST_STATIC_ASSERT(check_tracking<T>::value);
save(ar, const_cast<const T &>(t));
とありました。
track_neverをマークする???
http://hw001.gate01.com/eggplant/tcf/cpp/boost_serialization.html
こちらの最初の例題をまねるだけでは動かないものなのでしょうか?
0961デフォルトの名無しさん
2005/10/29(土) 02:16:11非 const なオブジェクトをシリアライズしようとしていませんか?
0962デフォルトの名無しさん
2005/10/29(土) 02:23:21以下のような感じで回避できるかと思います.
X x;
ar << x; // 通らない
template<class T>
T const &as_const(T &t)
{ return t; }
X x;
ar << as_const(x); // O.K.
http://www.boost.org/libs/serialization/doc/rationale.html#trap
0963デフォルトの名無しさん
2005/10/29(土) 02:23:42ありがとうございます。
右も左もわからない状態でして
MFCを軽く触ったことしかなくて右往左往しています。
>>961
はい 非 constです。
どうやらBOOST_CLASS_TRACKING(Student, boost::serialization::track_never);
とするとOKのようです。
しかし
boost::serialization::track_always
boost::serialization::track_selectivly
ですと上記のエラーとなります。
boost::serialization::track_always
boost::serialization::track_selectivly
にしたい場合はどうすればよいのでしょうか?
0964デフォルトの名無しさん
2005/10/29(土) 02:31:49class Student {
public:
Student(){}
Student(std::string name , int age)
{
name_ = name;
age_ =age;
}
private:
std::string name_;
int age_;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & name_;
ar & age_;
}
};
上記のクラスで試しています。
0965デフォルトの名無しさん
2005/10/29(土) 02:42:02template<class T>
T const &as_const(T &t)
{ return t; }
int main()
{
std::ofstream ofs("hoge");
boost::archive::binary_oarchive ar(ofs);
Student s;
ar << as_const(s);
}
こんな感じで通りませんか?手元の VC7.1 だとこれで O.K. なんですけれど.
0966デフォルトの名無しさん
2005/10/29(土) 09:44:34自分で作らなくともboost::crefではだめか?
0967デフォルトの名無しさん
2005/10/29(土) 09:48:40記事書いてる時点では通ったんだけど。
ひょっとしたら、boostが1.33か32になったときのserializationのアップデートで何か変わってるのかも。
時間が出来たら調べてみます。
コンパイラのバージョンが古いとかいうオチじゃないよね?
0968デフォルトの名無しさん
2005/10/29(土) 15:35:10boost::cref は const 参照ではなくて boost::reference_wrapper を返すので,
reference_wrapper が渡されることを意識したライブラリでないと通らないことがあります.
実際,上で as_const の代わりに boost::cref を使うと通らないです.
>>967
>ひょっとしたら、boostが1.33か32になったときのserializationのアップデートで何か変わってるのかも。
http://www.boost.org/libs/serialization/doc/release.html#recent_improvements
の6番目がそれですね.
0969デフォルトの名無しさん
2005/10/29(土) 17:35:07UNICODEでstringを使いたい時はstd::wstringを使うってことでいいのでしょうか?
0970デフォルトの名無しさん
2005/10/29(土) 17:39:48一般にwchar_tのエンコードがunicodeだと仮定していいかという問なら、だめ。
実際、BSDではそうでないらしい。
特定の処理系の話ならそのドキュメントを参照してくれ。
0971デフォルトの名無しさん
2005/10/29(土) 17:41:310972デフォルトの名無しさん
2005/10/30(日) 00:42:03ほんとだ、それっぽいですね……どうもです。
0973デフォルトの名無しさん
2005/10/30(日) 09:45:29もし970のいうようにwchar_tがUnicodeでないときには
自分でUnicodeを格納できる大きさの整数型をtypedefして、
その型でstd::char_traitsを特殊化してやればstd::basic_string
(std::stringとstd::wstringのtypedef元)が使えるようになる。
0974デフォルトの名無しさん
2005/10/30(日) 16:16:55決まってねえのもダメだが、サイズが決まってねえのも困りもんだよな
0975969
2005/10/30(日) 16:28:56どうもありがとうございました。
0976デフォルトの名無しさん
2005/10/30(日) 16:51:23(なんか勝手にデフォルトコンストラクタ呼ぼうとしてる)んだけど、これって正式な仕様なの?
自分で作ったクラスを入れようとしたときしばしばコケるんで微妙に不便なんだが…。
0977デフォルトの名無しさん
2005/10/30(日) 16:55:390978デフォルトの名無しさん
2005/10/30(日) 17:53:17俺が読んだ限りではキーはAssignableであるべしと指定されているだけだった。
因みにg++3.4.4ではDefaultContructibleでないキーが使えた。
>>977
デフォルトコンストラクタを持たせないのが自然なケースは多いと思うが。
0979デフォルトの名無しさん
2005/10/30(日) 18:23:44ぐるぐる回しながら、一つずつ比較していくしか無いのでしょうか?
0980デフォルトの名無しさん
2005/10/30(日) 18:25:16operator==
operator!=
0981デフォルトの名無しさん
2005/10/30(日) 20:20:120982デフォルトの名無しさん
2005/10/30(日) 20:25:14確かにそのためにmapped_typeはDefaultContructibleの必要があるけど、
key_typeの方はそうじゃないんじゃないか?
0983981
2005/10/30(日) 20:33:580984デフォルトの名無しさん
2005/10/30(日) 21:15:45それなら>>981の言う通り。
0985デフォルトの名無しさん
2005/10/30(日) 22:00:53T const &as_const(T &t)
でシリアライズしてるけど
そっからどうデシリアライズするんですか?
0986デフォルトの名無しさん
2005/10/30(日) 22:10:53saveとloadに分けるってことか?
0987デフォルトの名無しさん
2005/10/30(日) 22:16:32ところで次スレはどうするよ?
0988デフォルトの名無しさん
2005/10/30(日) 22:27:28【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/l50
C++相談室 part44
http://pc8.2ch.net/test/read.cgi/tech/1128512737/l50
【初心者歓迎】C/C++室 Ver.22【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1128872687/l50
0989デフォルトの名無しさん
2005/10/30(日) 22:52:20次スレ
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
0990デフォルトの名無しさん
2005/10/30(日) 23:52:08あらら
0991デフォルトの名無しさん
2005/10/31(月) 10:53:18死んだほうがいいんじゃないか、その頭の悪さじゃ。
0992デフォルトの名無しさん
2005/10/31(月) 11:02:41自治厨乙
0993デフォルトの名無しさん
2005/10/31(月) 13:05:210994デフォルトの名無しさん
2005/10/31(月) 20:02:17スレタイは「STL & boost」みたいに。
0995デフォルトの名無しさん
2005/10/31(月) 21:56:260996デフォルトの名無しさん
2005/10/31(月) 22:07:43980超えてからは何言っても無駄だろう。
0997デフォルトの名無しさん
2005/10/31(月) 22:08:17そこへtemplate総合スレもぶち込め。
0998デフォルトの名無しさん
2005/10/31(月) 22:25:55議論も何も自治厨の自作自演で誰も使わないスレ作られても迷惑なだけだ。
0999デフォルトの名無しさん
2005/10/31(月) 22:27:22その内容が、前スレ埋まる直前にも出た気がするが・・・
結局次スレがそのまま立っちゃってナァナァのままお流れになった。
1000デフォルトの名無しさん
2005/10/31(月) 22:28:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。