【注意】STLの落とし穴【危険】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG思わぬ落とし穴、やってはいけない禁じ手などを
晒すためのスレです。暗黙知の解放!
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNGメモリも解放されるとは限らない罠。
0004デフォルトの名無しさん
NGNGん!?危険なの?ちと想像してみよかな・・・
0005デフォルトの名無しさん
NGNGstd::sort()などのコピーを伴うアルゴリズムを呼び出した時の事を考えてみろ。
普通ポインタのコピーをしても、ポインタが指しているインスタンスは変化しないという
考えの元に各種アルゴリズムが構築されている。
しかし、std::auto_ptrは、ポインタをコピーするだけで、元のポインタの値は 0 に設定
されてしまう。これにより、複数のポインタから同一のインスタンスを指す事のないように
してあるのがstd::auto_ptrだ。だからこそstd::auto_ptrのスコープを外れた時点で、それ
が指すインスタンスもdeleteできる。
すなわち、コピーコンストラクタと代入演算子のセマンティックスが独自の物で、通常の
ポインタとは全く互換性がない。
0006デフォルトの名無しさん
NGNGコンパイルエラーになるようになってるしね。
0007デフォルトの名無しさん
NGNGC言語の見えないバグ、対処法でも語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1064482029/l50
0008デフォルトの名無しさん
NGNGC厨と合流するつもりはない。
0009デフォルトの名無しさん
NGNG非常に使いにくい。
0010デフォルトの名無しさん
NGNGコンパイラが対応してないwwwwww
0011デフォルトの名無しさん
NGNGSTLもまともに機能しない糞コンパイラなぞ捨ててしまえ。
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG是非知りたいけど
0014デフォルトの名無しさん
NGNGそれは、普通でしょう。 auto_ptrはstlのコンテナとは共存できない。
Exceptional C++: Item 37. AUTO_PTR を読みましょう。
ちなみに、auto_ptrをコンテナで使おうとするとエラーが出るのは、Exceptional C++によれば、
auto_ptr's copy constructor and copy assignment operator take references to non-const to
the right-hand-side object. Most implementations of the standard containers' single-element
insert() functions take a reference to const, and hence won't work with auto_ptrs.
とのこと。 boostのshared_ptrは便利だよ。
0015デフォルトの名無しさん
NGNG例えば、1000文字程度の文字列が格納されてるstringを関数の引数などで
実体渡しだとか、返却すると高いのかな?
string tail( string a)
{
return a + ":addtail";
}
みたいなコード。
参照渡しって微妙に使いにくいんだよね・・・だから実体渡しにしたいの
だけど。
0016デフォルトの名無しさん
NGNGstringの実装方法による。大抵のstringは文字列そのものを別の領域にもっており、
コピーコンストラクタでコピーされるのは管理領域だけという場合が多い。
それよりも、関数内での演算時にコンストラクタが呼び出され、そちらはまともに内容の
方もコピーするので、間違いなく遅くなるぞ。
0017デフォルトの名無しさん
NGNGそれでいいと思う。 最近のコンパイラって結構賢いし、あんまり細かいことは気にしない
方がいい。 stringも大抵はリファレンスカウント方式だから、コピーのコストは低い。
ちなみに、C++ではmake copying cheaperは一つの鉄則。 特に、STLユーザーは。
(Effective STL: Item 3参照) C++でもJavaみたいにプログラミングするのがいいみたい。
また、Efficent C++ Chapter 4. The Return Value Optimization参照するといい。
0018デフォルトの名無しさん
NGNGほうほう、なるほど。
んじゃ、stringの場合、もう参照渡しにする理由なんてない
気がするなー。
サンクス。
0019デフォルトの名無しさん
NGNGEfficient C++でも読んでみるといいかも。
0020デフォルトの名無しさん
NGNGvector< string > なんかを返却するのは危険だろうか?
例えばの用途としては、ファイル名を列挙するサービスを作ったとして、
その場合、なんらかの形で配列を返しますけど、安全性考えるなら
vectorだとか使いたいところ。それも、返却で。
アセンブリリスト出力させても、いまいち分からないし。
特にSTL内部の謎シンボルにcallだとかjumpされるともう追えない (;-;)
0021デフォルトの名無しさん
NGNG危険でも何でもない。std::vectorのコピーコンストラクタが全部面倒みてくれる。
もちろん参照を返す場合は、ローカル変数の参照を返してはいけない事などは
他のクラスやPODと同じ。
0022デフォルトの名無しさん
NGNGvector<>ってアドレス的に連続性が保障されてるって、みなさん
知ってました?
例えば、vector< char > tbl;
とあって、tbl.size()==nな場合、
tbl[0]からtbl[n-1]は連続したアドレスであることが保障されてるんだってさ。STLの仕様として。
なので、char*p = &tbl[0] とかやって、その後は *p++ = 0x00 だとかで
アクセスできてしまうと。iteratorを使う必要もないみたい。
でもdequeでは、保障されてるのか、保障されてないのか不明。
明記された文書も見たこと無い。
listあたりだと確実に連続してないので、気にならないけど
dequeは気になるなー。
0023デフォルトの名無しさん
NGNGあ、いや、おそらく20はそのコピーコンストラクタのコストを気にしてると
思うんですが。例えば、stringが100個くらいあったとして、それを返却すると
関数出口で発動するコピーコンストラクタがまじでコピーしているのか否か?など。
0024デフォルトの名無しさん
NGNGISO/IEC14882:2003ではstd::vectorの連続性が保証されてるよ。
§23.2.4の当たり。
std::dequeは保証されてない。
002522
NGNGvector<bool>の時だけは特殊カスタマイズ発動して、ビット操作を意識した
コードが生成されるみたい。ビットセットなんかでメモリかつかつの時は
積極的にvector<bool>を使うといいみたい。
0026デフォルトの名無しさん
NGNGそれだったら、std::vectorの実装による、としかいいようがない。
Copy On Writeなら、要素を変更しようとしない限り、管理情報のみを返すかもしれない。
const参照なら戻り値最適化をしてくれる可能性がさらに高まる。
0027デフォルトの名無しさん
NGNG聴いたことがあるんだけど…
ビットセットはそのままstd::bitsetじゃダメなん?
0028デフォルトの名無しさん
NGNGEffective STL第18項。
std::vector<bool>はコンテナの要件を満たしていない。
それよりもboost::dynamic_bitsetの方がまだましだろ。
0029デフォルトの名無しさん
NGNGc言語時代のprintf可変調引数って便利だったなと。
%05dで0つめてくれたり。%08xで16進表記してくれたり。
.printf()というか.vsprintf()に相当するユーティってありそうだけど
見たことない。ご存知のかたいますー?
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNGあー、そうかそうか。大抵の用途は確かに結果受け取りの
const参照で済むから、これからはこまめにconstつけてこうかな。
0032デフォルトの名無しさん
NGNGそんなに標準の書式マニピュレータを使うのが面倒か。
std::setw()以外は効果がストリームに残ったままになってしまうので元に戻すのが
面倒と言えば面倒だが。
直接フラグをsetf()/unsetf()でいじってもいいしな。
0033デフォルトの名無しさん
NGNG自分は使ったこと一度も無い。ものにもよると思うんだけど、
「これないと損するから黙って使え!」というくらい強烈なお奨め
boostモジュールってある?
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNG0036デフォルトの名無しさん
NGNG手軽に正規表現使うにはいい
0037デフォルトの名無しさん
NGNG発狂しそうになった。
0038デフォルトの名無しさん
NGNG次期標準に入ることが決まってる物は使って損はないと思われ
0039>>37
NGNGInt_ convert_(Int_ v) const {
return
boost::mpl::if_c <
(rightShifts_ == leftShifts_),
NoShiftPolicy,
boost::mpl::if_c <
(leftShifts_ > rightShifts_),
LeftShiftPolicy<leftShifts_-rightShifts_>,
RightShiftPolicy<rightShifts_-leftShifts_>
>::type
>::type::shift(v);
}
これ、c++のソースなんですか?
意味不明〜
0040デフォルトの名無しさん
NGNGSTLくらい標準であれば安心して使えるのだけどねー。
vc++、gccどちらでも同じソースをコンパイルできなければならない仕事を
抱えてるため。
でも次期標準決定してるなら、そろそろ馴れとかねば。
0041デフォルトの名無しさん
NGNG基本的にはSTLと同じ感覚で使えるので(かゆいところに手が届く感じ)
馴れるというより使ってみればすぐ分かるかと。
(spiritやlambdaは別として)
http://boost.sourceforge.net/regression-logs/
コンパイラの対応状況はここで見れば分かりますが、
VC7.1〜とgccならほぼ全て問題ないと思われ
0042デフォルトの名無しさん
NGNG関数で危険なのは、ポインタやレファレンスを返すとき。 特に、関数内部で作られたオブジェクトを
ポインタやレファレンスで返すのは重大な誤り。
この場合のオーバーヘッドが気になるなら、shared_ptrを用いるとよい。 shared_ptrを用いれば
Javaのようにオブジェクトを扱えるのでメモリ管理を気にしなくてよい。 ただし、構文が少し
煩雑になるという欠点を持つ。 *や->演算子を多用するから。
例:
typedef vector<string> VectorString;
typedef shared_ptr<VectorString> RefVectorString;
RefVectorString v(new VectorString());
v->push_back("Hello");
VectorString::iterator it = v->begin();
cout << *it;
RefVectorString f(){
RefVectorString v(new VectorString());
v->push_back("Hello");
return v;
}
RefVectorString v2 = f();
もOK!
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGお前みたいな初心者が出てくると、かえって混乱するから引っ込んでてくれ。
0045デフォルトの名無しさん
NGNG基本的にはどこかで作ったvector<string>を「丸ごとコピーして」
値返しするんじゃない?
なので、スタックに積まれたvector<string>でも、戻り値は
「丸ごとコピーした」値なので、ローカルスコープを抜けて
元のvector<string>が削除されても戻り値に影響しないはず。
>26
そんな無茶なRVOあるの?
>33
boost::test
CPPUnitよりセットアップが簡単。ガリガリ手書きする必要あるけどね。
0046デフォルトの名無しさん
NGNGخصصةلمنالرأي كانتص
العاهلالمغربيلموريتانيا،ولكنل
0047デフォルトの名無しさん
NGNGboost-sandboxにあるBoost.Moveとかも見てみたら良いかも知れませんよ.
実体返しと構文一緒で効率は参照渡し並で(゚д゚)ウマーみたいな.
"Move"の概念がイマイチ浸透してないのとドキュメントが未整備なために
非常に取っ付きにくいライブラリですけれど.
>45
>boost::test
bjamのunit-testルールと組み合わせるとbjamと打つだけで
ビルド後即単体テストな感じでさらに(゚д゚)ウマー.
0048デフォルトの名無しさん
NGNGだったら、一辺OCAMLやHaskellかじってみたらジェネリックプログラミング
ってなにかよく理解できるとおもうよ
0049デフォルトの名無しさん
NGNG統一する?
それとも複数箇所から参照されるようなオブジェクトだけにしておく?
0050デフォルトの名無しさん
NGNGリファレンスカウンティングスマートポインタが蔓延する罠。
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
05/03/12 08:13:25無茶苦茶行数の長いテキストを読み込ませるなんて攻撃ができる。
なんて話をこの前C++スレで見かけたな。
0053デフォルトの名無しさん
05/03/12 08:57:470054デフォルトの名無しさん
05/03/12 21:22:240055デフォルトの名無しさん
05/03/13 19:15:08ぐぐっても見つからない。ほんとに有名な話なのか?
0056デフォルトの名無しさん
2005/06/04(土) 16:50:44内部の実装はべた配列だ。だからといってメモリのアドレスを取得して(
そもそも iterator がポインタだったする)vector にアクセスするのは間違いだ。
社会に出たらやっていいことと悪いことを見分けなければならない。
内部のメモリポインタを取得して操作したいのなら valarray を使おう。
単純なループをまわすとき iterator を使おうが [] でアクセスしようが、
ポインタを使ったときと同じ速度のコードをはいてくれる。
今時ポインタのほうが速いというのはうそだと思っていいだろう
(もちろんレジスタの割り当てを気にするくらいの限界のチューニングをするときは違うかもしれないが)。
http://www.nantekotta.com/stl.html
0057デフォルトの名無しさん
2005/06/04(土) 16:55:33終端の判別は必ずイテレータが終わりかどうかを調べること。
0058デフォルトの名無しさん
2005/06/04(土) 16:59:35vector のメモリレイアウトはC言語の組み込み配列と同じだよ。
そんなメンテナンスされてない古い記事引用して何が言いたいの?
0059デフォルトの名無しさん
2005/06/04(土) 17:03:12社会に出たらやっていいことと悪いことを見分けなければならない。
0060デフォルトの名無しさん
2005/06/04(土) 17:06:26うん、それは当然だと思うよ。で、その言葉にもう一言加えさせてくださいな。
「社会に出たらなぜそれをやって良いか/悪いかを人に納得できるように説明できなければならない」
0061デフォルトの名無しさん
2005/06/04(土) 17:15:50イテレータ使ってループ回しておきながら 0 で終端判定ってのは中途半端な間違いだな。
そんな間違いする奴は string の要素に 0 が入ってたりしても嵌るんだろうな。
0062デフォルトの名無しさん
2005/06/04(土) 17:18:10だったら>>56を間違いであると見分けることができないとな。
006360
2005/06/04(土) 17:18:18CのAPIとデータをやりとりする際の一時バッファとして利用する場合などでは
ポインタによるアクセスは(vectorが空でなければ)安全で有用だという主張です。
0064デフォルトの名無しさん
2005/06/04(土) 17:29:16>内部のメモリポインタを取得して操作したいのなら valarray を使おう。
これってOKだっけ?valarray自体カビの生えた前時代の遺物なので
どうでもいいっちゃどうでもいいんだけど
0065デフォルトの名無しさん
2005/06/04(土) 18:23:57ベクタが空でも、個数も0なんで
結局安全なケースがほとんどだと思うが
0066デフォルトの名無しさん
2005/06/04(土) 18:25:51C/C++使うんなら未定義動作に気をつける覚悟を持たなくちゃ。
0067デフォルトの名無しさん
2005/06/04(土) 18:35:150068デフォルトの名無しさん
2005/06/04(土) 19:22:480069デフォルトの名無しさん
2005/06/04(土) 19:45:39うん。で、何が言いたいの?
まぁどうせ急に絡みたくなっただけなんだろうけど。
0070デフォルトの名無しさん
2005/06/04(土) 19:49:05配列の先頭ポインタと個数を渡すというインターフェース自体が
危険だと言いたいのだろう。
0071デフォルトの名無しさん
2005/06/04(土) 19:50:06ベクタが空な時はポインタ取っちゃダメ。
007370
2005/06/04(土) 20:11:04Cの配列との比較にもvalarrayとの比較にもなってないから、
一体何を言いたいのだろうと考えた結果の結論でした。
失礼。
まだ>56の話かと思ってました。
0074デフォルトの名無しさん
2005/06/04(土) 21:33:13int i;
for(i = 0; i < n; ++i) {
hogehoge(ptr[n]);
}
}
みたいな、Cルーチンに、
hoge( &vect[0], vect.size() );
とかやると、本当にvectが空のときだけは動作が未定義なの?
そういう無駄なチェックを要求するう糞ったれな仕様は、やめてほしいんだが
0075デフォルトの名無しさん
2005/06/04(土) 21:38:00未定義な訳がない気がするが
一般には、そういう「Cルーチン」の実装によるとしかいえないだろう
0076デフォルトの名無しさん
2005/06/04(土) 21:39:570077デフォルトの名無しさん
2005/06/04(土) 21:42:45vectorが空のときに、&vect[0]の動作が未定義かどうかってこと
ごみの値でいいから、とにかくポインタを返してさえくれる仕様ならば
何も文句は無い
0078デフォルトの名無しさん
2005/06/04(土) 22:24:24vect.empty() ならば vect[0] の時点で未定義動作。
23.1.1/12 で a[n] は *(a.begin() + n) と定義されている。
23.1/7 により、 a.empty() のとき a.begin() == a.end() であり、
この値はコンテナに対する "past-the-end" と呼ばれる値になる。
24.1/5 により "past-the-end" は "dereferencable" ではない。
24.1.1/2 の票にイテレータ a に対する *a の事前条件として
a が "dereferencable" であることが挙げられている。
(ちなみに、 a が "dereferencable" であることは a + n を定義するための事前条件でもある。)
事前条件を満たさないことになるので、未定義動作となる。
(最後1行だけ、規格中に明らかな記述を見つけられなかった。17.4.3.7かな?)
ttp://www.kuzbass.ru/docs/isocpp/lib-containers.html#lib.sequence.reqmts
ttp://www.kuzbass.ru/docs/isocpp/lib-iterators.html#lib.iterator.requirements
0079デフォルトの名無しさん
2005/06/04(土) 22:51:51http://pc2.2ch.net/tech/kako/1037/10377/1037795348.html
ここの 603-
0080デフォルトの名無しさん
2005/06/05(日) 01:38:10まったくプログラム経験のろくに無い奴が作ったとしか思えん糞ったれな仕様だ
空の時には「未定義のポインタ値」を返すbegin_ptr()とかでもあればともかく
大体STLってのは、馬鹿丸出しの仕様が多い
vector<int> v;
vector<int>::const_itetator it;
中略
copy(it, v.end(), dest);
こんなあたり前のコードが通らねえから、const_castがいるときた
const_iteratorを返す、cbegin(), cend()ぐらい用意しとけっての
0081デフォルトの名無しさん
2005/06/05(日) 01:50:24名前は c_str() に倣って c_ptr() とかして
空のときはヌルでも返すことにするとよかったかもしれんな。
あと const_cast は要らんだろう、といちおう突っ込んでおく。
0082デフォルトの名無しさん
2005/06/05(日) 01:54:01copy(it, v_end, dest);
とかやれば、要らんけど
やらんと、it は const_iterator で、v.end()はinteratorだから
templateでどっちの型を採用したらいいかわからんといって怒られる
0083デフォルトの名無しさん
2005/06/05(日) 02:03:200084デフォルトの名無しさん
2005/06/05(日) 05:57:19const_iterator ci = v.begin();
iterator i = const_cast< const_iterator >( ci );
これが出来る出来ないよりも、やって良い行為なのか
悪い行為なのかわかりづらい。
全てのiteratorでconst_castのオーバーロード関数を
用意してくれてると良かった。
つーか誰かSTLに詳しい人作ってYO!!STLport用でいいカエラ!
0085デフォルトの名無しさん
2005/06/05(日) 06:28:09> iterator i = const_cast< const_iterator >( ci );
これ、何がしたいの?
> const_castのオーバーロード関数
これも意味がわからん。
0086デフォルトの名無しさん
2005/06/05(日) 07:09:42const_cast< iterator >( ci );
これの間違い。
>> const_castのオーバーロード関数
>これも意味がわからん。
これこれ。
template< typename T0, typename T1 >
T1 const_cast( T0 );
template< >
std::set::iterator const_cast< std::set::const_iterator, std::set::iterator >( std::set::const_iterator i ){ ...}
これが全コンテナにあったら便利じゃん。
0087デフォルトの名無しさん
2005/06/05(日) 07:12:30template< typename T >
T const_cast( std::set::const_iterator i );
template< >
std::set::iterator const_cast< std::set::iterator >( std::set::const_iterator i ){ ...}
0088デフォルトの名無しさん
2005/06/05(日) 07:41:33それがあると何がうれしいの?
0089デフォルトの名無しさん
2005/06/05(日) 08:38:140090デフォルトの名無しさん
2005/06/05(日) 13:24:21mutable iterator って宣言すればいいだけじゃない?
const_cast の出番がわからん。
0091デフォルトの名無しさん
2005/06/05(日) 14:46:21class test
{
std::list<int> c;
mutable std::list<int>::iterator i;
void constant_method() const
{
i= c.begin(); // ERROR
i= const_cast< std::list<int>* >(&c)->begin(); // OK
}
void nonconstant_method()
{
i= c.begin(); // OK
}
};
0092デフォルトの名無しさん
2005/06/05(日) 14:53:42それは普通の const_cast だろ。>>86-87 で言われてるものとは違うようだが。
0093デフォルトの名無しさん
2005/06/05(日) 15:07:41説明不足ですまんね。
>>86-87があれば>>91みたいな方法とらずに
いいなーみたいな。それだけ。
まあ、あったらイイナ♪(マイメロふう)程度のもの
なんで真に必要な場面はそうないんじゃない?
0094デフォルトの名無しさん
2005/06/05(日) 15:10:39template <class InputIterator1, class InputIterator 2, class OutputIterator>
void copy(InputIterator1 first, Inputiterator2 last, OutputIterator out);
>>86-87みたいなのは、あってもいいけど
紛らわしいから名前を変えた方がいいよね。
const_cast とはやってることが全然違うし。
const_iterator_cast とかなんとか。
0095デフォルトの名無しさん
2005/06/05(日) 15:24:02バグの原因だよなあ
結局解決策は、iteratorの種類ごとにcopyの多重定義ぐらいしかなさげ
0096デフォルトの名無しさん
2005/06/05(日) 15:32:01std::iterator_traits + boost::enable_if
あたりを使えばなんとなるっしょ。
どのくらい制限すればいいかは、議論の余地が大有りだろうけど。
0097デフォルトの名無しさん
2005/06/05(日) 15:37:17>そういうのがあると、beginとendの型が全く違っててもパラメタがマッチするから
インスタンス化で弾かれるだろ。
俺は>>94が正解だと思う。
http://www.boost.org/libs/iterator/doc/new-iter-concepts.html
で提案されてるInteroperableIteratorってのもそのためのものだよな?
0098デフォルトの名無しさん
2005/06/05(日) 15:48:36interoperable iterator + enable_if(もしくはconcept check)というのが最良ですかね.
後,最近iterator, const_iterator間のinteroperability以外に
iterationの情報をiteratorの型にエンコードしてコンパイル時にalgorithmをアンロールする
とか,それと普通のiteratorによるループを融合しようという趣旨の話もちらほらあるので
(Fusionとか最近David Abrahamsがやっているヤツとか)
その関連でも>>94の形が今後ちらほら出てくるかも知れないです.
0099デフォルトの名無しさん
2005/06/05(日) 15:50:15string str = cstr;
・・・
copy(str.begin(), cstr.end(), dest);
こんなエラーが検出できなくなるのが、ちと気になる。
0100デフォルトの名無しさん
2005/06/05(日) 15:58:03現状でも↓がコンパイルエラーにならないんで、何が悪くなるとも思わん。
copy(a.end(), b.end(), dest)
0101100
2005/06/05(日) 15:58:300102デフォルトの名無しさん
2005/07/23(土) 15:26:07copy(it, vector<int>::const_iterator(v.end()), dest);はどう?ちょっと長ったらしいけど。
0103デフォルトの名無しさん
2005/12/09(金) 23:17:02> const_iteratorを返す、cbegin(), cend()ぐらい用意しとけっての
これだろ?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1865.pdf
&v[0]は未定義の方がいいと思う。
0104デフォルトの名無しさん
2005/12/09(金) 23:39:46なにかいい方法あります。
0105デフォルトの名無しさん
2005/12/09(金) 23:46:04boostの中の人を恐喝して、get()を取り消させる。
0106デフォルトの名無しさん
2005/12/10(土) 02:15:400107デフォルトの名無しさん
2005/12/10(土) 03:15:25copy(boost::const_begin(v), boost::const_end(v), dest);
0108デフォルトの名無しさん
2005/12/10(土) 08:11:010109デフォルトの名無しさん
2005/12/10(土) 08:33:060110デフォルトの名無しさん
2005/12/10(土) 08:53:16ま、永遠の次期標準ってのも珍しくない業界だけどな。
0111デフォルトの名無しさん
2005/12/10(土) 09:00:090112デフォルトの名無しさん
2005/12/10(土) 09:43:26実際俺にとっては有ると便利ではなく、無いと不便と化している。
0113デフォルトの名無しさん
2005/12/10(土) 09:56:02MPLのソースなんてどうみてもコンパイラの実装の一部
0114デフォルトの名無しさん
2005/12/10(土) 10:12:180115デフォルトの名無しさん
2005/12/10(土) 10:16:270116デフォルトの名無しさん
2005/12/10(土) 22:53:350117デフォルトの名無しさん
2005/12/10(土) 22:59:19そうだよ。
0118デフォルトの名無しさん
2005/12/10(土) 23:31:300119デフォルトの名無しさん
2005/12/10(土) 23:37:03STLとBoostは排他的な存在ではないです。
BoostにはたしかにSTLの補完的なものもありますが、
そうでないものもかなり多いです。
0120デフォルトの名無しさん
2005/12/10(土) 23:59:570121デフォルトの名無しさん
2005/12/11(日) 01:34:420122デフォルトの名無しさん
2005/12/11(日) 02:53:51C++使ったことないだろ?
0123デフォルトの名無しさん
2006/03/29(水) 10:39:49から誘導されてきたんですが、
このスレタイだと質問とかしずらい。
0124デフォルトの名無しさん
2006/03/29(水) 10:42:37C++相談室 part48
http://pc8.2ch.net/test/read.cgi/tech/1142423595/l50
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/l50
0125デフォルトの名無しさん
2006/03/29(水) 13:37:21使いきったところで相談室 5を立てることが前スレの総意として決定されました。
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
0126デフォルトの名無しさん
2006/03/29(水) 13:53:290127デフォルトの名無しさん
2006/03/29(水) 15:13:000128デフォルトの名無しさん
2006/03/29(水) 15:22:14STLは規格により明確にC++である
C++相談室と分けるほどトラフィックもない(ってか閑散としてる)
もし分けるとなるとC++相談室では「C++からSTLを除いたもの」を主な話題とすることになるが
「C++からSTLを除いたもの」でそんなに話題あるかい?
>>127
要る理由は?
0129デフォルトの名無しさん
2006/03/29(水) 15:23:580130デフォルトの名無しさん
2006/03/29(水) 15:25:14規格
0131デフォルトの名無しさん
2006/03/29(水) 15:29:02STLスレではコンパイラやライブラリによる
実装依存なものまで含んだディープな話題
てなかんじだと私は思っていました。
0132デフォルトの名無しさん
2006/03/29(水) 15:31:21>コンパイラやライブラリによる実装依存なものまで含んだディープな話題
のスレの名に「STL相談室」はないだろうw
0133デフォルトの名無しさん
2006/03/29(水) 15:34:58【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
よりコピペ
8 名前:デフォルトの名無しさん :04/09/19 20:32:58
STLはSTLで分けてほしい。
でないとBoostまで一体化になってしまう。
9 名前:デフォルトの名無しさん :04/09/20 05:21:12
個人的には、STLだけでも分厚い本がかけるぐらい広大なものだから、STL専用スレがあってもいいとおもうよ。
10 名前:デフォルトの名無しさん :04/09/20 08:25:11
でもtemplateスレは他のC++スレより書き込み少なめだからそこでSTLも済ませてもいいと思うけど。
11 名前:デフォルトの名無しさん :04/09/20 12:11:52
STLもBoostもtemplateの応用例の一部に過ぎないから。
そんなものがtemplateスレを埋めたら
PerlスレをCGIの話で埋めるようなもの。
0134デフォルトの名無しさん
2006/03/29(水) 15:35:24もし必要とされてないならスレは1000まで埋まらないっつの
半年でスレ1個埋まるんだからこの板ならまあまあのスピードだ
決して閑散としてた訳じゃないと思うが?
というか必死になってるのは君1人か、多くて君ともう1人だろ?
0135デフォルトの名無しさん
2006/03/29(水) 16:08:49同意。ぜんぜん閑散としてない。
なぜそんなに必死にまとめようとしているのかわからん。
0136デフォルトの名無しさん
2006/03/29(水) 16:12:390137デフォルトの名無しさん
2006/03/29(水) 16:43:310138デフォルトの名無しさん
2006/03/29(水) 16:44:08>>132
0139デフォルトの名無しさん
2006/03/29(水) 16:45:590140デフォルトの名無しさん
2006/03/29(水) 16:48:39閑散としてないのはたぶんC++相談室でSTLの話もされてるからだと思う.
0141デフォルトの名無しさん
2006/03/29(水) 16:51:320142デフォルトの名無しさん
2006/03/29(水) 18:21:14だったらSTLスレも要らないということになるぞ。
0143デフォルトの名無しさん
2006/03/29(水) 20:30:570144デフォルトの名無しさん
2006/03/29(水) 20:41:56それはあなたの思いこみだ
0145デフォルトの名無しさん
2006/03/29(水) 20:50:38おまいらC++相談室でSTLの話題が出ようものならスレ違ってんで
STLスレの方に誘導できるのか?
STLスレって名前を単に存続させたいやつはやってみろよ
0146145
2006/03/29(水) 20:52:060147デフォルトの名無しさん
2006/03/29(水) 23:40:41【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/l50
0148デフォルトの名無しさん
2006/03/30(木) 00:00:41アッー!!
0149デフォルトの名無しさん
2006/03/31(金) 23:14:050150デフォルトの名無しさん
2006/03/32(土) 18:38:050151デフォルトの名無しさん
2006/04/03(月) 11:38:01STLなどという意味のない単語そのものの廃止を提案する。
0152デフォルトの名無しさん
2006/04/03(月) 12:54:110153デフォルトの名無しさん
2006/04/15(土) 16:40:550154デフォルトの名無しさん
2006/08/02(水) 18:46:250155デフォルトの名無しさん
2006/08/04(金) 15:04:510156デフォルトの名無しさん
2006/08/05(土) 10:54:400157デフォルトの名無しさん
2006/10/14(土) 15:25:220158名無しさん@お腹いっぱい。
2006/10/14(土) 16:21:20http://www.excite.co.jp/search.gw?search=%83%5E%83P%83I%83l%81@%8D%C5%8B%AD&target=combined&look=excite_jp&Language=
0159デフォルトの名無しさん
2006/10/14(土) 19:28:480160デフォルトの名無しさん
2006/10/14(土) 21:44:29http://pc8.2ch.net/test/read.cgi/tech/1143608073/l50
これの次スレとして使ったらどうかという話があったので、とりあえずURLを張っておく。
0161デフォルトの名無しさん
2006/10/14(土) 21:48:080162デフォルトの名無しさん
2006/10/14(土) 22:31:280163デフォルトの名無しさん
2006/10/26(木) 18:52:170164age
2007/03/15(木) 14:41:540165デフォルトの名無しさん
2007/04/01(日) 15:51:25vectorのそれと挙動が違うのな。
valarrayはSTLじゃないし、文句は言えないんだけど
これにはやられたよ。
皆さんは知ってました?
0166デフォルトの名無しさん
2007/04/01(日) 16:36:090167デフォルトの名無しさん
2007/05/02(水) 12:10:50使う前にざっと実装覗いてみる程度もしねーのか…
0168デフォルトの名無しさん
2007/05/02(水) 19:26:370169デフォルトの名無しさん
2007/05/02(水) 22:24:01沈んでるスレに能書きたれて悦に入るらしいよ。
0170デフォルトの名無しさん
2007/06/02(土) 03:48:010171デフォルトの名無しさん
2007/06/07(木) 20:54:19お〜れ〜もぉぉ ゆとり〜
0172デフォルトの名無しさん
2007/06/07(木) 20:57:25もしくはすごいおっさんか。
0173デフォルトの名無しさん
2007/06/07(木) 21:08:510174デフォルトの名無しさん
2007/06/07(木) 22:12:070175デフォルトの名無しさん
2007/06/21(木) 18:25:590176デフォルトの名無しさん
2007/06/22(金) 12:56:200177デフォルトの名無しさん
2007/07/05(木) 09:01:55本屋さんでは、書名にSTLを含めたものも有るし、「ああ、入門書の次の段階の話で
Boostの手前のレベル辺りを話題にすればいいんだな。」と分かり易いし、
ステパノフに敬意を表したいから、伝統ある用語"STL"を残したいな。
0178デフォルトの名無しさん
2007/09/15(土) 15:28:39typedef struct tagTestData {
int num;
std::queue<int> que
} TestData
とかやって
TestData *ptr = malloc(sizeof(UserData))
ptr->que.push(1)
とやると,プログラムが落ちるのだが,これってnewじゃないと
だめ?
STLってコンストラクタとか使ってるの?
すごい馬鹿な質問でごめん
0179デフォルトの名無しさん
2007/09/15(土) 15:55:07その前に、TestData *ptr = malloc(sizeof(UserData))ってことはエラーになるわけだが。
つーか、TestDataかUserDataかどっちなのかと。
0180デフォルトの名無しさん
2007/09/15(土) 16:20:45使ってる
0181デフォルトの名無しさん
2007/09/15(土) 17:37:340182デフォルトの名無しさん
2007/09/15(土) 22:37:170183デフォルトの名無しさん
2007/09/16(日) 01:35:36typedef struct tagTestData {
なんて書き出してるあたり、
>>178はCでそれなりに経験積んだC++移行中の人なのではないかな。
>>178
C++でmallocは禁じ手だよ。
むしろ存在を忘れてしまっても構わない。
0184デフォルトの名無しさん
2007/09/16(日) 01:43:510185デフォルトの名無しさん
2007/09/16(日) 01:53:17ひょっとしたらハンガリアン?
nwepほげほげ
mlcpほげほげ
あ、これなら徹底すればいけるかもしれないw
0186デフォルトの名無しさん
2007/09/16(日) 02:17:030187デフォルトの名無しさん
2007/09/16(日) 02:18:250188デフォルトの名無しさん
2007/09/16(日) 02:34:18メモリ空間だけ確保しておいて、ナカミはAPIが格納するオブジェクトかも……
あ、ちゃんとカプセル化すればいいのか
0189デフォルトの名無しさん
2007/09/16(日) 10:35:55new (ptr) TestData();
0190デフォルトの名無しさん
2007/09/16(日) 11:36:36勇気を私にください〜
0191デフォルトの名無しさん
2007/09/16(日) 11:45:11テキストファイルのときは new char []。
0192デフォルトの名無しさん
2007/09/16(日) 11:53:58STLあるんだからfstream使えば?
0193デフォルトの名無しさん
2007/09/16(日) 12:01:030194デフォルトの名無しさん
2007/09/16(日) 12:45:27だから、そういう目的のためにoperator newがあるんだろうに。
mallocとの違いは、不足時に例外を出すかどうかだけだよ。実質的に。
STLのvectorの実装でも、内部ではoperator newでブロック確保して使ってる。
(古いものに備えて)malloc使ってるのももちろんあるけど。
0195デフォルトの名無しさん
2007/09/16(日) 14:56:32んなもんスタックのバッファに確保するかvector<>使えよ
んなところでいちいちmalloc()やnewなんぞ使うな
明示的なdeleteやfreeは恥だと思え
0196デフォルトの名無しさん
2007/09/16(日) 17:55:04> Cでそれなりに経験積んだC++移行中の人
おれには、Cの教科書でC++のコーディングしてるプログラミング初級者にしか見えない。
>>179も書いているけど、”UserData”がなんなのか分からないと、
質問の意図がどこにあるのかすら分からない。
0197191
2007/09/17(月) 14:56:09なるほど。次回からそうする。
>>192,195
型を char とか unsigned char とかにするのが気に入らないと言っているのだが、読み取ってはくれなかった?
0198デフォルトの名無しさん
2007/09/17(月) 15:10:33としておけば済むことじゃないの?
0199デフォルトの名無しさん
2007/09/17(月) 18:35:52using boost::uint8_t;
0200デフォルトの名無しさん
2007/09/23(日) 21:04:02つまりallocaを使えば万事解決と
0201デフォルトの名無しさん
2007/09/23(日) 21:25:51標準から外れるという問題が発生。
0202デフォルトの名無しさん
2007/09/26(水) 02:53:070203デフォルトの名無しさん
2007/09/29(土) 15:24:070204デフォルトの名無しさん
2008/01/12(土) 20:01:55マリックワロタ
0205デフォルトの名無しさん
2008/01/17(木) 19:47:05> ゆとりゆとりって煽ってるやつて、ゆとり教育が昭和何年から始ったか知らないで言ってるんだろうな。
> もしくはすごいおっさんか。
>
団塊世代とは中高年の総称である。
○ or ×?
0206デフォルトの名無しさん
2008/01/17(木) 20:50:20ゆとり教育とは戦後教育のすべててある
教育勅語で教育を受けていない香具師をゆとりという
0207デフォルトの名無しさん
2008/01/17(木) 22:53:49強盗強姦殺人、いずれも今の少年の数倍やらかしてたんだけどね。
多少のゆとりはあったほうがいいな。
0208デフォルトの名無しさん
2008/01/17(木) 23:26:09ゆとりはむしろ極左系の影響を受けてる印象がある
0209デフォルトの名無しさん
2008/01/17(木) 23:28:540210デフォルトの名無しさん
2008/01/17(木) 23:54:28辺りを指すようだな。
0211デフォルトの名無しさん
2008/01/18(金) 00:02:520212デフォルトの名無しさん
2008/01/18(金) 08:33:430213デフォルトの名無しさん
2008/01/27(日) 18:48:17受験競争が異様に加熱してた時代で育ってんだよなぁ
子供が勉強漬けになってるって、しょっちゅうマスコミが取り上げてた
0214デフォルトの名無しさん
2008/02/01(金) 07:32:40学校で教えないから塾に郁子が増えるんだって
で政府の発表の方は学校ベースだから
それをマスコミュが真に受けて増幅してるだけ
0215デフォルトの名無しさん
2008/02/07(木) 03:03:19まぁ、納品で永遠におさらばの時だけ使ってるwww
0216デフォルトの名無しさん
2008/02/07(木) 07:38:360217デフォルトの名無しさん
2008/02/07(木) 07:58:270218デフォルトの名無しさん
2008/02/08(金) 02:20:240219デフォルトの名無しさん
2008/02/09(土) 14:53:040220デフォルトの名無しさん
2008/03/07(金) 13:12:59>Java が使いにくいのは静的だからではない
>ttp://d.hatena.ne.jp/kwatch/20080305/1204743236
>世の Java 屋はこのコードを見ても、何も疑問に感じないそうだ。ありえん。
0221デフォルトの名無しさん
2008/03/07(金) 13:48:21C++0x では、そこの var に対応する auto が入ることになった。
0222デフォルトの名無しさん
2008/03/07(金) 13:48:55コンテナに初期化子{a, b, c}が使えるようになり、
自動変数には型推論が使えるようになるはず。
0223デフォルトの名無しさん
2008/03/07(金) 13:55:580224デフォルトの名無しさん
2008/03/07(金) 13:56:04アクセサが気に入らねーならクラスにすんなと。
全部publicにして直さわりだと、後で内部構造変えたりできねーじゃん。何のためのprivateメンバなんだと。
まあ、こんなこと無いだろうけど3次元ベクトルをクラス内部で直交座標系で保持してたのを
内部処理の都合で極座標で保持するように変更するとかさ。
アクセス関数経由してたら、内部を変えてもクラス外部からは従来通り、直交座標で値の設定ができるわけでよ。
0225デフォルトの名無しさん
2008/03/07(金) 14:02:13例えば、C# 3.0の自動プロパティでは、
public int Hoge {get; set;}という風に書ける。こういうのがいいと言っているのでは?
224のように変更する必要が出てきたら、従来の書き方に変えればいい。
0226デフォルトの名無しさん
2008/03/07(金) 14:03:18あんなアクセサ作る奴は内部構造変えたらそれに合わせてアクセサも追加したり
しかねない。
0227デフォルトの名無しさん
2008/03/07(金) 14:06:31そもそもクラスの発想は再利用だろ(俺自身は全然再利用できてねーけど)。
クラスを作る人間と使う人間が別々の場合を想定して作るべきじゃん。
使う人間に内部構造を意識させたら負けでしょ。
0228デフォルトの名無しさん
2008/03/07(金) 14:24:17ダメなコードは書きにくくするという点でJavaは正しい
0229デフォルトの名無しさん
2008/03/07(金) 23:06:03リファクタリング支援環境に乏しい言語だとかえって足枷になる
0230デフォルトの名無しさん
2008/03/10(月) 11:03:43バッファリングやってくれないからクラスっぽくないんだよね。
クラスっぽくないから、メソッド足し難い。
0231デフォルトの名無しさん
2008/03/10(月) 19:38:570232デフォルトの名無しさん
2008/03/10(月) 19:55:33かな?
バッファリングやってくれない、のほうは分からん。
頭痛が痛いのかもしれない。
0233デフォルトの名無しさん
2008/03/10(月) 21:50:56Facade パターンみたいに継承しない使い方も定番の使い方だ。
0234デフォルトの名無しさん
2008/03/15(土) 13:32:10STLにメソッド足し難いってどういう意味?
例えばvectorに追加機能が欲しいけどメンバ関数が追加できないって言いたいのか?
そういう場合はランダムアクセスイテレータに適用可能なアルゴリズムを書けばおk。
それはvector以外のコンテナにも利用可能な汎用メソッドとなる。
0235デフォルトの名無しさん
2008/03/15(土) 13:36:05というSTLのやり方に230が慣れていないだけだと思う。
0236デフォルトの名無しさん
2008/03/15(土) 14:01:130237デフォルトの名無しさん
2008/03/16(日) 13:29:410238デフォルトの名無しさん
2008/03/16(日) 13:37:57その分イテレータとファンクタが頑張ってるんだが。
0239デフォルトの名無しさん
2008/03/16(日) 23:20:43> 頭痛が痛いのかもしれない。
やべえじわじわ来た
0240デフォルトの名無しさん
2008/03/17(月) 09:05:02だって、そうでないと理解してくれない利用者もいるわけだし。
イテレータンのことを知らない人も居るんだおw
0241デフォルトの名無しさん
2008/03/17(月) 13:03:550242デフォルトの名無しさん
2008/03/17(月) 13:07:48甘いな、そこまで言うならpush_back()ではなくコンストラクタでサイズを決めてしまえw
0243デフォルトの名無しさん
2008/03/17(月) 13:11:000244デフォルトの名無しさん
2008/03/17(月) 13:25:17で、
何で、
>グローバル関数
グローバルという最悪解がでるんだよ。
がいきち?
0245デフォルトの名無しさん
2008/03/17(月) 13:27:40単なる誤爆じゃないのか? いくらなんでもそんな素っ頓狂なこと、気が違っていたってしないだろ。
0246デフォルトの名無しさん
2008/03/17(月) 13:28:550247デフォルトの名無しさん
2008/03/17(月) 13:40:02俺はvectorを継承してメンバ関数を追加するより
vectorを引数に取るグローバル関数を追加するほうがまだマシだと思っている。
五十歩百歩とか言うなら、そりゃそのとおりだ。
0248デフォルトの名無しさん
2008/03/17(月) 13:50:25五十歩百歩じゃねーよ。
クラスにメソッド足すのはふつー。
グローバル関数サイアク。
0249デフォルトの名無しさん
2008/03/17(月) 13:52:57vector限定ではなくなるけど、<algorithm>の関数群はサイアクなのか?
0250デフォルトの名無しさん
2008/03/17(月) 13:55:27ライブラリとして存在する関数と、
今からコードを足すのに関数しかできん、というのとは比較しているものが違う。
池沼、氏ね。
0251デフォルトの名無しさん
2008/03/17(月) 14:13:23ライブラリは別ですか。
じゃあ話は変わるけど、Effecitve C++の2版19項あるいは3版23項で、
メンバ関数よりも非メンバ関数が勧められていることはどう思う?
0252デフォルトの名無しさん
2008/03/17(月) 14:23:15C++の推奨に純粋に従っていく気はさらさらありません。
開発するもののデザインを正しくしたいだけ。
STLも開発者の要望になびくべき。
0253デフォルトの名無しさん
2008/03/17(月) 14:25:080254デフォルトの名無しさん
2008/03/17(月) 14:26:15↑
アホ
0255デフォルトの名無しさん
2008/03/17(月) 15:13:09お前とC++で正しいデザインの方向性が違うように思える。
(俺じゃなくてC++なのは、俺とC++もまた方向性が違うと感じるときがあるから)
>>253
アホの要望でもそれが多数派なら従うべきだね。
0256デフォルトの名無しさん
2008/03/17(月) 15:53:250257デフォルトの名無しさん
2008/03/17(月) 16:30:59完全誤読のアホ。
0258デフォルトの名無しさん
2008/03/17(月) 17:16:53そんな四字熟語はありません。
0259デフォルトの名無しさん
2008/03/17(月) 17:19:48漢字が四つ並べばすべて四字熟語だと思っていませんか?
# 「完全誤読」が妥当かどうかは兎も角。
0260デフォルトの名無しさん
2008/03/17(月) 17:24:30思っていませんよ。
0261デフォルトの名無しさん
2008/03/17(月) 17:47:460262デフォルトの名無しさん
2008/03/17(月) 20:11:23話題そらし乙
0263デフォルトの名無しさん
2008/03/17(月) 23:05:07「では」ではなく「だから」ですね。
もし私が「漢字が4つ並べばすべて四字熟語だと思っている」のなら、
「漢字が4つ並んでいるのに四字熟語ではない」という事態は私の考える世界にはあり得ないはずであり、
「完全誤読」の4文字を見た瞬間、私はそれを「そういう四字熟語」だと思ったはずですが、
私は「そんな四字熟語は存在しない」と言っているわけです。
つまり、漢字が4つ並べばすべて四字熟語だとは思っていないから出てきたものに対して、
あなたは(あなたですよね?)「漢字が四つ並べばすべて四字熟語だと思っていませんか?」と問うたわけです。
完全無駄……じゃなくて、完全に無駄な質問ですね。
0264デフォルトの名無しさん
2008/03/18(火) 04:51:46当人には無駄ではなくて君にだけ無駄なんだ
0265257
2008/03/18(火) 08:38:08257以降にはレスしません。
つまり、264の言葉は264にしか該当しませんw
0266デフォルトの名無しさん
2008/03/18(火) 08:38:47257より後にはレスしていません、でした。
0267デフォルトの名無しさん
2008/03/18(火) 15:50:51もしその通りなら >>263 は答えになっていませんし、随分間抜けな印象ですね。
0268デフォルトの名無しさん
2008/03/18(火) 15:56:20なら、
>常考……じゃなくて、常識で考えて
とか、
>がいしゅつ・・・じゃなくて、既出ですね。
とでもいうのか?
ウザウザ。
0269デフォルトの名無しさん
2008/03/18(火) 23:11:42http://pc11.2ch.net/test/read.cgi/prog/1200889547/l50
0270デフォルトの名無しさん
2008/03/19(水) 06:14:45「完全無駄」っていうのが、常考やがいしゅつのような「用語」なら、お前の言ってることも一理ある。
でもこの場合、単に日本語がおかしいだけだから、馬鹿にされてもしょうがない。
さらに言うと、お前のその的外れな切り返しも、「完全無駄」と同じくらい馬鹿にされてもしょうがない。ばーかw
0271デフォルトの名無しさん
2008/03/19(水) 08:38:42これらだって、出た瞬間は、
>単に日本語がおかしいだけだから
だったんだお。
おまいが全てを仕切るな、消えろ。
0272デフォルトの名無しさん
2008/03/19(水) 08:39:03ワロタ
0273デフォルトの名無しさん
2008/03/19(水) 08:43:280274デフォルトの名無しさん
2008/03/19(水) 09:18:30どっちも出た瞬間は馬鹿にされまくってたじゃん。そして今回も馬鹿にされている。
噛み付きたかったら、「完全誤読」が充分に流行って、「今さら2ch語にマジ突っ込みかよ!」
って言える空気がこの言葉に関して醸成されてからにしてちょーだい。間抜けなヒステリーは勘弁。
あと、たぶんお前、「仕切る」の意味をどっかで勘違いしてるぞ。
自分の意見をいくら言っても、正しい日本語をいくら紹介しても、それは仕切るとは言わない。
全体の流れ等を統制するために、他人の意見をさえぎったり、無理矢理な話題転換を強制するのが
「仕切り」で、それはお前がいま「消えろ」という言葉でやったことだ。
要するにお前が仕切ってるわけ。間抜けなヒステリーは勘弁。
0275デフォルトの名無しさん
2008/03/19(水) 09:22:50シャボン玉のように壊れて消えると予想。
0276デフォルトの名無しさん
2008/03/19(水) 09:31:360277デフォルトの名無しさん
2008/03/19(水) 22:14:54新しいコンテナを作ったことがあるけど
いちいち数あるコンストラクタを再定義しなければならなかったのが
きつかったな。ここら辺がC#とか新しい言語でも同じなんかな?
0278デフォルトの名無しさん
2008/03/19(水) 22:20:13protected/private 継承ならマシではあるが。
まあそれはおいといて、コンストラクタはどうしようもないと思う。
0279デフォルトの名無しさん
2008/03/19(水) 22:26:53新コンテナの実装にvector使っているだけで大部分の関数が再定義ってことになるから、
単に包含でよくね?
新コンテナとvectorに親子関係もたせる必要性って多分ないでしょ。
0280デフォルトの名無しさん
2008/03/19(水) 22:29:340281デフォルトの名無しさん
2008/03/19(水) 22:32:38もうすこし高レベルのクラスを実装するのに使うのが正しいんじゃないのかと。
部品を作る部品、みたいな。
0282277
2008/03/19(水) 23:11:18単純に、配列の中で、現在選択されている要素を示す機能を追加したものだった。
(ドロップダウンリストで使うようなイメージ)
これを実現する為だけに、vectorの殆どのメソッドを再定義しなければなかった。
継承というアプローチが間違っていたんだろうか。
0283デフォルトの名無しさん
2008/03/19(水) 23:12:58正直すまんこかるかった
0284デフォルトの名無しさん
2008/03/20(木) 08:49:58継承するならリスコフの置換原則を守ってるかチェックした方がよいかと。
0285デフォルトの名無しさん
2008/03/20(木) 09:31:17protected/private 継承でもvectorのデストラクタは呼ばれないから関係ないのでは?
0286デフォルトの名無しさん
2008/03/20(木) 10:44:19暗黙的に継承禁止ってことなんだね・・。早く言ってよ。
class Derived : public Base
{
virtual ~Derived(){ Base::~Base();}
};
でも、継承する場合でも、とりあえずこうしておけばOKなのかなぁ?
0287デフォルトの名無しさん
2008/03/20(木) 10:58:43仮想デストラクタがないことの問題は、アップキャストされた状態でdeleteされたときに、
正しいデストラクタが呼ばれないこと。
逆にデストラクタが呼ばれるときにインスタンスの正しい型が判っていれば、
例え仮想でなくてもきちんとデストラクタは呼ばれる。
これに関するprotected/private継承の利点は、クラスの外で自由にアップキャストできないので、
デストラクタが正しく呼ばれない心配が大きく緩和されるということ。
>>286
だからそれも無意味。
0288デフォルトの名無しさん
2008/03/20(木) 10:58:57色々と全ての点で駄目すぎる。
まず、Derivedのデストラクタが呼ばれるときは、
自動的にBaseのデストラクタも呼び出されるから明示的にベースクラスのデストラクタを呼ぶ必要はない。
また、Baseクラスが仮想デストラクタでないならDerivedクラスで仮想デストラクタを定義しても意味はない。
(Derivedクラスからさらに継承する場合でdelete時にBaseクラスを介さないときを除く)
ちなみに仮想デストラクタがない=継承禁止ではない。
多くの場合、public仮想デストラクタかprotected 非仮想デストラクタが継承を認める場合の書き方。
前者はdelete時にもBaseクラスを使う場合、後者はdelete時にはDerivedクラスを使う場合に使う。
0289デフォルトの名無しさん
2008/03/20(木) 11:23:01コピーコンストラクタとデストラクタで
動作ログ吐き出すようにしてみたら
異常にコピー&破棄繰り返しててワロス
0290デフォルトの名無しさん
2008/03/20(木) 11:50:40前もってreserveすればある程度は抑えられるかもしれない。
0291278
2008/03/20(木) 12:05:50>逆にデストラクタが呼ばれるときにインスタンスの正しい型が判っていれば、
>例え仮想でなくてもきちんとデストラクタは呼ばれる。
ごめん。そのとおりだった。ここを勘違いしていた。それと、呼ばれないのはvectorのデストラクタではなく、
派生クラスのデストラクタの間違いだった。
>>288
なるほど。後者のケースは知らなかったので勉強になった。デストラクタをprotectedにしておけば
Baseをdeleteできないから非仮想デストラクタでいいわけね。でもあえて非仮想にする必要はある?
仮想にしておけばいい気がするんだけど。まさか仮想関数ポインタの4バイト節約じゃないよね?
0292デフォルトの名無しさん
2008/03/20(木) 12:07:160293デフォルトの名無しさん
2008/03/20(木) 12:10:23まあvirtualにする必要がなければしないにこしたことはないね。
0294293
2008/03/20(木) 12:21:51その場合は仮想関数呼び出しになるな。
まあ 仮想デストラクタがない=継承禁止ではない。 という例として勉強になった。
今までは継承元クラスのデストラクタは必ず仮想でなければいけないと思っていたから。
0295デフォルトの名無しさん
2008/03/20(木) 12:46:52protectedな非仮想のデストラクタを持たせるべきだったと取り上げている。
あとはCRTPのように、継承はするけど仮想関数を全く使わない場合にも
protected非仮想デストラクタの出番だと思う。
0296デフォルトの名無しさん
2008/03/20(木) 13:16:410297デフォルトの名無しさん
2008/03/21(金) 20:29:00新たな発見だったのは、非仮想publicデストラクタでdeleteした場合の動作は未定義だそうだ。
0298デフォルトの名無しさん
2008/03/22(土) 02:11:380299デフォルトの名無しさん
2008/03/22(土) 08:45:050300デフォルトの名無しさん
2008/04/04(金) 13:22:26クラス変数にvectorの実態宣言があってinsertやった場合も、
クラスが破棄されたらvectorは自動でメモリ解放してくれますよね?
まさか明示的にresize(0)する必要は無いですよね?
(逆にvectorがポインタ宣言だったら、そのポインタの指す実態をdeleteする必要があるだけですよね?)
0301デフォルトの名無しさん
2008/04/04(金) 14:34:07そのvectorに何を入れてるの?
オブジェクトを入れてるのならいいけど、オブジェクトへのポインタを入れてるのだったら自分で中身を消さないとダメだよ。
0302デフォルトの名無しさん
2008/04/04(金) 19:54:310303デフォルトの名無しさん
2008/04/04(金) 21:48:170304デフォルトの名無しさん
2008/04/05(土) 00:45:030305デフォルトの名無しさん
2008/04/05(土) 00:56:440306デフォルトの名無しさん
2008/04/05(土) 01:03:480307デフォルトの名無しさん
2008/04/05(土) 08:17:140308デフォルトの名無しさん
2008/04/06(日) 23:37:150309デフォルトの名無しさん
2008/04/21(月) 18:24:360310デフォルトの名無しさん
2008/04/21(月) 23:38:440311デフォルトの名無しさん
2008/04/22(火) 00:15:330312デフォルトの名無しさん
2008/04/22(火) 00:54:480313デフォルトの名無しさん
2008/04/22(火) 02:23:330314304
2008/04/22(火) 22:05:21忘れてくrail nut
0315デフォルトの名無しさん
2008/04/22(火) 22:11:300316デフォルトの名無しさん
2008/04/22(火) 22:14:070317デフォルトの名無しさん
2008/04/28(月) 17:32:540318デフォルトの名無しさん
2008/04/28(月) 20:17:030319デフォルトの名無しさん
2008/05/16(金) 15:56:34193>>
struct Test
{
vector<int> aaa;
vector<string> bbb;
int ccc;
};
Test test;
memset(&test,0,sizeof(Test));
ってSTLつきの構造体をmemsetやったら危険ですか?
0320デフォルトの名無しさん
2008/05/16(金) 19:16:03ったり前。
Test test; // メンバ aaa と bbb のコンストラクタが呼び出される
memset(&test,0,sizeof(Test)); // ぶっ壊される
0321デフォルトの名無しさん
2008/05/16(金) 21:35:42PODはただの区画で、C++クラスは家付き不動産て感じか。
0322デフォルトの名無しさん
2008/05/16(金) 23:57:330323デフォルトの名無しさん
2008/05/17(土) 09:37:130324319
2008/05/19(月) 12:19:47vtblつきのクラスはともかく、
C言語な構造体のvectorは問題ないと思ってmemsetしてた。
一見問題なく動くから困る。今から直します。
0325デフォルトの名無しさん
2008/05/19(月) 14:55:240326デフォルトの名無しさん
2008/05/19(月) 14:58:010327デフォルトの名無しさん
2008/05/19(月) 18:24:49そもそもstringはあんたの言う「C言語な構造体」には該当しないと思うのだが。
0328319
2008/05/19(月) 19:05:30あいまいな表現で申し訳ない。
aaaのmemsetはセーフだけど
bbbは不味いだろという指摘を期待して質問してしまいました。
「C言語な構造体」というのはPOD型構造体のつもり。
専門用語の厳密な知識が足りないので、あいまいな表現を選択しました。
(aaaをPOD型構造体にしておけばより良かったか)
0329デフォルトの名無しさん
2008/05/19(月) 20:41:32vector<int>もvector<string>もPODではない。
ゆえにTestもPODにならない。
0330319
2008/05/21(水) 12:11:22了解。
C++の仕様をまともに読んだことがなかったから、読んでみるよ。
図書館で『C++ランゲージ クイックリファレンス』借りてきた。
0331デフォルトの名無しさん
2008/05/21(水) 12:46:250332デフォルトの名無しさん
2008/05/21(水) 13:18:060333デフォルトの名無しさん
2008/05/21(水) 23:47:180334デフォルトの名無しさん
2008/05/22(木) 20:49:38あれはいい参考になるからいつも手元においてる。
ただ、リファレンスのはずなのに、たまにコーディングスタイルに属する問題がさらっと並んで書かれてたりするから注意が必要だけどな。
0335デフォルトの名無しさん
2008/05/23(金) 00:14:11なんで>>319が、vector<int>をPODだと思ってたのかを知りたいな。
0336319
2008/05/23(金) 15:53:40おお。しっかり参考にしようと思います。
>>335
一言で言えば無知。
便利そうなものはろくに勉強せずすぐ使ってしまうのがあるかな。
(最初にvector使ったときは便利さに衝撃を受けた)
PODの概念は319の書き込む前後にネットで調べるまで知らなかったです。
vector<int> aaa;
aaa.clear();
size_t size=sizeof(aaa);//20
size=aaa.size();//0(ちなみに)
今思えば、
一度でもこういうコードを試して見れば
memsetが危険かどうか判断できたな。
VC++2005で上記のaaaをウォッチすると
aaa [0]()
このように出るから、int以外でメモリ取ってるイメージが湧かなかった。
よってmemsetもOKかなという判断をしたのだろう。
0337319
2008/05/23(金) 15:56:24ついでに、フローだとこんな感じかな。
こういう後輩がいたらしっかり指導してやってください。
動くプログラムを書けるようになる
↓
変数は必ず初期化するようにしなさいと言われる
↓
memsetの存在を知る(まとめて初期化できるからこれは便利)
↓
STLを使ってみる(これは便利!)
↓
STLとmemsetの併用が何か怪しい気がした
↓
質問して悲鳴をあげられた←いまここ
0338デフォルトの名無しさん
2008/05/23(金) 16:12:37>STLとmemsetの併用が何か怪しい気がした
いいセンスしてるじゃん!がんがれ〜
0339デフォルトの名無しさん
2008/05/23(金) 22:12:15それで大体困らないし。
0340デフォルトの名無しさん
2008/05/23(金) 22:18:52コンパイラにエラーを吐かせるようにするわけか
0341デフォルトの名無しさん
2008/05/24(土) 06:30:430342デフォルトの名無しさん
2008/05/24(土) 07:45:290343デフォルトの名無しさん
2008/05/24(土) 09:55:31POD にポインタや不動小数点数が入ってると意味を成さない。 vector 関係ないな。
0344デフォルトの名無しさん
2008/05/24(土) 12:01:08memset多用のおかげで見逃されてるよね、std::fill
0345デフォルトの名無しさん
2008/05/26(月) 19:17:380346デフォルトの名無しさん
2008/05/26(月) 20:14:10ユーザ定義の POD に対してそれができる実装は見たことない
0347デフォルトの名無しさん
2008/05/26(月) 21:55:280348デフォルトの名無しさん
2008/05/26(月) 21:58:510349デフォルトの名無しさん
2008/05/26(月) 23:26:51ただ、2005も2008もstd::fillでは使われていない。
ただの特殊化で(signed/unsigned) charだけmemsetを呼ぶ実装になっている。
0350デフォルトの名無しさん
2008/05/26(月) 23:31:38kwsk
0351デフォルトの名無しさん
2008/05/30(金) 22:56:22それは勿体無いね
0352デフォルトの名無しさん
2008/08/31(日) 03:17:11素人質問でもうしわけないんだけどさ
中でnewやってるクラス(MyClass)を
vector <MyClass> mMy;
ってやってpush_backとかresizeすると
newしたものってバグる?
つまり、何を気にしているかというと
push_backやresizeをしたときにクラス1回破棄して作り直してね?
ってことナンすけど・・・
0353デフォルトの名無しさん
2008/08/31(日) 04:36:08当然、コンパイラが自動的に作るコピーコンストラクタがどんな動作をするかには言及しませんね。
0354デフォルトの名無しさん
2008/08/31(日) 05:31:49>STLのコンテナに載せる要件に、コピーコンストラクタが必要、というのがありますが
マジですか?
んじゃ基本的には
vector <MyClass*> mMy;
みたいにしないといけないの?
コピーコンストラクタがない場合
0355デフォルトの名無しさん
2008/08/31(日) 08:06:22そんなクラスを収容できるようにはコンテナはできてないということ。
0356デフォルトの名無しさん
2008/08/31(日) 11:45:43え?コピーコンストラクタを実装するのって暗に当たり前だって言ってる?
悪いけど俺にそんな認識はないなぁ・・・つか無かったなぁ
エラーもでないし
はぁ・・・わかりにく・・・これだからテンプレートって使わない人多いんだろうなぁ・・・
ってちょっと思った
0357デフォルトの名無しさん
2008/08/31(日) 11:57:54「中でnewやってるクラス」という言葉の意味が、常識的に解釈できる通りの意味だとすると、
これはテンプレートとは全然関係の無い話だよ。
むしろC++の基礎知識に属するというか、マジな話、君は致命的な欠陥のあるクラスを
作りまくってることになるよ・・・。
0358デフォルトの名無しさん
2008/08/31(日) 12:02:34マジで?
中でnewってのは
MyClassのメンバ変数にこんなのがあったとして
int *mUnko;
MyClassクラスのどっかで
mUnko = new int[256];
とかやってるってことだよ
これをやってるクラス(MyClass)をvectorでpush_backとかresizeをやると
newで確保した内容が吹き飛んでしまう
って現象
俺はこれ知らんかったなぁ・・・
コピーコンストラクタが定義されてないクラス全部欠陥品ってこと?
0359デフォルトの名無しさん
2008/08/31(日) 12:03:53自前の代入演算子とコピーコンストラクタは必須だろう
それ以外の場合はケースバイケースかな
メンバの全てについて、コピーコンストラクタ・代入演算子の呼び出しを考慮してあるなら
デフォルトのでいい
面倒ならとりあえずprivateにしてみるのがよい
class Hoge
{
private:
Hoge(const Hoge&);
Hoge& operator=(const Hoge&);
//・・・
};
コンパイルしてエラーが出たら実装。
g++を使っているなら -Weffc++ というマゾっぽいオプションもある。素人にはお勧めできない。
0360デフォルトの名無しさん
2008/08/31(日) 12:09:19面倒臭すぎる
つか、絶対に知らない奴多いと思うんだよね
この現象
vector <MyClass*> mMy;
もうクラスをvectorするときはポインタだけに絞ろう
0361デフォルトの名無しさん
2008/08/31(日) 12:10:480362デフォルトの名無しさん
2008/08/31(日) 12:16:50中に入っているMyClass*をdeleteし忘れるんですね、わかります
0363デフォルトの名無しさん
2008/08/31(日) 12:17:50まぁテンプレートやSTL以前にC++そのものがわかりにくいってことだ。
とりあえずEffective C++ / Effective STL読んどけ。
>>352みたいなことに自分で気づけたのなら筋はいいと思うな。
0364デフォルトの名無しさん
2008/08/31(日) 12:18:55これなら安全ちゃう?
0365デフォルトの名無しさん
2008/08/31(日) 12:56:51すごく遠目からみるんですね
「中でnewするクラス」の人は
さすがです
0366デフォルトの名無しさん
2008/08/31(日) 13:06:230367デフォルトの名無しさん
2008/08/31(日) 13:15:03MyClass hoge, fuga;
hoge = fuga;
だけでも、なんか素敵なことが起きかねないよな、現状のスキルだと。
0368デフォルトの名無しさん
2008/08/31(日) 13:24:44fugafuga()
{
MyClass a = hoeghoge();
}
最適化によって落ちたり落ちなかったりするんですね
0369デフォルトの名無しさん
2008/08/31(日) 13:32:47理由を理解してなさそう
0370デフォルトの名無しさん
2008/08/31(日) 13:39:260371デフォルトの名無しさん
2008/08/31(日) 13:50:55今の現場のコーディング規約と同じだー。
> コピーを考慮しないクラスでは、
> コピーコンストラクタと代入演算子をprivateにすること
ってのがあるよ。
0372デフォルトの名無しさん
2008/08/31(日) 13:54:570373デフォルトの名無しさん
2008/08/31(日) 13:56:44代入演算子は必須だろうが
0374デフォルトの名無しさん
2008/08/31(日) 14:02:20> え?コピーコンストラクタを実装するのって暗に当たり前だって言ってる?
常識というか、普通に気づくんじゃないかね。自前でコピーコンストラクタ書く時に
「あれ?こんなこと自動ではやってくれないよな?」ってのに気づけば。だから
>>359
> 面倒ならとりあえずprivateにしてみるのがよい
とか
>>371
> コピーを考慮しないクラスでは、
> コピーコンストラクタと代入演算子をprivateにすること
とかだし、google のコーディング規約でも↓みたいなマクロが用意されてるわけだ。
// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class Foo {
public:
Foo(int f);
~Foo();
private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
0375デフォルトの名無しさん
2008/08/31(日) 14:04:37> vector < shared_ptr<MyClass> > mMy;
> これなら安全ちゃう?
shared_ptr<> はオーバヘッドが馬鹿にならないからなぁ。
0376デフォルトの名無しさん
2008/08/31(日) 14:05:430377デフォルトの名無しさん
2008/08/31(日) 14:16:01自分でコピーコンストラクタと代入演算子を定義して
ptr_vector当たりを使うのが正道だ。
0378デフォルトの名無しさん
2008/08/31(日) 14:49:47ptr_vector使うならコピーコンストラクタいらないんじゃ…
0379デフォルトの名無しさん
2008/08/31(日) 15:45:05現状そうなってるから仕方ないってのは受け入れた上での評価だけど
だってこんな仕様にしたらMyClassを変更するたびに
MyClassの仕様として正しい正しくないの他に
MyClassを使用している箇所を片っ端から探して
newを使用していいかどうか確かめなきゃいけないってことだろ?
最悪じゃね?
カプセル化が完全に死んでるじゃん
0380デフォルトの名無しさん
2008/08/31(日) 15:47:18何度も言われているが、これは vector じゃなくて C++ 一般の話。
0381デフォルトの名無しさん
2008/08/31(日) 15:50:29どうして?
0382デフォルトの名無しさん
2008/08/31(日) 15:51:450383デフォルトの名無しさん
2008/08/31(日) 15:52:49俺はそうは思わないな
vectorの仕様によっては助かるように細工することもできるわけだし
使用者がvectorの内部まで知らないと使えないってのはやっぱりわかりにくいと思うよ
っていうかコピーコンストラクタの用意されて無いクラスを
vectorにぶち込んだ時点でエラーでもいいと思うけどね
0384デフォルトの名無しさん
2008/08/31(日) 15:56:40実装してあることをチェックしてからしかvectorには突っ込めないとか使い難いな
0385デフォルトの名無しさん
2008/08/31(日) 15:56:47> vectorの仕様によっては助かるように細工することもできるわけだし
どうやって?
コピーコンストラクタの用意されてないクラスをエラーにすると、 C の構造体が
vector に入れられない。それは面倒だ。
0386デフォルトの名無しさん
2008/08/31(日) 15:59:35アドレスだけコピーしてくれてセーフ?
なんてことはないか
0387デフォルトの名無しさん
2008/08/31(日) 16:00:17クラスがきたときだけptr_vector仕様にする
0388デフォルトの名無しさん
2008/08/31(日) 16:03:15クラスはクラス用のvectorを作って
vectorにクラスを入れるとエラーでもよかったけどね
なにも全部ひっくるめてvectorとかする意味わからないな
そのせいでわかりにくくなるならクラスはクラス用のvectorみたいなのを使う
って決めてあったほうがよかった
と俺は思う
(今のvectorを変えろとかそういう意見じゃなくて今後そういうテンプレート的なものがあったときに
そういうふうに作るようにしたほうがいいんじゃねぇの?ってことな)
0389デフォルトの名無しさん
2008/08/31(日) 16:04:00生半可な知識でくだらないこと書きなさんな。C++のclassはstructとはprivateかpublicかの違いしかない。
0390デフォルトの名無しさん
2008/08/31(日) 16:04:49あんたが一人でその、「クラス専用ベクタ」とやらを作って使えばいいだろ。
0391デフォルトの名無しさん
2008/08/31(日) 16:10:15現状、明らかに使いにくいしわかりにくいのに
そこの改善より
俺が馬鹿で終了?
意味不明
じゃ、仮に中でnewしてても死なないvectorがあったら
現状のvectorとどっち使うの?お前
0392デフォルトの名無しさん
2008/08/31(日) 16:11:15vector に入れたときだけ大丈夫で >367-368 はやっぱりダメとか、ありえんだろ。
0393デフォルトの名無しさん
2008/08/31(日) 16:15:54それはやってみるか中みないとわからんと思うな
ちなみに>>367ってエラーでなかったっけ?
0394デフォルトの名無しさん
2008/08/31(日) 16:17:14代入とは別に移動(move)という処理を標準化しようという動きはあったろ。
いつになるか分からんけど
0395デフォルトの名無しさん
2008/08/31(日) 16:21:03> 仮に中でnewしてても死なないvectorがあったら
listでよくね?
listって確か要素を追加・削除しても、関係ない要素のコピーは起きないよな?
あとC++0xにemplaceが入れば満足か?
0396デフォルトの名無しさん
2008/08/31(日) 16:21:50C++0x の move な。一応次の標準に入る予定。
ただ、その場合もコピーと同様に、クラス側で「移動」用の定義を与えないと働かない。
標準ライブラリ内のクラスが move に対応するんで、自動的に大丈夫になる
ケースもあるだろうけど。
0397デフォルトの名無しさん
2008/08/31(日) 16:22:580398デフォルトの名無しさん
2008/08/31(日) 16:34:220399デフォルトの名無しさん
2008/08/31(日) 16:35:03何でそんな簡単なことも判らないでこのスレにいるんだ?
0400デフォルトの名無しさん
2008/08/31(日) 16:37:12えー意味わからん
危険なクラスってコピーコンストラクタがないクラスを言ってるの?
0401デフォルトの名無しさん
2008/08/31(日) 16:38:29面倒臭すぎる
職場の超百得ナイフクラスをサポートできへん
0402デフォルトの名無しさん
2008/08/31(日) 16:49:58必要なコピーコンストラクタを欠いているクラスが危険だと言っている。
0403デフォルトの名無しさん
2008/08/31(日) 16:51:350404デフォルトの名無しさん
2008/08/31(日) 16:56:56?
意味分からん
>要は、危険なクラスをコンテナだけが安全に使えても意味がないということなんだが。
この発言だと
vectorにつっこんだときのことを言ってるんじゃなくて
MyClassが危険なクラスって言いたいんだよね?
でも
>必要なコピーコンストラクタを欠いているクラスが危険だと言っている。
こんなこというからさっぱりわからないよ
何が言いたいの?
>>403
俺もそう思うな
望ましい状態は2つあって使えないような作りか、使えるような作りかだと思うんだよね
0405402
2008/08/31(日) 17:01:04vector につっこめないクラスは単体の代入やコピーでも同様の問題を起こすということ。
このようなクラスを安全に代入やコピーをするには、コピーコンストラクタや代入演算子の
定義が必要。そして、それらを定義すれば vector に入れても問題なくなる。
0406デフォルトの名無しさん
2008/08/31(日) 17:01:180407デフォルトの名無しさん
2008/08/31(日) 17:10:11安全側に倒したいんなら new するポインタの保持に生ポインタを使わないことだ。
int の配列を持つなら vector<int> を使えばいい。
0408デフォルトの名無しさん
2008/08/31(日) 17:14:240409デフォルトの名無しさん
2008/08/31(日) 17:28:110410デフォルトの名無しさん
2008/08/31(日) 17:43:566倍はないだろ。どんなコンパイラでどうやって測った?
0411デフォルトの名無しさん
2008/08/31(日) 17:51:34VC9でsizeof(std::vector<int>)で30が返ったんだが。
(20だったかも)
0412デフォルトの名無しさん
2008/08/31(日) 17:57:0210個突っ込んでも、300とか200にはならんと思うけど。
size() * sizeof(int) + Nbyteがせいぜいでない?
0413デフォルトの名無しさん
2008/08/31(日) 18:02:044バイトアラインのはずだから、20だろうな。それにしても >412 の言うとおり、
int を256個も入れりゃ気にならんだろ。
0414デフォルトの名無しさん
2008/08/31(日) 19:59:18きっと0xならMyClassはCopyConstractableでないしAssignableでもないから
std::vectorに入れられないってエラーになる。
0415デフォルトの名無しさん
2008/08/31(日) 20:01:220416デフォルトの名無しさん
2008/08/31(日) 20:03:39デフォルトの定義で動いちゃうから、無理でしょ。
0417デフォルトの名無しさん
2008/09/01(月) 00:21:30もちろんvector1つくらいの管理変数サイズを気にしたりはしない。
vector<vector>みたいな状況が怖いわけで。
大量に使うクラスで、生ポで済むのにvector組み込む場合ね。
vectorよりはshared_ptr使った方がいくらかマシか?
0418デフォルトの名無しさん
2008/09/01(月) 00:45:14そんなにリソースをキツキツで使いたいならコピーコンストラクタと代入演算子ぐらい
さくっと定義して使えよ。
安全性と効率のトレードオフだ。 C++ ではデフォルトで効率を取るのが言語の方針ってこと。
0419デフォルトの名無しさん
2008/09/01(月) 00:47:01コピーコンストラクタとか定義しないいけないのが嫌だから生ポインタじゃ済まないんだろ。
おとなしく vector 使っとけ。
0420デフォルトの名無しさん
2008/09/01(月) 01:37:06あるいはもっと向いてるポインタ格納クラスがあればな
0421デフォルトの名無しさん
2008/09/01(月) 02:03:32> vector<vector>みたいな状況
おれなら、その状況では管理サイズよりpush_back時の時間の方が気になるけど。
管理サイズが気にならないわけではないよ?
たとえかも知れんけど、listにしとかね?
0422デフォルトの名無しさん
2008/09/01(月) 02:22:010423デフォルトの名無しさん
2008/09/01(月) 03:11:540424デフォルトの名無しさん
2008/09/01(月) 03:56:52STLコンテナがmoveするべきところをcopyで済ましてるのは、確かに
今となってはまずい設計だったよな。
移動用のファンクタを渡せるようにするなどの対応をするべきだった。
0425デフォルトの名無しさん
2008/09/01(月) 04:08:41そういう問題ではない。普通に代入とか、関数に渡すために仮引数に
書いてコピーコンストラクタが呼び出される事実はSTLとは全く関係が
ないにも関わらず同じ問題を引き起こす。
0426デフォルトの名無しさん
2008/09/01(月) 06:30:12いや、コピーコンストラクタが不備だったりコピー禁止にし忘れてるクラスの問題の
話ではなく、vectorが再配置にコピー動作を行ってることによって発生する
オーバーヘッドを指摘してるんだよ。
ポインタで配列を保持するようなクラスだと、再配置のときまでコピー動作じゃまずいだろと。
0427デフォルトの名無しさん
2008/09/01(月) 06:46:41歴史的経緯があるんじゃないだろうか?
0428デフォルトの名無しさん
2008/09/01(月) 15:54:43>ポインタで配列を保持するようなクラスだと
ポインタで配列を保持してるのを、vectorに入れ替えたクラスだと、
再配置のたびvectorの中身までコピーされてオーバーヘッドが大きい。
0429デフォルトの名無しさん
2008/09/01(月) 17:49:43再配置による中身のコピーのオーバヘッドが気になるくらいなら、真面目にデータ構造見直すし。
0430デフォルトの名無しさん
2008/09/01(月) 18:05:41ファンクタなりなんなり設定できると便利だよね。
可変長なデータ読み込む場合とか、最後まで読んで
みないと要素数が分からない場合もあるんだし。
0431デフォルトの名無しさん
2008/09/01(月) 22:16:24しつこいな。
自分で作れやカス
0432デフォルトの名無しさん
2008/09/01(月) 22:50:530433デフォルトの名無しさん
2008/09/01(月) 22:58:020434デフォルトの名無しさん
2008/09/01(月) 23:06:29するわけない。
0435デフォルトの名無しさん
2008/09/01(月) 23:19:320436デフォルトの名無しさん
2008/09/01(月) 23:32:180437デフォルトの名無しさん
2008/09/01(月) 23:45:34現行範囲内で考えるなら swap をできる限り利用する、みたいな
感じになるのかね。
ってことからちょっと考えてみた。
いくつかのアルゴリズムについては swap あるいは iter_swap で
挙動が定義されている。
が、g++ 3.4.4 の libstdc++ の実装では iter_swap は swap を
呼び出さず、また、アルゴリズムで swap と iter_swap を意識して
使い分けているようには見えない。
もちろん swap と(iterator 経由の)iter_swap で結果が異なる
なんてのは論外だけど、swap については独自の型についても
特殊化を提供しよう、みたいな事が言われるが、iter_swap まで
特殊化を提供はしないわけで(っていうか事実上無理)。
結果として、CopyConstructible と Assignable から想定される
swap の一般的な実装 T t(a); a = b; b = t; よりも効率的な swap
を持つ型に対する場合で、かつ、アルゴリズムの実装が iter_swap を
用いる場合には効率が落ちるケースがある、ということになりそう?
って、長々書いてきたけど、
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#187
に既にあったわ。
ということで、0x になると iter_swap が swap で定義されるので上記
問題はなし、ってことのよう。
0438デフォルトの名無しさん
2008/09/01(月) 23:52:22"move" とか "move semantics" とか 「右辺値参照」 ("rvalue reference") あたりの
単語で検索していろいろあさってもらえれば恐らく期待しているものが引っかかるかと.
ちなみに swap を使う場合, swap 先 (移動する先) のオブジェクトを
あらかじめ構築していないといけないので,そういうオブジェクトを構築する
汎用の構文 (とその挙動) も規定しないといけないです.
0439デフォルトの名無しさん
2008/09/02(火) 00:05:11うん。だからあえて「現行範囲内で」。
で、n2738 見ると、vector の insert が軒並み requires MoveAssignable<T> になってるんで
(resize は insert と erase で定義されるから resize とかも) 424 辺りが望む挙動を期待していいってことでOK?
0440デフォルトの名無しさん
2008/09/02(火) 00:13:24vector 全体が requires MoveConstructible<T> になってる。
0441デフォルトの名無しさん
2008/09/02(火) 00:31:56どうするのかの問題についての立ち位置が分からないですね,これ.
move は現行の範囲内でやるならおっしゃるとおり
swap でやるのが良いとは思いますけれど
(Boost の sand-box にあるエミュレーションもそういう形態を取ってましたし)
ただ,現行でやるのは本当に面倒だと思いますよ.
N2738 というか, move の proposal の動機付けの1つに,
当然コンテナ内のバッファ再配置があったわけで,
424さんとかの望むことそのものはできないとさすがにまずいかと.
後,あまり関係ないですけれど, N2738 を読む限り,要素型に対する
CopyAssignable の要求は必要な箇所のみに完全に絞られるようになりますね.
0442デフォルトの名無しさん
2008/09/02(火) 00:59:05>当然コンテナ内のバッファ再配置があったわけで,
これっすね。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#vector%20Example
# 適当に拾い読みしてて薄っぺらいのがばればれ。
proxy については良く分からないですが、LWG742 辺りが関係してますか?
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#742
0443デフォルトの名無しさん
2008/09/02(火) 09:59:170444デフォルトの名無しさん
2008/09/02(火) 12:15:11proxy を用いる iterator (iter_swap が本来問題にしていた状況) に関しては,
その LWG742 がそのまま該当すると思います.仮に LWG742 の proposal が通るならば,
iter_swap に関しては swap への単純な委譲 (LWG187 の proposal の通り) で良いかと.
ただ,そこでも指摘されていますけれど, LWG742 のやり方は swap が
template 定義内で unqualified call されることを前提としているわけで,
そうすると異なる2つの型に対する swap の呼び出しによって,
異なる2つの associated namespace の swap の定義が ADL によって
visible になるような状況があるのがまずいだろうな,とは思いますけれど.
0445デフォルトの名無しさん
2008/09/02(火) 19:29:570446デフォルトの名無しさん
2008/09/02(火) 19:34:040447デフォルトの名無しさん
2008/09/02(火) 19:45:07性能がいいのか悪いのか判断しかねるな
0448デフォルトの名無しさん
2008/09/02(火) 19:46:16このテンプレート
0449デフォルトの名無しさん
2008/09/02(火) 20:41:34「444は僕です」
と書かれる頃かな
0450デフォルトの名無しさん
2008/09/02(火) 21:28:41解読不能なほど長いunko.unko.unko.unko.・・・住所はなんとかならんのか
日本の埼玉県鴻巣市吹上3丁目1の4の3の○○マンション306号・・・みたいなw
もうわかったよw長いよw
絶望的にセンスねぇよw
いくら時代が進んだからってエディタの横幅一杯まで攻めてる理由ないってw
0451デフォルトの名無しさん
2008/09/02(火) 21:36:450452デフォルトの名無しさん
2008/09/02(火) 22:44:160453デフォルトの名無しさん
2008/09/02(火) 22:53:28んで、問題を解決しようとすると
そういう新ワードが出てきてますますわからなくなるんだよなw
そのクラス(テンプレート?)わかる奴一体世のプログラマに何人いんだよって話ですよ
0454デフォルトの名無しさん
2008/09/02(火) 22:57:30マジ感激すっから
Perlをインストールする必要があるけど
0455デフォルトの名無しさん
2008/09/02(火) 23:00:50デフォルトテンプレート引数を使用している部分は(スイッチで)省略できるとかなら
もうすこし読みやすくなるんだろうけどね。
あと、typedefしてる部分とかも。
ただの引数の型の部分でstd::basic_string<char, std::char_traits<char>, std::allocator<char> > とか。
まあ書く側としてhoge<hage,hige>::iteratorとかになっちゃうのは
typedefくらいしかどうしようもないけど。
0456デフォルトの名無しさん
2008/09/02(火) 23:07:36日本語でおk
0457デフォルトの名無しさん
2008/09/03(水) 10:48:39ついていけないなら、むりせずやめてもいいんだよ?
0458デフォルトの名無しさん
2008/09/03(水) 19:06:00もうわかりやすさとか除外して
ひたすら言語の「できること」探しがはじまったら
言語の存在意義が不明になってしまうで
言語ってのは昔から制限をかけることで進化してきたもんなんだぜ
アセンブラのが色んなことできるぜ型縛りもなんにもないしね
人にわかりやすく、誰でも読めるように、
たくさんの人が簡単に理解できるように
これを忘れた時点でもう何をやっても自己満足でしかない
0459デフォルトの名無しさん
2008/09/03(水) 19:21:520460デフォルトの名無しさん
2008/09/03(水) 19:33:03言語に機能を求めるならアセンブラのがいいよってことだよ
馬鹿だからわかんないかw
0461デフォルトの名無しさん
2008/09/03(水) 20:03:190462デフォルトの名無しさん
2008/09/03(水) 20:39:140463デフォルトの名無しさん
2008/09/03(水) 20:47:550464デフォルトの名無しさん
2008/09/21(日) 08:28:09継承するなってこと?
0465464
2008/09/21(日) 08:29:200466デフォルトの名無しさん
2008/09/21(日) 14:27:30基本的に標準ライブラリのクラスはどれも継承するな。
していいのはstreambufくらい。
0467デフォルトの名無しさん
2008/09/21(日) 21:27:080468464
2008/09/21(日) 23:48:310469デフォルトの名無しさん
2008/09/22(月) 01:38:420470デフォルトの名無しさん
2008/09/22(月) 01:41:350471デフォルトの名無しさん
2008/09/22(月) 21:23:400472デフォルトの名無しさん
2008/10/04(土) 01:41:32lengthチェックしてるからデータがヌル終端でないと死ぬんだな…
デバッグ版のみだけど。
0473デフォルトの名無しさん
2008/10/15(水) 21:25:20どういう落とし穴にはまるんですか?
0474デフォルトの名無しさん
2008/10/16(木) 00:32:34アフォですか?
デストrラクターが呼ばれないと
メモリの開放がされないのでリークして
オーvバーフローするくらい気付け
0475デフォルトの名無しさん
2008/10/16(木) 00:37:30class Base {
public:
~Base() { std::cout << "~Base" << std::endl; }
};
class Derived: public Base {
public:
~Derived() { std::cout << "~Derived" << std::endl; }
};
int main() {
Base * p = new Derived;
delete p;
return EXIT_SUCCESS;
}
0476デフォルトの名無しさん
2008/10/16(木) 00:59:14じゃあさ、こうは?
#include <iostream>
class Base {
public:
~Base() { std::cout << "~Base" << std::endl; }
};
class A {
public:
virtual ~A() { std::cout << "~A" << std::endl; }
};
class Derived: public Base, public A {
public:
virtual ~Derived() { std::cout << "~Derived" << std::endl; }
};
int main() {
A* p = new Derived;
delete p;
return EXIT_SUCCESS;
}
0477デフォルトの名無しさん
2008/10/16(木) 03:33:26未定義動作。結果がどうなるか知りたければ試してみるしかないし、
やってみても何も起こらないかもしれないし、いつも同じ結果になるとも限らない。
0478デフォルトの名無しさん
2008/10/16(木) 06:42:230479デフォルトの名無しさん
2008/10/16(木) 15:31:09別に vector に限った事じゃねぇだろに。
Effective C++ 読むなり
「デストラクタ virtual」でググるなりしろ。
>>474
もちつけ。つか、ちゃんと理解してる?
0480デフォルトの名無しさん
2008/10/16(木) 16:19:190481デフォルトの名無しさん
2008/10/16(木) 16:27:200482デフォルトの名無しさん
2008/10/16(木) 16:32:22C++ Coding Standards 第35項「基本クラスとして設計されていないクラスからは継承しない」
派生クラスのオブジェクトに対して基本クラスの非virtualなデストラクターを呼ぶと未定義動作。
0483デフォルトの名無しさん
2008/10/16(木) 20:02:34いやいや476の例は問題ないだろ。
もちろん、それで問題を防げるわけではないから
やっちゃ駄目という結論に変わりはないが。
0484デフォルトの名無しさん
2008/10/16(木) 20:20:480485デフォルトの名無しさん
2008/10/16(木) 20:48:05ほほう、貴方が面白い話題を提供してくれるわけか
0486473=474=476
2008/10/16(木) 21:28:400488デフォルトの名無しさん
2008/11/05(水) 03:14:03rbegin()は末尾を返すって書いてあった。
嘘だった。
すごい落とし穴にはまった。
0489デフォルトの名無しさん
2008/11/05(水) 09:05:49末尾だと思うけどねぇ。end()と同じじゃないけど。
0490デフォルトの名無しさん
2008/11/05(水) 10:55:23嘘だった
size()取ったらremove()前と後で変わってないよ
0491デフォルトの名無しさん
2008/11/05(水) 11:00:21もっとよく調べないからだ
0492デフォルトの名無しさん
2008/11/05(水) 11:18:46remove:
ttp://www.sgi.com/tech/stl/remove.html
0493デフォルトの名無しさん
2008/11/05(水) 11:28:06ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/container.html
0494デフォルトの名無しさん
2008/11/05(水) 12:20:41Exceptional C++ にもそう書いてある。
一方、rbegin()は最後の要素、だから、*rbegin()は最後の要素を返す。
STL標準講座はその辺ごっちゃだよね。
範囲をあらわす言葉が統一されないだけ。
初心者向けの本だから、最後の要素がひとつくらいcopyされなかったりしても
気にするなよ
0495デフォルトの名無しさん
2008/11/05(水) 12:40:57エピス!てめぇw
なんちって
0496デフォルトの名無しさん
2008/11/05(水) 12:41:39人間だもの
みつを
0497デフォルトの名無しさん
2008/11/05(水) 14:12:22これ常識
0498デフォルトの名無しさん
2008/11/07(金) 02:09:16先頭の直前を指すイテレータ?
0499デフォルトの名無しさん
2008/11/07(金) 03:01:300500デフォルトの名無しさん
2008/11/08(土) 15:33:410501デフォルトの名無しさん
2008/11/08(土) 15:51:180502デフォルトの名無しさん
2008/11/08(土) 16:21:320503デフォルトの名無しさん
2008/11/08(土) 18:11:330504デフォルトの名無しさん
2008/11/08(土) 22:30:360505デフォルトの名無しさん
2008/11/09(日) 00:32:410506デフォルトの名無しさん
2008/11/14(金) 04:15:29[ rbegin, rend )
なわけだけど、
そもそもこの半分開いた範囲の話すら出てこないのがSTL標準講座。
begin から end に向かって到達可能であることが推定されることも説明されてない。
何より、Visual C++ ver.6 で動作確認という
まったく標準 C++ に準拠していない実装依存なコードが満載。
0507デフォルトの名無しさん
2008/12/15(月) 19:50:57今は一応クリティカルセクション作って保護してあるが、イラナイなら面倒だからはずしたい・・・
0508デフォルトの名無しさん
2008/12/15(月) 19:53:53自分の使っている奴の説明書読め。
0510デフォルトの名無しさん
2008/12/29(月) 14:12:02辛いねー
0511デフォルトの名無しさん
2008/12/29(月) 14:16:29コード貼ってもらえるといいんだが。
0512デフォルトの名無しさん
2008/12/29(月) 15:24:530513デフォルトの名無しさん
2008/12/29(月) 15:29:100514デフォルトの名無しさん
2008/12/29(月) 20:39:57不必要にコピーを連発しているとか、インライン化が阻害される書き方をしているとか。
0515デフォルトの名無しさん
2008/12/29(月) 21:04:23コピーコンストラクタが走り回ってると見るけど、
>>514以外に考えられる原因ってある?
0516デフォルトの名無しさん
2008/12/29(月) 21:25:310517デフォルトの名無しさん
2008/12/30(火) 11:22:25C#の方が大抵はやいんだよ。
俺は気がついた時、正直死ぬほど驚いた。
0518デフォルトの名無しさん
2008/12/30(火) 11:25:29「簡単なソース」をさ晒してみてくれよ。
0519デフォルトの名無しさん
2008/12/30(火) 13:55:26バイナリリードでフロートを三時限配列に代入。
アレイつかったプラプラはシャープの倍以上かかる。
試してミソ。
0520デフォルトの名無しさん
2008/12/30(火) 14:05:510521デフォルトの名無しさん
2008/12/30(火) 14:31:26fread()使ってみろよ絶対にC++の方が早いから
それからC#にはシリアライズ機能が標準装備されているから
比較するならC++もboost使って比較しろ
0522デフォルトの名無しさん
2008/12/30(火) 15:08:32fread?それCじゃん。C++と比較するならstreamじゃないと。
0523デフォルトの名無しさん
2008/12/30(火) 15:17:330524デフォルトの名無しさん
2008/12/30(火) 15:50:35このままだと >>519 がアホチンなことをしてる可能性が否定できない
(というか、そうとしか思えない)
0525デフォルトの名無しさん
2008/12/30(火) 16:00:41その認識でいいと思う
しかし、必要とあらばそこだけCやアセンブリで書いて
手軽に最適化ができるというのもC++の強みかと
0526デフォルトの名無しさん
2008/12/30(火) 16:40:580527デフォルトの名無しさん
2008/12/30(火) 18:18:130528デフォルトの名無しさん
2008/12/30(火) 18:36:130529デフォルトの名無しさん
2008/12/30(火) 18:47:270530デフォルトの名無しさん
2008/12/30(火) 18:52:02それと、write()やReadFileのようなシステムコールを直接呼び出す方が速くなると
勘違いしている初心者のスレでもあります。
「とにかくアセンブラにすれば速い」と思ってそうな気配のある人もいるかもしれません。
0531デフォルトの名無しさん
2008/12/30(火) 19:25:05C#もLINQ登場で一気に魅力的になった。ラムダ式もC++0xより先行しているし。
0532デフォルトの名無しさん
2008/12/30(火) 20:42:11短さだけが正義じゃないけどさ
0533デフォルトの名無しさん
2008/12/30(火) 22:13:380534デフォルトの名無しさん
2008/12/30(火) 22:44:20用途的に無理だからなあ
0535デフォルトの名無しさん
2008/12/30(火) 22:45:44GC によるストップザワールドのない言語となると
C/C++ くらいしか選択肢ないしな。
0536デフォルトの名無しさん
2008/12/30(火) 22:47:47bindなんかが必要になったら一巻の終わりだよ。
そうならない限りは本当にいいんだけどね。
0537デフォルトの名無しさん
2009/01/27(火) 11:25:010538デフォルトの名無しさん
2009/01/27(火) 19:54:300539デフォルトの名無しさん
2009/01/28(水) 18:28:09特にメンバへのアクセスが嫌だね。
0540デフォルトの名無しさん
2009/01/28(水) 19:00:500541デフォルトの名無しさん
2009/02/07(土) 20:40:31unko[unko.size()-1] = new Unko();
unko[unko.size()-1].init(chinko,manko・・・);
return unko[unko.size()-1];
これなんとかなんないの?
0542デフォルトの名無しさん
2009/02/07(土) 22:07:01p->init();
unko.push_back(p);
return p;
0543デフォルトの名無しさん
2009/02/08(日) 01:03:41大してかわんないじゃん
0544デフォルトの名無しさん
2009/02/08(日) 01:22:150545デフォルトの名無しさん
2009/02/08(日) 01:47:31センスが無いって事だと思うな。
0546デフォルトの名無しさん
2009/02/08(日) 02:08:280547デフォルトの名無しさん
2009/02/08(日) 02:14:13ap->init(...);
unko.push_back(ap.get());
return ap.release();
0548デフォルトの名無しさん
2009/02/08(日) 09:04:45いや、だからよ
そういうブロックみたいな塊自体を無くしたいわけよ
push_backがインデックスを返してくれるだけでよかったのにと思ってる
0549デフォルトの名無しさん
2009/02/08(日) 10:07:540550デフォルトの名無しさん
2009/02/08(日) 10:36:25そうなんだよ
push_backがインデックス返すだけじゃ駄目だなw
こんな感じの処理のおかげで結局管理クラス(〜Manage)とか作ったりしねぇ?
上では初期化処理ちょっと省略して書いたけど結局newやinitが失敗したりしたときの
処理まで書くとあんまりvectorやlistに恩恵感じなくなる
0551デフォルトの名無しさん
2009/02/08(日) 11:58:13何を問題としてるかよくわからんが、とりあえず vector や list を使わなければ
解決する問題ではないだろ。
もしかして ptr_vector が欲しいってだけか?
0552デフォルトの名無しさん
2009/02/08(日) 12:35:43コンストラクタで初期化するだろ普通
unko.push_back(new Unko(...));
return unko.back();
0553デフォルトの名無しさん
2009/02/08(日) 12:36:490554デフォルトの名無しさん
2009/02/08(日) 13:01:54ホントだよ
だだ漏れだよ
括約筋の切れたアナルとなにも変わらない
0555デフォルトの名無しさん
2009/02/08(日) 13:32:43push_backではbad_allocが出ないことが保証されてるけどな。
0556デフォルトの名無しさん
2009/02/08(日) 14:34:02所有権管理してない生ポインタのコンテナとかありえないよね?
0557デフォルトの名無しさん
2009/02/08(日) 14:37:52return *(unko.insert(unko.end(), new Unko(...)));
これでFAかな。
0558557
2009/02/08(日) 14:48:400559デフォルトの名無しさん
2009/02/08(日) 16:39:59困るよ
再初期化効かないじゃん
0560デフォルトの名無しさん
2009/02/08(日) 17:07:260561デフォルトの名無しさん
2009/02/08(日) 17:15:260562デフォルトの名無しさん
2009/02/09(月) 02:52:22initが要らないなんて言っていないよ。
コンストラクタが内部でinitを呼べればいいと言う話。
0563デフォルトの名無しさん
2009/02/09(月) 03:02:260564デフォルトの名無しさん
2009/02/09(月) 09:29:21キメの細かいエラー処理ができねーじゃん。
0565デフォルトの名無しさん
2009/02/09(月) 10:39:39どうせ解決するわけがないわな。
0566デフォルトの名無しさん
2009/02/10(火) 21:12:110567デフォルトの名無しさん
2009/03/04(水) 11:32:31たとえば、Windows APIとSTLの組み合わせとして、
以下のソース、※1、※2はOKなんでしょうか?
ダメ出しと回避策があればお願いします。
(エラー判定など詳細部分は省略)
HANDLE hFile;
DWORD dwCnt;
DWORD dwSize;
std::deque<BYTE> d;
std::vector<BYTE> v;
hFile = ::CreateFile(省略...);
dwSize = ::GetFileSize(hFile, NULL);
d.resize(dwSize);
v.resize(dwSize);
::SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
::ReadFile(hFile, &d[0] , dwSize, &dwCnt, NULL); // ※1
::SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
::ReadFile(hFile, &v[0] , dwSize, &dwCnt, NULL); // ※2
::CloseHandle(hFile);
0568デフォルトの名無しさん
2009/03/04(水) 15:24:03標準コンテナは vector の方だけ。
なんだけど、そういうことが訊きたかったのかな。
もう少し質問が簡で要を得てるといいんだけど。
0569567
2009/03/05(木) 09:00:41dequeにこだわる訳ではないですが、
やっぱろdequeを使うべきではない?
実は、シリアル通信でReadFileを使った例があり
以降の電文解析がdequeだったので、
ReadFileがdequeでいければいいなぁなどなど・・・
0570デフォルトの名無しさん
2009/03/05(木) 14:47:542. deque を使った既存コードの利用を諦める
どれかを受け入れるしかないんでないの
0571デフォルトの名無しさん
2009/03/05(木) 17:12:24了解!
検討してみます
0572デフォルトの名無しさん
2009/03/05(木) 20:45:47そのコード、vectorに変えても使えるのでは、と思う。
0573デフォルトの名無しさん
2009/04/01(水) 15:01:28今までvectorモンリーで開発してました。
vectorをqueueに差し替えようと思うのですが、
イテレータンでしかアクセスできなくなるんですよね?
vector<MY_REC> items;
int i = items[index].MY_MEMBER;
とか書けなくなるわけですか?
どう書き直せば良いのか教えて下さいorz
0574573
2009/04/01(水) 15:12:50vectorに近いdequeのが良いみたいですね。
0575デフォルトの名無しさん
2009/04/02(木) 14:29:03dequer<MY_REC> items;
int i = items[index].MY_MEMBER;
って書けるんでしたっけ?
0576デフォルトの名無しさん
2009/04/02(木) 14:59:33書ける
operator[]があるから
0577575
2009/04/02(木) 15:19:26C++の演算子のオーバーロードってこういう風に使われてるんですね。
自分では使ったこと無いけど。
逆にポインタ取って[]で書くとアウトなんですね。
0578デフォルトの名無しさん
2009/04/02(木) 16:59:470579575
2009/04/02(木) 17:04:11C++になってからクラスってmemsetできないし(特にstring)、
リニアの重要性って無くなりましたよね。
0580デフォルトの名無しさん
2009/04/02(木) 17:17:240581575
2009/04/02(木) 17:21:18kwsk
リニアのメモリ2つのせいで、
Out of Memoryエラーが発生してて、
vectorイヤンな気分。
0582デフォルトの名無しさん
2009/04/02(木) 17:25:43std::ropeはだめだが
0583デフォルトの名無しさん
2009/04/02(木) 20:10:49そんなこといって組んでると、javaより遅いプログラムになるぞ。
つーか、もうなってるんだけどな!
0584デフォルトの名無しさん
2009/04/02(木) 20:39:41ちょっと便利なライブラリって事を忘れちゃダメだよな
0585デフォルトの名無しさん
2009/04/02(木) 21:22:130586デフォルトの名無しさん
2009/04/03(金) 08:43:21stringが構造体のメンバだったりしたらリニアって無理な希ガス?
>std::ropeはだめだが
はつみみです。今ググってみましたが長い文字列ですか。
0587デフォルトの名無しさん
2009/04/03(金) 14:07:46>stringが構造体のメンバだったりしたらリニアって無理な希ガス?
違うvectorと同等にするって意味
std::ropeは非標準だがstd::stringよりカット&ペーストに向いている
0588デフォルトの名無しさん
2009/04/03(金) 14:12:28stringの中の人はvectorだと思い込んでいた。
>InfoQ: C++とJavaのレガシーについて語るのは時期尚早か?
>ttp://www.infoq.com/jp/news/2009/04/C-Plus-Plus-Java-Legacy
ヂャヴァの負けw
0589デフォルトの名無しさん
2009/04/03(金) 17:06:03vector<MY_REC> items;
で、
items.erase(&.items[1]);
とかしてたんだけど、
vectorをdequeにしたら、うわ、コンパイルエラー。
eraseの引数はイテレータンなんでつよね。
記述間違ってない希ガスるんだけど。
0590デフォルトの名無しさん
2009/04/03(金) 17:46:07vectorならそれで動くこともあるだろうけど。
0591590
2009/04/03(金) 17:47:32items[?]でイテレーターになると思い込んでいた。
イテレーターの書き方が分からないorz
0592589
2009/04/03(金) 17:49:12名前590は589の間違いゴメソ
0593デフォルトの名無しさん
2009/04/03(金) 17:50:58イテレータが具体的にどんな型なのかは、利用者は知らなくて良い。
(実際にはただのポインタであることもある。)
イレテータの型は vector<MY_REC>::iterator などの名前でtypedefされてるので、必要ならこれを使う。
0594589
2009/04/03(金) 18:03:49items.erase(items.begin + 1);
でコンパイル通りました。
念のため確認したいのは。
dequeはvectorみたく、
・勝手に順番は変わらない。
・items.begin + X → X番目の要素を表す
であってますよね?
0595589
2009/04/03(金) 18:04:48ごめんなさい、
items.erase(items.begin() + 1);
でしたorz
0596589
2009/04/03(金) 18:12:14vectorの要素のアドレスをイテレーターとして使うのは、どうなんでしょう?
a) 意識して使うなら記述的にOK
b) アドレス使わず素直にイテレーター使えば?
c) イテレーターに比べて間違ってコンパイル通る場合があるので、アドレス使うのやめるべき
d) vectorから別に差し替え難いのでやめるべき
e) その他
0597デフォルトの名無しさん
2009/04/03(金) 18:12:260598デフォルトの名無しさん
2009/04/03(金) 18:14:41まあ、b)c)かな。たぶん、環境によってはvectorでも>>589は通らないことがあると思うよ。
0599デフォルトの名無しさん
2009/04/03(金) 18:29:58ポインタからイテレータに変換されたりするのかな?
0600デフォルトの名無しさん
2009/04/03(金) 18:35:05イテレータの実態(実装)が単なるポインタであることがある。
0601デフォルトの名無しさん
2009/04/03(金) 18:38:500602589
2009/04/03(金) 18:47:16(ポインタ→イレテーター化は直せる数でしたので直すつもり)
vectorとdequeの違いに興味が出てきました。
vectorってresizeしてサイズを大きくした場合、
リニアアドレスが取れない場合、
勝手に先頭ポインタ(と亀の子式に残り全部)変わっちゃう場合があるんですよね?
(サイズが大きい場合、アプリ固まるんだろうか)
それに対してdequeの場合、リニアじゃない分、
要素のポインタは安定して同じ場所に居てくれるのでしょうか?
多分、上記両方とも実装依存なんでしょうけど。
ただ、STLの場合、実装依存でありながら、この操作は短時間で終わる事、
みたいな実装指定に近い規定だった記憶があるのですが。(ネットつまみ食いの知識www)
0603デフォルトの名無しさん
2009/04/03(金) 18:49:29実装依存じゃないよ。規格にイテレータの扱いも書いてある。
deque は vector よりも厳しい。
例えば、挿入操作は再配置の有無に限らず、
すべてのイテレータと参照を無効にする。
つまりアドレスが変わる。
そもそも reserve すらないし。
0604デフォルトの名無しさん
2009/04/03(金) 18:57:52あっ、そうなんですか。メモメモ
>挿入操作は再配置の有無に限らず、 すべてのイテレータと参照を無効にする。
この文章が知りたかったんです、有難うございます。STLらしい厳格な文章ですね。
STL知らない人にSTLの考え方とか注意点を伝えるとき、
イテレータンとこの1文を言っとけば大きな間違いは無くせる気がします。
0605デフォルトの名無しさん
2009/04/04(土) 02:32:35dequeは末尾か先頭で挿入される限り、全ての反復子が無効になるが参照は無効にならない。
この特性はdequeを使う主要な理由に成り得る。
0606デフォルトの名無しさん
2009/04/07(火) 21:21:270607デフォルトの名無しさん
2009/05/03(日) 03:46:230608デフォルトの名無しさん
2009/05/03(日) 09:33:35Ga();
}
0609デフォルトの名無しさん
2009/05/07(木) 15:13:55{
throw NullPointerException();
}
0610デフォルトの名無しさん
2009/05/07(木) 15:55:510611デフォルトの名無しさん
2009/06/08(月) 17:23:53STL無しに同等の機能を作るコストを考えてみるといいよ
もっと危険でgkbrなコードが生成されると思われる
0612デフォルトの名無しさん
2009/06/08(月) 18:03:160613デフォルトの名無しさん
2009/07/25(土) 23:06:39vector<int> v;
transform(v.begin(),v.end(),back_inserter(v),bind1st(plus<int>(),1));
0614デフォルトの名無しさん
2009/07/25(土) 23:11:33そもそも無限ループ。
0615デフォルトの名無しさん
2009/07/25(土) 23:19:10無効化されるのかが気になったので
再配置、ってのは、vectorのcapacityの拡張が起こるかっていうこと?
だとするとこの例は必ず無効化されるわけか
0616デフォルトの名無しさん
2009/08/01(土) 02:51:51内部でサイズが変わるような処理したらマズイと
どっかで読んだような気がするのですが心当たり有りませんか?
void somefunc(vector<string>& data)
{
data.push_back("hoge");
}
本なら大抵揃ってるので書籍名とページ数だけでも構いません…。
よろしくお願いいたします。
0617デフォルトの名無しさん
2009/08/01(土) 03:01:13そのコードは全く問題ない。つーか参照渡して中身をいじれなくてどうするんだよ。
おまいが勘違いしてるのはイテレータのことじゃないか?
0618616
2009/08/01(土) 03:12:50手元でも普通に動いてたんですが、
アレ、ホントにこれでも良かったかな?と
疑心暗鬼になってました。
レスありがとうございました。
名言集 その4
『俺の経歴カックイイだろ?』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 984 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:11:14.95 ID:PVAf+dux0
> 俺の簡単な年表(笑)
> 高二秋:自前のパソコンゲット
> 高三春:コテハンとしてデビュー、指揮官見習い
> 高三秋:指揮官デビュー
> 大一:新しい武器の開発や、突撃で数々の戦歴を残す
> 大二春:規制系キャップ取得、第一線から退く
> 大二夏:ネットでのゲーム作成プロジェクト始動
> 大二秋:政治系オフに参加
> 大二冬:最後の突撃、華々しく散る
> 大三春:政治系活動を本格始動
> 大三夏:三度目の選挙へ
>
> おまえらは、後を継ぐなよw
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
0620デフォルトの名無しさん
2009/08/31(月) 07:59:030621デフォルトの名無しさん
2009/11/24(火) 16:59:34なんかエラーになると思って調べたら、
(以下簡略化したサンプル)
int ar[10];
int idx;
idx = 5;
idx[ar] = 50;
となってた→arを要素10個のvectorに置き換えたらエラー。
idx[ar] = 50;
なんて書き方ができることを初めて知った・・・
0622デフォルトの名無しさん
2009/11/24(火) 17:10:390623デフォルトの名無しさん
2010/02/15(月) 21:28:38p+c-1==v.size()-1のとき
copy(v.begin()+p-1,v.begin()+p+c-1,u.begin()); //実行時エラー。p+cの時点でオーバーラン
copy(v.begin()+p-1,v.begin()+p-1+c,u.begin()); //OK
copy(v.begin()+p-1,v.begin()+(p+c-1),u.begin()); //OK
0624デフォルトの名無しさん
2010/02/15(月) 22:05:560625デフォルトの名無しさん
2010/04/07(水) 09:57:09常に同じ要素を指し続けてくれますか?
std::vectorとかはころころ変わりますよね
0626デフォルトの名無しさん
2010/04/07(水) 10:41:180627デフォルトの名無しさん
2010/04/07(水) 13:38:58ありがとうございます
0628デフォルトの名無しさん
2010/04/16(金) 00:27:53で辛酸をなめると、他のコンテナでもビクビクするよな
俺だけかもしれんが
0629デフォルトの名無しさん
2010/04/16(金) 00:41:30要素の変更がある用途には向かない
っつーかvector禁止でも良いくらい
0630デフォルトの名無しさん
2010/04/16(金) 04:59:36イテレータでビクビクすることはないが、
生ポインタがあちこちに渡されてるのを見ると不安になる。
0631デフォルトの名無しさん
2010/04/16(金) 08:57:18使い分けのできないバカのためにメモリ連続が保証されたコンテナを捨てる必要はない。
0632デフォルトの名無しさん
2010/04/16(金) 13:15:39フェイルセーフにも限度というものがある。
0633デフォルトの名無しさん
2010/04/16(金) 13:40:43と思ったけど要点を細大漏らさず書いてある比較表、一覧ってないのかな。
Effective STLも留意点の全てが載ってるわけじゃないし。
0634デフォルトの名無しさん
2010/04/16(金) 17:48:09なんか半年くらい前かな?
STL系でぐぐると一番にヒットしてたサイト。ヒットしなくなったよね
潰れたのかな
あそこが一番わかりやすくて良かったんだが
0635デフォルトの名無しさん
2010/04/16(金) 20:11:59ついでにboost.cppllも潰れねえかなぁ
0636デフォルトの名無しさん
2010/04/16(金) 22:40:40覚える必要なんて無いよ。
必要になってから探せばいい。
目の前の問題に必要なコンテナの特性を理解する能力を磨くのが先。
暗記自慢を増やしても仕方ない。
0637デフォルトの名無しさん
2010/04/16(金) 22:48:410638デフォルトの名無しさん
2010/04/17(土) 16:16:10STLの仕様書を読めばいいのだ。
コンテナが満たすべき仕様がすべて書いてある。
逆に言えば、書かれていないいかなる仕様も保障されていない。
ちゅか、それがまさにEffective STLに書かれていることなわけだ。
0639デフォルトの名無しさん
2010/04/17(土) 18:08:410640デフォルトの名無しさん
2010/04/17(土) 20:33:25そうじゃない人は必要なとこだけ読めばいい。
0641デフォルトの名無しさん
2010/04/17(土) 21:14:550642デフォルトの名無しさん
2010/04/17(土) 21:31:090643デフォルトの名無しさん
2010/06/26(土) 19:09:03これってやったらダメですか?
それとも別のどっかが悪いのでしょうか?
0644デフォルトの名無しさん
2010/06/26(土) 19:43:51mycls.size()の値は確認した?
0645デフォルトの名無しさん
2010/06/26(土) 19:45:20myclsが何なのか、どこで実行されているのか、全く分からない
もっと具体的に書いてくれ
0646デフォルトの名無しさん
2010/06/26(土) 20:54:44意外と使えるじゃんこれ
なんでみんな避けてるの?
0647デフォルトの名無しさん
2010/06/26(土) 22:06:230648デフォルトの名無しさん
2010/06/26(土) 22:16:55そもそも二つ以上のポインタから参照出来ないっていうのが欠陥
0649デフォルトの名無しさん
2010/06/26(土) 22:24:32としたあと
Hoge *q = p;
して
Hoge * をコンテナに入れれば良いんでね?
0650デフォルトの名無しさん
2010/06/26(土) 22:42:34何の意味があるんだ?
pの寿命が尽きるとコンテナの中身が勝手に消されるぞ。
0651デフォルトの名無しさん
2010/06/26(土) 22:47:170652デフォルトの名無しさん
2010/06/26(土) 22:51:30別にみんなが避けてるわけじゃない
多くの人はその特性を理解して適切に使ってると思う
ただ、コピーコンストラクタや代入演算子の挙動が異質だったり
色々と仕様の変遷があったり、VCの古いバージョンが不完全だったりしたので
使用に際していくつかの注意点があった
その注意点を理解出来なかったり、理解するのが面倒な人たちが避けてるだけだと思う
0653デフォルトの名無しさん
2010/06/26(土) 23:12:280654デフォルトの名無しさん
2010/06/26(土) 23:29:59レスありがとうございます
リビルドすることで落ちなくはなったんですけど
たしかこれってダメでしたね
完全に忘れていました
このスレの
>>352-から続く話を読んで思い出しました
ああ、長い時間が無駄に・・・
0655デフォルトの名無しさん
2010/06/27(日) 00:28:38>>352と同じ間違いをプログラム全域にわたってやっちまいました・・・orz
0656デフォルトの名無しさん
2010/06/27(日) 01:10:270657デフォルトの名無しさん
2010/06/27(日) 20:06:59「コピーコンストラクタ、代入演算子、デストラクタを適切に定義していなかった」
であって、「resize() を呼んでしまった」じゃないよね?
0658デフォルトの名無しさん
2010/06/27(日) 21:41:290659デフォルトの名無しさん
2010/06/27(日) 22:55:180660デフォルトの名無しさん
2010/06/27(日) 23:04:240661デフォルトの名無しさん
2010/06/28(月) 07:27:42うっかりvectorを使うとすべて必要になるからな
vectorツッコミ禁止コードを入れておけば問題ない
0662デフォルトの名無しさん
2010/06/28(月) 20:58:43vectorだけじゃないだろ。
dequeでもポインタじゃなくてオブジェクトを突っ込んだらコピーが発生する。
0663デフォルトの名無しさん
2010/06/28(月) 21:08:43望月ボウヨウ先生の入門書に書いてあった
0664デフォルトの名無しさん
2010/06/28(月) 21:10:12柴田望洋先生だw
0665デフォルトの名無しさん
2010/06/28(月) 21:23:560666デフォルトの名無しさん
2010/06/28(月) 21:38:470667デフォルトの名無しさん
2010/06/28(月) 22:47:540668デフォルトの名無しさん
2010/06/28(月) 23:06:37>>654が殉職しただけだ
気にすることはない
0669デフォルトの名無しさん
2010/07/06(火) 03:49:520670child
2010/08/05(木) 17:44:39詳しい方がいましたら教えていただきたいです。
STLportをビルド・インストールする際に、
configure msvc8でやると2008みたいでコマンドが通りません。
何を入力したらよいでしょうか?
0671デフォルトの名無しさん
2010/10/10(日) 20:47:27std::set<void(Class::*)(int)> methods;
methods.insert(&Class::Method);
原因は、メンバー関数は==と!=以外の比較ができないから。
これ欠陥じゃね?
0672デフォルトの名無しさん
2010/10/10(日) 20:58:39メンバ関数へのポインタに限らず、普通関数へのポインタなんかコンテナに入れないだろ
0673デフォルトの名無しさん
2010/10/10(日) 21:08:20それが必要だったりするんだよ。
こういうのを作ってたんだがな。
BroadCaster<void(Event&)> mouse_down;
Controler ctrl;
Event e;
mouse_down.Attach(Delegate<void(Event&)>(&ctrl,&Controler::NextClick); //リスナー登録
mouse_down(e); //すべてのリスナーにイベント発行
これの内部でsetを使ってる。でDelegateを一意に識別するためには、
どうしてもメンバー関数を内部で比較する必要があるんだよ。
まぁ、この例が特異だとしても、イベントリスナーをsetに突っ込むなんてよくやりそうな事じゃ
ないか?
0674デフォルトの名無しさん
2010/10/10(日) 21:15:59だとすればメンバ関数が==と!=しか使えないのはC++の仕様であって、バグではない
ましてやstd::setの責任でもない
設計ミスとしか言いようがないな
0675デフォルトの名無しさん
2010/10/10(日) 21:21:17お前はメンバ関数へのポインタを基礎からやり直せ
0676デフォルトの名無しさん
2010/10/10(日) 21:23:00じゃ、コンテナに突っ込む必要がある時君ならどうする?
関数をコンテナから除去するときvectorに突っ込んで全部なめて削除するのか?
それがC++の仕様だからと言って。
0677デフォルトの名無しさん
2010/10/10(日) 21:24:35だからコンテナに突っ込む事そのものが間違いだと言っているんだ
std::auto_ptrをコンテナに突っ込むのが間違いなのと同じだ
0678デフォルトの名無しさん
2010/10/10(日) 21:30:17理屈は解ってんだよ。実行するまで本当の関数が特定できないから、
メンバー関数のポインターは普通のポインターじゃない。それは解ってる。
しかし、一度なんらかの関数が代入が代入されると言うことは一意に関数を
識別できるってことではある。現に、関数ポインターを(long**)(&mp):として
とりだしてやれば一意の値を取り出すことも可能なんだ。だから、本来言語仕様で
制限するような事じゃないはずだろ。
0679デフォルトの名無しさん
2010/10/10(日) 21:31:25だったらここでいくら吠えても無駄だよ
C++標準化委員会に言いな
基本的には仕様書に従え
ここではこれしか言えん
0680デフォルトの名無しさん
2010/10/10(日) 21:38:03メンバ関数へのポインタじゃなくて、メンバに別のint型のプライオリティフラグでも持って、
それで叙述関数か何か書いてsetに叩き込めばいいだろう
いくらでも回避策はあるはずだ
頭の固いやっちゃな
0681デフォルトの名無しさん
2010/10/10(日) 22:08:54具体的にどうやんの?頭固いから解んないわ。
0682デフォルトの名無しさん
2010/10/10(日) 22:14:020683デフォルトの名無しさん
2010/10/10(日) 22:15:42例えば生成パターンにクラスを生成させて、フラグにはそれで連番振るの
それでソートさせるとかすりゃいいじゃん
0684デフォルトの名無しさん
2010/10/10(日) 22:19:47こんな感じのことがしたいのかな
http://codepad.org/NmSmtfaY
signal使おうとしたらcodepadは通らないな
ライブラリが必要だからかな
0685デフォルトの名無しさん
2010/10/10(日) 22:21:58やりたくはないけど。
0686デフォルトの名無しさん
2010/10/10(日) 22:24:16>>673の例は結局メンバー関数の関数部をポインターに変換して計算してるから
いまさら別にいいんだけどね。
stlコンテナを使ったときの汎用的な方法が知りたいよ。
0687デフォルトの名無しさん
2010/10/10(日) 22:29:52同じオブジェクトは同じポインタを指すので、ポインタの大小比較が可能になる。
と思ったが、こいつ結局ハッシュ関数を必要とするので、>>685と同じようなもんだった。
http://www.kmonos.net/alang/boost/classes/flyweight.html
0688デフォルトの名無しさん
2010/10/10(日) 22:47:01うおっバリバリのboostプログラミング
見た目C#みたいだな
0689デフォルトの名無しさん
2010/10/10(日) 22:53:36こういうこと?
http://codepad.org/jfJhVYwX
0690デフォルトの名無しさん
2010/10/10(日) 23:13:52それlとrそのもののアドレス比較してて、何を入れようと結果変わらず、
意味なくね?
0691デフォルトの名無しさん
2010/10/10(日) 23:22:33ttp://codepad.org/g26T90wp
0692デフォルトの名無しさん
2010/10/10(日) 23:26:38汚ねーテクニック使ってるなおい
移植性ないだろ
0693デフォルトの名無しさん
2010/10/10(日) 23:41:410694デフォルトの名無しさん
2010/10/11(月) 00:39:26一意の識別子をkeyに持ってvalueに関数を保持しているのなら見た事あるよ
vectorに保持するのを否定してるみたいだけど、
そんなに速度差が出るほど大量にコールバックを格納するのかな
0695デフォルトの名無しさん
2010/10/11(月) 02:33:22あとreinterpret_cast使え。
0696デフォルトの名無しさん
2010/10/11(月) 02:45:440697デフォルトの名無しさん
2010/10/11(月) 02:56:42もう大抵の処理系で使えるんじゃないの?
template<> struct std::less<void(Class::*)(int)> : public std::binary_function <void(Class::*)(int), void(Class::*)(int), bool> {
bool operator()( void(Class::*_Left)(int) , void(Class::*_Right)(int) ) const
{ return *reinterpret_cast<intptr_t*>(&_Left) < *reinterpret_cast<intptr_t*>(&_Right); }
};
不定といったって、実行時に変化するわけじゃないでしょ。
大小関係が実行時に一定なら、この用途には充分。
一定じゃない実装も考えうるけど。
0698デフォルトの名無しさん
2010/10/11(月) 02:58:31心配なら、整数に変換してから比較する比較子を作ってもいいし、
整数に変換した値をハッシュ値にしてunordered_setに入れるのなら、なんの心配も要らないはず。
メンバへのポインタだとそんな保証はあったっけ?
0699デフォルトの名無しさん
2010/10/11(月) 03:11:05メンバ関数へのポインタはintptr_tと同じ大きさとは限らない。
仮想関数なんかに対処しないといけないため。
少なくともsizeofで見ないとダメだよ。
g++ (x86 32ビット)だとintptr_tの倍の8バイト、
VC++ (x86 32ビット)もコンパイルオプションやその他状況次第で4から最大16バイトになる。
0700デフォルトの名無しさん
2010/10/11(月) 05:59:23データ型へのポインタについてしか、相互変換での安全性は保証されていない。
メンバ関数に限らず、通常の関数ポインタもダメ。
0701デフォルトの名無しさん
2010/10/11(月) 14:49:250702デフォルトの名無しさん
2010/10/11(月) 15:55:070703デフォルトの名無しさん
2010/10/12(火) 03:53:36ttp://codepad.org/puCA18lB
0704デフォルトの名無しさん
2010/10/13(水) 04:21:13というより、そもそも、どうしてそれが保証されると思うのかが聞きたいw
0705デフォルトの名無しさん
2010/10/14(木) 01:11:540706デフォルトの名無しさん
2010/10/19(火) 14:09:38std::fstreamを使ってバイナリデータを読み込もうとしています。
データは、いくつもの構造体をそのままダンプしたデータとなっており
----
fstrm.exceptions(std::fstream::badbit | std::fstream::failbit);
fstrm.open("hoeg.dat", (std::ios::in | std::ios::binary));
fstream.read(&hogeStruct, sizeof(hogeStruct));
fstream.read(&fooStruct, sizeof(fooStruct));
----
こんな感じで次々構造体にreadしていこうと思いました。
ここで困ったのですが、どうも「readした結果、ぴったりファイル終末まで達したら」failでExceptionが投げられるようなのです。
期待していたのは「readなりで、ファイルサイズをオーバーして読もうとしたら」例外。
という挙動なのですが、こちらはfstreamに存在しないのでしょうか?
eofのExceptionも「ぴったりファイル終末まで達したら」投げられてしまうようでして…。
0707706
2010/10/19(火) 14:28:52すいません、こちら私の勘違いが原因でした。
ぴったし+1バイト以上読むとeofbitのExceptionおよびfailbitのExceptionが発生しました。
こちらのテストコードミスです。すいませんでした
0708デフォルトの名無しさん
2010/10/19(火) 18:27:460709デフォルトの名無しさん
2010/11/27(土) 19:13:200710デフォルトの名無しさん
2010/11/29(月) 15:52:260711デフォルトの名無しさん
2010/12/03(金) 18:21:050712デフォルトの名無しさん
2010/12/04(土) 03:11:380713デフォルトの名無しさん
2010/12/04(土) 10:08:200714デフォルトの名無しさん
2011/01/09(日) 02:13:56微妙だよなぁ。constで呼び出されたときに未格納のキーを渡されたら例外出せばいいだろうに。
0715デフォルトの名無しさん
2011/01/09(日) 02:52:110716デフォルトの名無しさん
2011/01/09(日) 11:21:060717デフォルトの名無しさん
2011/01/09(日) 11:23:500718デフォルトの名無しさん
2011/01/10(月) 08:39:40end() の参照を返すわけにもいくまい。
コンパイルエラーにしてくれる現状がベスト。
だいたいその程度なら自分でユーティリティ作ればいいだろう。
0719デフォルトの名無しさん
2011/01/10(月) 08:44:34組み込み屋はなんで例外吐かれると困るの?
どのみち map 使ってたら bad_alloc 飛んでくるんじゃね?
0720デフォルトの名無しさん
2011/01/11(火) 16:56:470721デフォルトの名無しさん
2011/01/12(水) 14:28:35処理速度やメモリ消費を考慮して例外を使用しない設定でビルドするよ。
STL コンテナを使うときには例外出さない自作アロケータ使うよ。
0722デフォルトの名無しさん
2011/01/12(水) 15:01:47処理速度?
例外使っても throw 〜 catch 以外は遅くなるところ無いんじゃないの?
むしろ戻り値でエラーチェックしないぶん速くなることもあるみたいだし。
メモリ消費っていうのはコードサイズのことかな?
RAM の消費は数 KB ってとこだよね?
0723デフォルトの名無しさん
2011/01/13(木) 13:27:310724デフォルトの名無しさん
2011/01/13(木) 23:48:36それはあたりまえ。
でも try で処理速度が問題になることは(最近のコンパイラでは)ほぼ無い。
VC6 とか Mingw 3.x.x あたりでは try (およびローカルオブジェクト)ごとに
コードが追加されてえらいことになってたみたいだけど。
0725デフォルトの名無しさん
2011/01/14(金) 14:27:49> 例外使っても throw 〜 catch 以外は遅くなるところ無いんじゃないの?
throw 〜 catch 使わないなら例外自体使わなくてもいいでしょ。
メモリはコードサイズとテーブルのサイズ。
実行時に消費するメモリがどのくらいかはちょっと見当がつかない(かなり少ないんじゃないか)。
0726デフォルトの名無しさん
2011/01/14(金) 14:34:29>> 例外使っても throw 〜 catch 以外は遅くなるところ無いんじゃないの?
> throw 〜 catch 使わないなら例外自体使わなくてもいいでしょ。
throw 〜 catch をまったく使わないんじゃなくて、 throw 〜 catch が
遅くなるだけならかまわない(異常系の速度を気にしないところでしか
使わない)ってことでしょ。
map の例で言えば、 at() と find()+if とを見つからない場合の速度要求に
応じて使い分けるってことになるね。
なので >>721 のように「例外を使用しない設定でビルド」する理由に
処理速度を挙げるのはおかしいんじゃないの?って話。
0727デフォルトの名無しさん
2011/01/15(土) 12:31:38例外ランタイムをリンクするだけで処理速度にペナルティがあるなんて話をしたつもりはないよ。
0728デフォルトの名無しさん
2011/03/23(水) 18:38:31.04キーと値のペアを一時変数でごにょごにょいじって再格納したいときとか、
value_typeを集めたvectorを作りたい時とか困るじゃん!
今は苦肉の策で
typedef std::pair<hoge, hoge> mutable_value_type;
mutable_value_type pair(hogeMap.begin()->first, hogeMap.begin()->second);
とかしてるけど面倒すぎるよ!何か良い方法ないの?
0729デフォルトの名無しさん
2011/03/23(水) 20:00:48.73挿入時と検索時の速度を保証するため
もしconstじゃなかったら挿入の度に木を再構築しなければならず、ものすごく遅くなる
0730デフォルトの名無しさん
2011/03/23(水) 20:05:09.23規格で規定はされてないけど普通木構造で実装するので key の値を変えられると最悪木全体の再構築が必要になる。
key なり pair<key,value> なりにコピーしてから変更すれば?そのコードはちょい遠回りじゃね?
0731デフォルトの名無しさん
2011/03/23(水) 20:42:08.75std::pair<hoge, hoge> hogecopy( *hogeMap.begin() );
std::pair<const hoge, hoge> & hogeref( *hogeMap.begin() );
ていうか、なんで pair にするの?
key を変更して再格納するなら key, value のそれぞれの一時変数を作るのが平明でしょ。
value を編集したり、集めたりするなら、イテレータのままで問題ない。
0732デフォルトの名無しさん
2011/03/24(木) 15:29:52.11typedef map< ..., ... > mt;
typedef pair<
remove_const< mt::value_type::first_type >::type,
mt::value_type::second_type
> mpt;
確かにあんまりイケてない気がする
0733デフォルトの名無しさん
2011/03/25(金) 15:17:36.160734デフォルトの名無しさん
2011/03/26(土) 23:45:56.42さしあたって mt::value_type::first_type は mt::key_type、mt::value_type::second_type は mt::mapped_type でいける。
0735デフォルトの名無しさん
2011/03/28(月) 07:08:46.000736デフォルトの名無しさん
2011/04/12(火) 21:00:55.82継承したクラスを作ったんだが、
.erase(std::remove())の記法で削除される要素は、
eraseに来る時点で該当要素のオブジェクトが初期化されてしまっていた。
(具体的には、shared_ptr要素の指す先がnullになっていた)
なにか他に良い方法はないだろうか?
0737デフォルトの名無しさん
2011/04/12(火) 21:20:53.550738デフォルトの名無しさん
2011/04/12(火) 21:31:20.290739デフォルトの名無しさん
2011/04/12(火) 21:44:14.93removeeraseの使用を禁止して、
代わりにfinderaseベースの削除コードを
使用するよう規定すればいいのか。
>>737-738
ありがとう。
sortする理由は、removeだと詰めて空いた分の要素が初期化されちゃうけど、
sortなら初期化されずに同値が隣接するだけになるからってことで合ってるかな?
0740デフォルトの名無しさん
2011/04/13(水) 01:14:30.35remove同様前後に分かれるだろ
0741デフォルトの名無しさん
2011/04/13(水) 03:01:21.93そのクラスで書き込み可能なイテレータや参照を公開している限り、
任意の処理を漏れなく実行することは無理でしょう。
0742デフォルトの名無しさん
2011/04/13(水) 03:24:52.590743デフォルトの名無しさん
2011/04/13(水) 21:01:20.910744デフォルトの名無しさん
2011/04/14(木) 01:09:57.04継承しても、 new で得たポインタをアップキャストしたまま delete しない限りは問題ない。
0745デフォルトの名無しさん
2011/05/26(木) 18:27:34.11v.reserve(1000);
for(int i=0; i<1000; ++i) v[i]=i;
とした後に、
vector<int>::iterator it;
for(it=v.begin(); it!=v.end(); ++it) cout<< *it <<endl;
としてもうまくいきません。v.end()がv[1000]の次を指していないため
ですが、v.end()を設定する方法ってあるんでしょうか?
それとも、reserveとiteratorは相性が悪いのでしょうか?
0746デフォルトの名無しさん
2011/05/26(木) 18:50:01.190747デフォルトの名無しさん
2011/05/26(木) 18:51:16.33アクセス可能になるわけではないと思いますが
0748デフォルトの名無しさん
2011/05/26(木) 21:05:46.19そうなんですが・・・ push_backでは時間がかかります。
>>747
実際、reserveしてみると、普通にV[i]=iのアクセスが可能です。
「いや、そう見えるだけであって実際には・・・の話かもしれないけど
(C++では意外なメカニズムに驚くことが多すぎて、自信ないです)。
0749デフォルトの名無しさん
2011/05/26(木) 21:37:58.050750デフォルトの名無しさん
2011/05/26(木) 21:54:40.61[i]が単なるポインタアクセスになってるからできてしまっているが、
reserveしただけの段階だとsize()の値とかend()の返す位置とかpush/pop_back()
など全部変化しないから、色々困るだろう。
[i]で初期値を入れるなら、reserveじゃなくてresizeを使うといいよ。
0751デフォルトの名無しさん
2011/05/26(木) 21:58:20.92あとreserveしたサイズ内でのpush_backならメモリの拡張処理は発生しないと
思うので、時間もかからないんじゃないの。
(どの環境なのか分からないので断言はできないが)
0752デフォルトの名無しさん
2011/05/26(木) 22:21:30.30そう、難しく考えなくとも
vector<int> v(1000);
で済む話でした。ただ、intを格納するのなら問題ないですが、
自作のオブジェクト、それも引数付きのオブジェクトを格納
するときはreserveが必要なわけで。で
しかし、iteratorは使えないわけで。
>>749 - >>751
嘘。
0753デフォルトの名無しさん
2011/05/26(木) 22:57:34.91reserve()じゃなくてresize()だろう
ちゃんと規格票か本読め
0754デフォルトの名無しさん
2011/05/26(木) 23:34:07.64vec.reserve(5);
for( int i = 0; i < 5; ++i ) vec[i] = i;
↓codepad の g++ でabortした
> /usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/vector:192:
> error: attempt to subscript container with out-of-bounds index 0, but
> container only holds 0 elements.
たまたま上手く動いているように見えるだけで
reserveしただけの要素に直接アクセスするのはやはり避けるべきでしょう
0755デフォルトの名無しさん
2011/05/27(金) 01:12:35.01reserve() + push_back() でいいだろ。
確かに最終的な要素数が決まっている状況で size() を 1 ずつ増やしていくのは無駄だけど、
自作のオブジェクトならその部分の負荷の割合も下がるだろうし。
0756デフォルトの名無しさん
2011/05/27(金) 01:16:31.09防止するだけの働きであり、実際に空のコンテナを用意するわけではない
だから未定義の動作=鼻から悪魔
メモリの再割り当てが起きると時間が掛かるしイテレータ・ポインタ・参照が無効に
なるのでそれを回避したい時に使うがそれ以上の意味はない
詳しくはEffective STL P65を見よう
0757デフォルトの名無しさん
2011/05/27(金) 01:17:37.800758デフォルトの名無しさん
2011/05/27(金) 09:37:17.26ごめん。俺の間違いだったかもしれん。
>>756
Effective STL P65、ちょっと前に読んだことあるけど、言ってる
ことが俺にはよくわからなかった。空のコンテナを確保しておか
ないと、メモリの再割り当てを防止できないと思うけど。
>>754
そうかもしれない。
>>755
確かに。でも、gcc4.4.2 + SGI STL ? では reserve()を使わずに
vector<int> v;
for(itr=0; itr<itrmax; ++itr) {
for(i=0; i<N; ++i) v1.push_back(i);
v1.clear();
}
とやった方が圧倒的に速かった。STLの実装にもよるがreserve()を使う
ご利益がわからない。iteratorの無効化は防げるだろうけど。
0759デフォルトの名無しさん
2011/05/27(金) 09:39:21.110760デフォルトの名無しさん
2011/05/27(金) 09:59:39.02>>755
比較するベンチマークのプログラムが間違ってた。やはり、
reserve() + push_back()の方が速かった。
(1) reserve()関数で領域確保しても、push_back()で要素を格納していく。
(2) いきなり、[]演算子を使って要素の代入を行うのは危険
ってとこか。しかし、v.reserve(N)を呼び出した時点でv.size()、v.end()
を使えるようにすることはreserve()関数内で可能だと思うが、そうしない
のはなぜだろう?
0761デフォルトの名無しさん
2011/05/27(金) 10:21:13.86調べろよ
0762デフォルトの名無しさん
2011/05/27(金) 10:23:40.12コンストラクタが呼ばれない=オブジェクトが初期化されない。
resizeは初期化される=アクセスしても安全。
0763デフォルトの名無しさん
2011/05/27(金) 10:24:15.26が無効になるだろが。知らんくせに横から口出すな。カス!
0764デフォルトの名無しさん
2011/05/27(金) 10:28:57.560765デフォルトの名無しさん
2011/05/27(金) 10:42:12.570766デフォルトの名無しさん
2011/05/27(金) 10:43:57.090767デフォルトの名無しさん
2011/05/27(金) 11:31:35.43当然デストラクタも呼ばれないわけで
もはやオブジェクト指向どころの話ではなく
charのブロックをnewして直接弄ってるのとあまり変わらない気がするw
0768デフォルトの名無しさん
2011/05/27(金) 13:28:47.48馬鹿かお前は
Effective STLを100回読んでから書き込め
0769デフォルトの名無しさん
2011/05/27(金) 14:52:09.910770デフォルトの名無しさん
2011/05/27(金) 16:49:06.820771デフォルトの名無しさん
2011/05/27(金) 21:15:21.15こういう奴に限って、全然わかっとらんw
0772デフォルトの名無しさん
2011/05/27(金) 21:22:39.07まだ噛みついてんのか
余程悔しかったらしいなw
0773デフォルトの名無しさん
2011/05/27(金) 21:38:14.95馬鹿か
0774デフォルトの名無しさん
2011/05/27(金) 21:59:34.790775デフォルトの名無しさん
2011/05/28(土) 01:36:35.440776デフォルトの名無しさん
2011/05/28(土) 02:55:17.040777デフォルトの名無しさん
2011/05/28(土) 05:14:22.010778デフォルトの名無しさん
2011/05/28(土) 06:32:17.530779デフォルトの名無しさん
2011/05/28(土) 09:30:37.630780デフォルトの名無しさん
2011/05/28(土) 17:34:58.920781デフォルトの名無しさん
2011/05/28(土) 18:14:21.650782デフォルトの名無しさん
2011/05/28(土) 18:37:51.010783デフォルトの名無しさん
2011/05/28(土) 20:49:15.85あqwせdrふじこlp;←適当な処理
Prob[N] = std::accumulate(Prob.begin(), Prob.end()-1, 0);
N番目の要素にN-1番目までの要素の和を求めて、
結果が1になるのを確認したかったのですが、Prob[N]に0が代入されました
だれか何か御教示ください。
0784デフォルトの名無しさん
2011/05/28(土) 21:48:43.450785デフォルトの名無しさん
2011/05/28(土) 21:54:39.98↑Pr.begin() ↑Pr.end()
となると思ったので、イテレータから-1しました.
0786デフォルトの名無しさん
2011/05/28(土) 21:57:26.72やりたいことは、
Prob[0]からProb[N-1]までの要素の和を求めて、
Prob[N]に合計を代入したかったんです。
0787デフォルトの名無しさん
2011/05/28(土) 22:08:38.57合計が 0 だったんだろ。 1 になるというのならその根拠がわかるように書いてくれないと。
0788デフォルトの名無しさん
2011/05/28(土) 23:32:04.11は、乱数を割り当てて、その規格化定数で割るといった処理をしているので、
合計は1かそれに近い値になります。
実際に各要素を出力させても、[0,1)の範囲で値が入っているため
合計が0になることはありえません。
STLでは、引数にvectorをとる関数の返り値を、
その引数に代入させてはいけないのか疑問に思ったので
質問させて頂きました
0789デフォルトの名無しさん
2011/05/28(土) 23:46:44.72std::advance(Prob.end(), -1)に置き換えたらどうなる?
0790デフォルトの名無しさん
2011/05/28(土) 23:59:40.230791デフォルトの名無しさん
2011/05/29(日) 00:13:41.59デバッガで追えば簡単に分かることだからちゃんとデバッグしよう
0792デフォルトの名無しさん
2011/05/29(日) 00:38:05.93ではどうかな?
0793デフォルトの名無しさん
2011/05/29(日) 00:41:25.85累算する値の型はテンプレート第2引数だから、そうはいかない。
・・・それでいけるようにしたほうがよかったんだろうな。設計ミスっぽい。
0794デフォルトの名無しさん
2011/05/29(日) 00:50:35.70スレの趣旨にぴったりだな。
0795デフォルトの名無しさん
2011/05/29(日) 00:52:51.91合計値は変わりませんでした。
random-access iteratorの演算子に、-が含まれているので
リテラルとして,Pr.end()-1はあっている気がします.
>>790,791
ありがとうございます。期待する値を得ることができました
今度からデバッガかけます
0796デフォルトの名無しさん
2011/05/29(日) 01:17:52.281 Effects: Computes its result by initializing the accumulator acc with the initial value init and then modifies
it with acc = acc + *i or acc = binary_op(acc, *i) for every iterator i in the range
[first, last) in order.262)
2 Requires: T must meet the requirements of CopyConstructible (20.1.3) and Assignable (23.1) types.
binary_op shall not cause side effects.
マジだorz
>acc = acc + *i or acc = binary_op(acc, *i) for every iterator i in the range
つまりaccの型がintだといくらdoubleを足しても小数点以下は切り捨てか
0797デフォルトの名無しさん
2011/05/29(日) 17:41:18.40メイヤーなんて、そりゃプログラミングはわかるかもしれないが、
論理的な思考というか、説明能力が欠如
そんなのをありがたがっている黄色い猿どもってw
0798デフォルトの名無しさん
2011/05/29(日) 17:42:58.220799デフォルトの名無しさん
2011/05/29(日) 17:56:00.33それとも一つにまとめるよりばらけさせて二倍臭いとかそんなつもり?
0800デフォルトの名無しさん
2011/05/31(火) 17:31:24.75面倒だけど
std::accumulateの宣言は
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init);
だから
int main()
{
std::vector<double> vd;
for (int i = 0; i < 10; i++)
vd.push_back(i);
double sum = std::accumulate<std::vector<double>::iterator, double>(vd.begin(), vd.end(), 0);
std::cout << sum << std::endl;
}
こういう書き方なら末尾の 0 を double と見なしてくれる
0801デフォルトの名無しさん
2011/05/31(火) 18:36:20.40std::accumulate(v.begin(), v.end(), double());
型名を明示したかったらこうすればいいだけのことだろ
ばかばかしい
0802デフォルトの名無しさん
2011/05/31(火) 19:06:19.60それはわかっている
Generic Template Programmingを読んだらaccumulateの宣言が載っていたので
それでやろうと思っただけ
template引数の使い方も知っておかないとまずい場合もあるだろ
俺だったらこうするね
std::accumulate(v.begin(), v.end(), 0.0);
0803デフォルトの名無しさん
2011/05/31(火) 19:08:16.04>ばかばかしい
0804デフォルトの名無しさん
2011/06/08(水) 22:46:46.220805デフォルトの名無しさん
2011/06/09(木) 18:11:45.660806デフォルトの名無しさん
2011/06/10(金) 13:34:29.50怒られてると思うなら精神科による診断をお奨めします
0808 忍法帖【Lv=4,xxxP】
2011/06/11(土) 13:11:51.790809デフォルトの名無しさん
2011/06/11(土) 16:33:50.25理由は?理由も書かずにいきなり「精神科に行け」とは失礼過ぎませんか?
あなたの方がおかしい可能性も十分にあるでしょう
だから理由を聞かせて下さい
0810デフォルトの名無しさん
2011/06/11(土) 16:59:57.16この程度で怒られる事もあるんですよ
「ばかばかしい」という言葉は強い意味ですよ
もしそう思っても書かないで、あなたの腹の中で思ってて下さい
書くと誤解を招きます
0811デフォルトの名無しさん
2011/06/11(土) 17:01:15.74自分の非を差し置いて人に「精神科に行け」とはずいぶんな言いがかりですね
0812デフォルトの名無しさん
2011/06/11(土) 19:38:06.110813デフォルトの名無しさん
2011/06/11(土) 21:13:07.36STLがばかばかしいんじゃなくてお前の頭が馬鹿なだけだろjk
0814デフォルトの名無しさん
2011/06/11(土) 23:22:27.60http://studiokingyo.fc2web.com/
0816デフォルトの名無しさん
2011/06/12(日) 14:36:53.52マゾですか?
0817デフォルトの名無しさん
2011/06/12(日) 21:08:13.91うんでさ、大抵のalgorithmってfirst、secondに引っかかるじゃん。
みんなどうしてんの?
わざわざpair用に噛ませるfunctorとか作ってんの?
0818デフォルトの名無しさん
2011/06/12(日) 22:44:55.98こういう話か?だからC++1xはlambda式が使えるようになってるわけよ
こういう面倒な事をしなくても済むように
struct Pred : public std::unary_function<std::pair<const std::string, int>, bool> {
std::string str;
public:
explicit Pred(const std::string& s) : str(s) {}
result_type operator()(argument_type& pos) const {
return str == pos.first;
}
};
int main()
{
std::map<std::string, int> si;
si["abc"] = 1;
si["def"] = 2;
si["ghi"] = 3;
std::map<std::string, int>::const_iterator pos = std::find_if(si.begin(), si.end(), Pred("def"));
std::cout << pos->second << std::endl;
}
0819デフォルトの名無しさん
2011/06/12(日) 23:10:45.37ラムダはともかく、なんでC++03の時点でライブラリのサポートが無いのかわからん。
0820デフォルトの名無しさん
2011/06/12(日) 23:56:05.15それをlambda式を使って書くとどうなるの?
0821デフォルトの名無しさん
2011/06/13(月) 00:09:08.63int main()
{
std::map<const std::string, int> si;
si["abc"] = 1;
si["def"] = 2;
si["ghi"] = 3;
std::map<const std::string, int>::const_iterator pos = std::find_if(si.begin(), si.end(), [&](std::pair<const std::string, int> pos) { return pos.first == "def"; });
std::cout << pos->second << std::endl;
}
どや、無茶苦茶シンプルになるやろ
0822デフォルトの名無しさん
2011/06/13(月) 00:15:34.57え?サポートされてるでしょ
単に関数オブジェクトを勉強すればすぐに理解出来る
ただ unary_function とか binary_function の必要性は関数アダプタを
勉強するまで分からないだろうが
0823デフォルトの名無しさん
2011/06/13(月) 22:59:38.65短くなるけど、[&]ってセンス悪過ぎない?
0824デフォルトの名無しさん
2011/06/13(月) 23:10:25.15俺もC++1xのlambda式はあまりにも見た目が汚いと思うんだが、FDISで誰も
代替案を出せないんだと
多分このまま決まるな
VS2010もg++もこのlambda式が使えるし
0825デフォルトの名無しさん
2011/06/14(火) 02:00:01.84個別にキャプチャするにはやっぱり囲わないとダメか。
0826デフォルトの名無しさん
2011/06/14(火) 04:52:48.60こんなもん考えたやつ、頭オカシイんでねーの?
0827デフォルトの名無しさん
2011/06/14(火) 10:30:39.64それは甘い
boostのソース見て見ろよ
完全に発狂していると思えるぞ
0828デフォルトの名無しさん
2011/06/14(火) 20:02:11.400829デフォルトの名無しさん
2011/06/14(火) 21:00:01.930830デフォルトの名無しさん
2011/06/14(火) 21:48:41.830831デフォルトの名無しさん
2011/06/14(火) 22:06:52.55バッファが飛んだとき、将来の職業としてプログラマだけにはなってたまるかって思ったよ
0832デフォルトの名無しさん
2011/06/14(火) 22:52:50.84あれぐらいで頭オカシイ、完全に発狂って言うようじゃ
C++プログラマ(C++を使えるといえない)とは言えない
0833デフォルトの名無しさん
2011/06/14(火) 23:21:19.80boostだってマクロ乱舞だぜ
0834デフォルトの名無しさん
2011/06/15(水) 00:00:05.35少なからずマクロの力必要だし
たぷるとかマクロなしでひとつひとつ作ってたら死んじゃう
0835デフォルトの名無しさん
2011/06/15(水) 01:41:11.78ほう、ではお前さんはboostを超える物を何か書いて発表したかね?
0836デフォルトの名無しさん
2011/06/15(水) 05:14:33.27可変長引数テンプレートの代替くらいじゃん
workaround以外でマクロの出番なんて普通にC++使ってればそれほどない
少なくとも日常的に使うほどではまずない
0837デフォルトの名無しさん
2011/06/15(水) 10:50:28.100838デフォルトの名無しさん
2011/06/15(水) 22:13:20.550839デフォルトの名無しさん
2011/06/15(水) 22:38:49.450840デフォルトの名無しさん
2011/06/16(木) 06:05:49.630841デフォルトの名無しさん
2011/06/17(金) 00:14:33.50QueryPerformanceCounter()を使った簡単なクラスを組んであるけど
これよりもっと手軽だ
0842天使 ◆uL5esZLBSE
2011/07/03(日) 17:11:37.45変数に$ついてる言語触ってるって事だよね
いちいちSHIFT+4キーおして $ 打ちまくってる感触はどう?
ゴミ
0843デフォルトの名無しさん
2011/07/03(日) 20:28:10.610844デフォルトの名無しさん
2011/11/22(火) 12:54:48.410845デフォルトの名無しさん
2011/11/22(火) 14:42:42.580846デフォルトの名無しさん
2011/11/22(火) 16:05:27.12というのも、結局、どこかの流派の人たちはクラス名の前にかならず C をつけたり、
データメンバのまえに m_ をくっつけたりするからだ…。
クラス名は先頭が大文字ならそれでいいのに。
0847デフォルトの名無しさん
2011/11/22(火) 17:51:25.17文字列のプレフィックスだよな
0848デフォルトの名無しさん
2011/11/22(火) 21:17:42.680849デフォルトの名無しさん
2011/11/23(水) 17:37:06.290850デフォルトの名無しさん
2011/11/23(水) 23:35:09.12BASIC は suffix だろ、しっかりしてくれ。
0851デフォルトの名無しさん
2012/01/19(木) 23:33:45.210852デフォルトの名無しさん
2012/02/09(木) 06:51:04.860853デフォルトの名無しさん
2012/07/18(水) 15:28:56.39>Ponit *pPt = Points.insert(Points.end(), Point());
このとき、pPtが参照しているメンバーは何番目のメンバーか把握できるのでしょうか?
orz
0854デフォルトの名無しさん
2012/07/18(水) 15:58:41.600855デフォルトの名無しさん
2012/07/18(水) 16:09:57.84vectorの返すイテレータはポインタとは限らないぞ
0856デフォルトの名無しさん
2012/07/18(水) 16:12:38.060857デフォルトの名無しさん
2012/07/18(水) 16:13:16.870858デフォルトの名無しさん
2012/07/18(水) 16:13:43.97で、質問をちゃんと読んでから、偉そうにコメントしてくれ。
0859デフォルトの名無しさん
2012/07/18(水) 16:15:14.19馬鹿か?
Points.size() - 2
だろ
0860デフォルトの名無しさん
2012/07/18(水) 16:15:49.74ありがたく思え。
0861デフォルトの名無しさん
2012/07/18(水) 16:17:12.770862853
2012/07/18(水) 16:18:17.49C言語的な解決策はあったわけですね。その手段でやるしかないですね。
逆にイテレータンを経由した書き方で、853を書き替えたらどうなるんでしょう。
でもイテレータンだと、何番目のメンバーとか取れないのか。。。
何だかSTLって悩みますね。
0863デフォルトの名無しさん
2012/07/18(水) 16:19:33.520864853
2012/07/18(水) 16:20:39.48>end() は要素じゃないんじゃないんじゃないんじゃない?
どっちですか(><)
何年もこの書き方なんですが、今さら違ってると言われたらガクブルw
0865デフォルトの名無しさん
2012/07/18(水) 16:28:47.31スレ違いもいいとこ
0866デフォルトの名無しさん
2012/07/18(水) 16:30:51.15何で-2ですか?
0867デフォルトの名無しさん
2012/07/18(水) 16:49:14.890868デフォルトの名無しさん
2012/07/18(水) 16:57:22.640869デフォルトの名無しさん
2012/07/18(水) 17:29:57.940870853
2012/07/18(水) 17:37:10.50ベクタンのイテレータンって、ポインタで良かったんでしたっけ?
だとすると、
>std::vector<Point> Points;
>Ponit *pPt = Points.insert(Points.end(), Point());
>int iIndex = distance(pPt - &Points[0]):
ですか?
0871853
2012/07/18(水) 17:56:59.47>std::vector<Point> Points;
>Ponit *pPt = Points.insert(Points.end(), Point());
>int iIndex
のとき、
>iIndex = Points.size() - 1;
>iIndex = distance(Points.begin(), pPt);
の両方とも、上手く動作するっぽいですorz
0872デフォルトの名無しさん
2012/07/18(水) 18:06:29.06end()
文法:
iterator end();
end() 関数はベクタの末尾を指す イテレータ を返す。
ベクタの最終要素にアクセスするは、イテレータをデクリメントする必要があることに注意。
関連項:
begin()
0873デフォルトの名無しさん
2012/07/18(水) 18:08:55.570874デフォルトの名無しさん
2012/07/18(水) 18:11:52.90■←begin()
■
■
□←end()
0875デフォルトの名無しさん
2012/07/18(水) 18:12:42.85■←begin()
■
■←back()
□←end()
0876デフォルトの名無しさん
2012/07/18(水) 18:17:17.37>
>--- "[cppll:9733] Re: std::vector の要素の連続性" ---
>
>>2000年08月に vcpp mlで、「規格上は中身をどう実装しようが勝手なんで、
>>std::basic_stringを用いる手もアリかも」という話がありました。
>
>規格上は中身をどう実装しようが勝手なんで、
>std::basic_stringの要素が連続してる保証が…
># 実質上おっけーですけど^^;
>
>ま、欲しいバッファがconstでいいなら basic_string::data() 呼べば。
0877デフォルトの名無しさん
2012/07/18(水) 18:19:18.090878デフォルトの名無しさん
2012/07/19(木) 04:25:47.05全要素コピーされてたでござるの巻
0879デフォルトの名無しさん
2012/07/19(木) 08:49:54.82しかし、じっさいに動作させると、
>Points.size() - 1
で上手くいくのですが?
0880デフォルトの名無しさん
2012/07/19(木) 09:05:53.54これって、インサートしたものが末尾になっているような気がするのですが、
間違いですか?
0881デフォルトの名無しさん
2012/07/19(木) 11:30:54.02>>880 自分で確かめられるだろ。
0882デフォルトの名無しさん
2012/07/19(木) 11:44:06.47わかります
0883デフォルトの名無しさん
2012/07/20(金) 13:38:01.50struct Rec {
std::vector<Rec> InArray;
};
std::vector<Rec> OutArray;
のとき、
OutArray.clear();
ってやっても、
InArrayがクリアしてなかったから、メモリリークになった、
なんてことは無いですよね?
0884デフォルトの名無しさん
2012/07/20(金) 13:39:47.820885883
2012/07/20(金) 13:42:08.73InArray.clear();
してから、
OutArray.clear();
しろ、
ということですか?
0887デフォルトの名無しさん
2012/07/20(金) 20:48:11.940888デフォルトの名無しさん
2012/07/20(金) 23:56:00.360889デフォルトの名無しさん
2012/07/21(土) 01:32:49.420890デフォルトの名無しさん
2012/07/21(土) 02:51:51.100891uy
2012/07/21(土) 03:09:27.18まずこの08月ってのがいきなりうざい
>>>2000年08月に vcpp mlで、「規格上は中身をどう実装しようが勝手なんで、
>>規格上は中身をどう実装しようが勝手なんで、
「規格上」は? はぁ?????「規格では」とか言えばいいのに
しかも何で二回いってんの
しかもその後
>># 実質上おっけーですけど^^;
また「○○上」って単語がでてきた 最後の顔文字なんでつけたの? ねえなんで「^^;」←この顔文字をつけたの? この顔文字つける意味あった?ネェなんで顔文字つけたのー?
ほんのわずかな文章で 規格上 規格上 実質上 って3回も変な単語でてきたよコイツ
次、
>>std::basic_stringの要素が連続してる保証が…
はぁ???
最後まで喋れよ
>>ま、欲しいバッファがconstでいいなら basic_string::data() 呼べば。
、ま、ま、ま、ま、ま「、ま」じゃねーよ何もまとまってないし、 呼べば。 でまた文章とまってる
はぁ???
なにこれ、
最後まで発音できないの?
>>std::basic_stringの要素が連続してる保証が…
>>ま、欲しいバッファがconstでいいなら basic_string::data() 呼べば。
いい加減にしろ
謝れ
俺が言いたいのはそれだけ
0892uy
2012/07/21(土) 03:10:14.09保証がなんだよ
ふざけんな
0893デフォルトの名無しさん
2012/07/21(土) 10:02:51.810894デフォルトの名無しさん
2012/07/21(土) 10:40:37.430895デフォルトの名無しさん
2012/07/21(土) 19:10:32.92uyも大してかわんないからさ
0897デフォルトの名無しさん
2012/08/10(金) 19:11:06.720898デフォルトの名無しさん
2012/08/17(金) 23:13:56.200899デフォルトの名無しさん
2012/08/20(月) 01:00:57.80C++11はいいぞー
ムーブコンストラクタがどんなに便利か
そしてSTLもかなり速くなっている
0900デフォルトの名無しさん
2012/08/20(月) 09:07:00.310901デフォルトの名無しさん
2012/08/20(月) 09:11:36.100902デフォルトの名無しさん
2012/08/20(月) 12:39:24.73898です。
現場がまだそれ(C++11)に対応して無いから仕方無いんだけどね。
愚痴ってしまった。
0903デフォルトの名無しさん
2012/08/21(火) 00:03:02.27一時オブジェクトを作る→それをコピー→一時オブジェクトを破棄
って無駄だろうが
C++11では出来る場所では
一時オブジェクトを作る→即そのポインタもしくは参照を変数に代入
というわけで無駄がないし速くなる
0904デフォルトの名無しさん
2012/08/21(火) 00:50:47.18> 一時オブジェクトを作る→即そのポインタもしくは参照を変数に代入
とても正しく理解できているようには読めんな。
0905デフォルトの名無しさん
2012/09/06(木) 19:01:01.41http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320846.aspx
0906906
2012/10/23(火) 11:53:50.37>Point2D *pP = Points.insert(Points.end(), Point2D());
某系のコンパイラでは通るのですが、gccでコンパイルエラーです。
この書き方って間違ってますか?
0907906
2012/10/23(火) 11:56:54.190908デフォルトの名無しさん
2012/10/23(火) 12:21:48.29public:
void print() const {
std::cout << "Point2D" << std::endl;
}
};
int main()
{
std::vector<Point2D> Points;
std::vector<Point2D>::iterator pP = Points.insert(Points.end(), Point2D());
pP->print();
Point2D* pP2 = &*pP;
pP2->print();
}
0909906
2012/10/23(火) 12:55:05.180910906
2012/10/23(火) 18:16:35.57つまり、gccではベクタンで、
「ポインタ→イテレータン」はキャストOK、
「イテレータン→ポインタ」はキャストNG、
ということでしょうか?
「イテレータン→ポインタ」はどう書けるのでしょう?
0911デフォルトの名無しさん
2012/10/23(火) 19:07:35.33pointer = &* iterator;
0912デフォルトの名無しさん
2012/10/23(火) 20:07:08.97pointer = &Points[Points.size() - 1];
0913906
2012/10/24(水) 09:20:48.54なるほど、イテレータンから一旦実体化してさらにアドレス取るんでつね。
盲点というか、それならコンパイルエラー起きようがないです。
0914デフォルトの名無しさん
2012/10/24(水) 09:31:30.710915906
2012/10/24(水) 10:36:10.51ポインタンを保持するとダメなだけで。
ってSTLの最大の欠点は、何が危ないか難しい事ですよね。
0916デフォルトの名無しさん
2012/10/24(水) 10:43:48.63また色々ミスが出てくる
0917デフォルトの名無しさん
2012/10/24(水) 19:12:32.87ああ再配置か
いつ起きるか分からないから怖いな
まあだいたい起きる時の指針はあるけど
0918デフォルトの名無しさん
2012/10/27(土) 23:21:15.770919デフォルトの名無しさん
2013/02/10(日) 15:40:08.47VC++2008でvectorを使っているのですが、デストラクタでのclear()呼び出し時に、vector::_Orphan_range
と言う関数内でアクセス違反が発生しています。
関数内でvector内をいじる箇所を全部コメントアウトしても、同じ箇所でエラーが発生します。
どこかで何かを見落としている結果だとは思うのですが、全く思い当たる節がないため、
煮詰まってしまいました。 なにか、このエラーが(_Orphan_range()で)発生する理由があるのでしょうか。
どなたかご教授願えませんでしょうか。
0920デフォルトの名無しさん
2013/02/10(日) 15:54:54.42問題再現用のソースを作って貼るつもりが無いなら
↓こちらのスレへどうぞ。
http://toro.2ch.net/test/read.cgi/tech/1187922645/
0921デフォルトの名無しさん
2013/02/10(日) 16:14:44.17問題の切り分けで再現ソースを作ろうとしているのですが、試みがうまくいっていない状態です。
先ほどから試行を続けて、スレッド内からスレッドを立ち上げ、クラスのメンバ変数となっているvectorで
begin()を実行してiteratorの値を得ると、エラーが発生することがわかりました。
(何故かiteratorを得ないでbegin()だけ実行してもエラーとならない)
0922デフォルトの名無しさん
2013/02/10(日) 18:43:54.910923デフォルトの名無しさん
2013/02/11(月) 00:46:14.38コピコンとoperator=をちゃんと定義してないからじゃねーの
0924デフォルトの名無しさん
2013/02/11(月) 12:32:18.06無事解決しますた。
0925デフォルトの名無しさん
2013/02/11(月) 17:18:53.960926デフォルトの名無しさん
2013/03/06(水) 23:16:23.82オブジェクト内部で保持する要素を列挙するのにJavaの感覚でイテレータだけ
返す関数を作ったら、いざ使おうとしたときに「あれ?」ってなったわ。
0927デフォルトの名無しさん
2013/03/06(水) 23:28:13.650928デフォルトの名無しさん
2013/03/06(水) 23:32:08.88↓
0929デフォルトの名無しさん
2013/03/07(木) 07:38:46.12終端を判断できるオブジェクトはイテレータ範囲(iterator range)という概念として
boostのrangeライブラリで実装されており、今後標準でもサポートしていく予定になっている。
0930デフォルトの名無しさん
2013/03/07(木) 11:24:52.950931デフォルトの名無しさん
2013/03/28(木) 22:34:20.51mapを置き換えたいんですが、
他によいライブラリあるかな?
VC6です。
0932デフォルトの名無しさん
2013/03/29(金) 07:48:13.800933デフォルトの名無しさん
2013/03/29(金) 15:44:07.18今はどうかとか他人の環境でどうかなどは知らん。
0934931
2013/03/29(金) 18:20:52.87最初はboostでやろうと思ったのですが、
1.34.1までしか対応してないらしいという情報を見て、
そのバージョンはまだuom対応してなくてstlrortにたどり着きました。
やはり普通のmapに比べてかなり速いですね
ただinsertに使うイテレーターが関数の種類によって違うのは仕様なのかな?
ちょいハマりました。
最新のバージョンは標準のiostreamは使えなくなってるらしいので注意が必要
0935デフォルトの名無しさん
2013/04/02(火) 15:04:09.43VC2010でiostreamは普通に使えているが。
0936デフォルトの名無しさん
2013/04/03(水) 04:29:32.83_STLP_DONT_REDEFINE_STDでつかうってことですか?
v5からラッパーモードはなくなってstlport内では
完全にstlport独自のiostreamの実装を使うようになった。
REDEFINEしない場合は、
stlport::xxxと(コンパイラ提供実装の)std::xxxとは、個別に使えるが、
stlport::xxxとstd::xxx間のやり取りは注意が必要的な認識なんだけど。
>FAQ
>Q2.3 Can I mix STL implementations in my project?
と
>ReleaseNote
>5.0:
>- Major modifications
> * No more wrapper mode: you can use STLport iostreams or no iostreams
> at all.
調べたけどこんなのでてきたしまだよくわかってない
http://sourceforge.net/projects/stlport/forums/forum/490891/topic/4089488
まぁライブラリとしては問題なく使えてるからいいか
0937デフォルトの名無しさん
2013/09/05(木) 00:16:36.100938デフォルトの名無しさん
2013/09/05(木) 00:25:49.15vector<int> vt;
(以下vtに配列代入)
vector::<int>::iterator i;
i = list.begin();
と書いて実行したらAccessViolationが発生しました。
vector::<int>::iterator i = list.begin();
と書いたら問題はありませんでした。
この2つの書き方はどのように違うのでしょうか?
0939デフォルトの名無しさん
2013/09/05(木) 01:40:21.97前者は代入。後者は初期化。
list の型がわからんからエラーの原因は知らんよ。
知りたかったらエラーの再現する最小コードを作ってみるといい。
0940938
2013/09/05(木) 02:56:49.74vector<int> vt;
(以下vtに配列代入)
vector::<int>::iterator i;
i = vt.begin();
です。
一応これが最小コードです。
0941938
2013/09/05(木) 03:02:34.13vt.begin()のアドレスに書き換えられるだけかと思っていたんですが、
もしそうなら例外が発生する理由がわからないので・・・
0942デフォルトの名無しさん
2013/09/05(木) 03:36:47.06イテレータって大抵参照だよね
0943デフォルトの名無しさん
2013/09/05(木) 07:59:49.83> (以下vtに配列代入)
そこ省略しちゃ最小コードとは言えないよ。 main も無いし。
codepad や ideone に貼り付けてテストできるようにすれば
環境依存の問題かどうか切り分けられる。
ちなみにコンパイラ何使ってるの?
http://codpad.org/ に貼ってくださいな
0945938
2013/09/07(土) 00:38:59.00あとで指定のURLに書き込みます。
推測で書いていたら違うところがありました。
0946938
2013/09/07(土) 04:20:39.04(コードパッドURL)/FdcWwKqq
(※URLを貼り付けられないと表示されるので、上記の記載で勘弁してください)
実行自体はできるのですが、動的解析をするとAccessViolationがIteratorに
代入するところで発生します。
環境はLinuxのg++でコンパイル、実行してます。
先のコードはかなり勘違いしてました。申し訳ありません。
はじめいってたこととずいぶん違うじゃないか?
0948デフォルトの名無しさん
2013/09/07(土) 06:13:06.64動的解析ツール側の問題だと思う
0949938
2013/09/08(日) 02:25:50.84申し訳ありません。
別のコードと勘違いしていました。
>>948
コンパイル実行が一見できていても
実はメモリ破壊していたということがあるので
その類かと思ってます。
もちろんツールの不具合の可能性もありますが。
0950デフォルトの名無しさん
2013/09/08(日) 12:11:39.95ぱっと見だだけだけどconstがらみじゃないの?
あと、気になっただけなんだけど、std::stringに入れる文字列をunsigned char*で定義して
あとからわざわざchar*にキャストするのはなぜ?
0951938
2013/09/08(日) 23:13:57.56簡略化するためにunsigned char*の配列で定義しました。
String型にpush_back()するためにchar*に変換する必要がありました。
やっぱりconstからみですかね・・・
0952デフォルトの名無しさん
2013/09/09(月) 03:19:17.37完全に別のインスタンスになってるこんなところでエラー出るとは思えない
0953938
2013/09/12(木) 23:36:07.21いろいろありがとうございました。
0954デフォルトの名無しさん
2013/09/14(土) 10:59:23.00単純化して書くと、
struct person
{
person* p;
person(person* other=0) : p(other) { }
他のメンバ;
};
int main()
{
std::vector<person> Vec;
Vec.push_back(person(0));
Vec.push_back(person(&pV[0]));
Vec.push_back(person(&pV[1]));
・・・
push_backで再アロケートが起こると壊れる。
0955デフォルトの名無しさん
2013/09/14(土) 11:03:51.48単純化(?)よりも、動いて実際に壊れるコードをだしてくれ。
そうじゃなきゃ、なにが問題かなんてわからんだろ。
0956デフォルトの名無しさん
2013/09/14(土) 11:16:44.55Vec[n].p == &Vec[n-1]
が成り立ってると思ったら、Vec[n].pが指してる場所は消滅している。
reserveしてからpush_backするか、resizeしてから各Vec[i] へ代入しなきゃダメ。
personはデフォルトのコピコンと代入演算子でOKなクラス。
デストラクタで delete p もしてない。
コンテナの要素としての要件は満たしているんだけどね。
0957デフォルトの名無しさん
2013/09/14(土) 11:41:28.85メモリ上の位置変わっても文句言えねえだろ
0958デフォルトの名無しさん
2013/09/14(土) 11:41:35.45なんでnとn-1が同じところを指すんだか
pVもどこからでて来たかわかんねーし…
0959デフォルトの名無しさん
2013/09/14(土) 11:48:43.880960デフォルトの名無しさん
2013/09/14(土) 11:55:16.36書き間違い
× Vec.push_back(person(&pV[0]));
× Vec.push_back(person(&pV[1]));
○ Vec.push_back(person(&Vec[0]));
○ Vec.push_back(person(&Vec[1]));
0961デフォルトの名無しさん
2013/09/14(土) 11:57:34.470962デフォルトの名無しさん
2013/09/14(土) 12:07:11.58イテレータも有効範囲に注意してし使わなければならない、ってのはSTLを
使い始めてごく初期に学ぶことと思っていたが。
0963デフォルトの名無しさん
2013/09/14(土) 12:47:02.26そうだね。外部イテレータが無効になるのは誰もが意識してるだろうけどね。
0964デフォルトの名無しさん
2013/09/19(木) 18:34:33.670965デフォルトの名無しさん
2013/09/21(土) 12:56:57.01それ、boost::ptr_vectorにしといた方がいい
0966デフォルトの名無しさん
2013/09/22(日) 12:01:45.67全然知らんかった
0967デフォルトの名無しさん
2013/09/22(日) 16:21:09.710968デフォルトの名無しさん
2013/09/24(火) 11:11:33.570969デフォルトの名無しさん
2013/09/25(水) 13:08:33.55結局そうなるのか
0970デフォルトの名無しさん
2013/09/25(水) 15:41:46.87必ず末尾のNULL部分なのでしょうか?
>char cLast = *(SBuf.end());
>if (cLast == 0) {
> cLast = *(SBuf.end() -1);
>}
みたいな処理を書いていますが、コンパイラによっては、
1行目で吹っ飛びます(><)
0971デフォルトの名無しさん
2013/09/25(水) 15:49:09.490972デフォルトの名無しさん
2013/09/25(水) 15:54:58.79http://toro.2ch.net/test/read.cgi/tech/1380091988/
0973デフォルトの名無しさん
2013/09/25(水) 15:59:01.050974デフォルトの名無しさん
2013/09/25(水) 17:04:28.720975デフォルトの名無しさん
2013/09/25(水) 17:07:26.77領域が確保されてないので中身にアクセスすると未定義
単にイテレータを比較するためのだけのもの
ちなみにイテレータの比較に < を使わず != を使うのは、random_access_iteratorだけじゃないため
0976デフォルトの名無しさん
2013/09/25(水) 17:19:58.95有難うございました。
>random_access_iteratorだけじゃないため
今一つ意味が。。。
0977デフォルトの名無しさん
2013/09/25(水) 17:53:55.31例えばstd::listはbidirectional_iteratorなので要素順としては連続していても
アドレスがあべこべの順になっているなんて事はよくある
だから < で比較しない
というか実際に自分で試してみて「あれっ?」と思う体験が大事
0978デフォルトの名無しさん
2013/09/26(木) 04:14:10.98std::string で末尾が NULL なのは c_str() でアクセスした場合。
末尾の文字が欲しい場合は
const char cLast = SBuf.empty() ? 0 : *SBuf.rbegin();
とかする。
空文字列の時に rbegin() を逆参照してはいけないので注意。
君の *(SBuf.end() -1) も空文字列の時にダメ。
*(SBuf.end()) は常にダメ。
0979デフォルトの名無しさん
2013/09/26(木) 07:49:42.600980デフォルトの名無しさん
2013/09/26(木) 08:45:35.57なるほど、STLの.end()って、ここでしか使ったこと無かったんですが、
既にデータの外だよ、
という意味でしたか。
0981デフォルトの名無しさん
2013/09/26(木) 11:16:56.600982デフォルトの名無しさん
2013/09/26(木) 14:35:55.20って、最後の文字のポインタになってて、最後の文字取得出来た方が便利じゃん?
0983デフォルトの名無しさん
2013/09/26(木) 15:06:59.12int main()
{
std::string str("Test");
std::string::const_iterator pos = str.begin();
for (int i = 0; pos != str.end(); i++, ++pos)
std::cout << "str[" << i << "] = " << *pos << std::endl;
for (int i = 0; i < (int)strlen(str.c_str()) + 1; i++) {
std::cout << std::dec << std::noshowbase << "str.cstr[" << i << "] = '\\";
if (str.c_str()[i] == '\0')
std::cout << "0x00' ←Terminate character" << std::endl;
else
std::cout << std::hex << std::showbase << std::setw(4)
<< std::setfill('0') << (int)str.c_str()[i] << "'" << std::endl;
}
}
0984デフォルトの名無しさん
2013/09/26(木) 18:18:29.680985デフォルトの名無しさん
2013/09/26(木) 20:25:31.13そんな事は分かっている
それにrbegin()もあるし
c_str()の場合はどうするんだ?
0986デフォルトの名無しさん
2013/09/26(木) 20:52:35.40>>978とかイテレータを経由する意味がまったくわからないし
0987デフォルトの名無しさん
2013/09/26(木) 20:56:02.54文句あるんなら自分で書け
0988デフォルトの名無しさん
2013/09/26(木) 21:35:18.080989デフォルトの名無しさん
2013/09/26(木) 21:49:00.24ム板なら黙って改良版を書いて示して「こっちの方がすっきりしてるだろ」と言う方がいい
0990デフォルトの名無しさん
2013/09/26(木) 22:33:01.27char cLast = SBuf.back();
こっちのほうがすっきりしてるだろ
空文字列のときどうしたいのかはわからないから好きにしろ
0991970
2013/09/27(金) 09:09:41.20あ、これで最後の文字が取れるんですか。
これが知りたかったことかもwww
>空文字列のとき
は、size()で判定済みなので、無問題です。
0992デフォルトの名無しさん
2013/09/27(金) 10:58:13.94C++03にはない
0993デフォルトの名無しさん
2013/09/27(金) 13:57:03.30orz
0994デフォルトの名無しさん
2013/09/27(金) 16:24:43.000995デフォルトの名無しさん
2013/09/27(金) 16:50:23.11if (SBuf.length())
std::cout << *SBuf.rbegin() << std::endl;
0996デフォルトの名無しさん
2013/09/27(金) 17:05:54.46>SBuf.rbegin()
てのが最後の文字を指して(rってのは、reverseだとオモ)、
>SBuf.begin()
てのが最初の文字を指すんだ。
orz
0997デフォルトの名無しさん
2013/09/27(金) 17:45:49.58C++11で結構詰められている
そりゃ8年も掛けたんだもんな
0998デフォルトの名無しさん
2013/09/28(土) 01:21:39.38http://www.open-std.org/jtc1/sc22/wg21/ の Issue List の更新履歴でも見てみるといい。
未完成の割合で言えば、手を広げた分 C++11 のほうがむしろ未完成とも言えてしまう・・・ような気もする。
0999デフォルトの名無しさん
2013/09/28(土) 05:49:33.76世界最大規模の言語かよ
もっともライブラリを入れたらJavaやC#もすごい規模なんだけど
1000 ◆Cj98aJOpxg
2013/09/28(土) 06:46:47.54http://toro.2ch.net/test/read.cgi/tech/1380091988/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。