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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2005/05/20(金) 12:28:48
>>1
3デフォルトの名無しさん:2005/05/20(金) 12:42:13
4デフォルトの名無しさん:2005/05/20(金) 12:43:33
関連スレ

【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/l50
BOOSTを語れゴラァ
http://pc8.2ch.net/test/read.cgi/tech/1091198276/l50

5デフォルトの名無しさん:2005/05/20(金) 12:47:12
>>1
もう死ねよ脳足りん。
6デフォルトの名無しさん:2005/05/20(金) 12:47:49
重複スレなのでこちらへどうぞ。

【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/l50

C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/l50
7デフォルトの名無しさん:2005/05/20(金) 12:57:31
>>1-6
スレ立て乙
8デフォルトの名無しさん:2005/05/20(金) 13:01:57
VCのSTLはどこら辺が腐っているのですか?
9デフォルトの名無しさん:2005/05/20(金) 13:11:51
汁との「STL標準講座」はVC6で動作確認してる。
俺もVC以外使わないから
事実上はVCが世界の標準なわけだし、
10デフォルトの名無しさん:2005/05/20(金) 13:16:58
11デフォルトの名無しさん:2005/05/20(金) 13:19:56
12デフォルトの名無しさん:2005/05/20(金) 13:59:11
>>9
>事実上はVCが世界の標準なわけだし
>事実上はVCが世界の標準なわけだし
>事実上はVCが世界の標準なわけだし
バカが勃てたスレにバカが。
13デフォルトの名無しさん:2005/05/20(金) 14:01:45
デフォルトアロケータが省略できないような糞STL=VC6はいらんとですよ。
14デフォルトの名無しさん:2005/05/20(金) 15:51:16
事実上はマイクロソフトが世界の標準なわけだし
15デフォルトの名無しさん:2005/05/20(金) 15:52:56
>>13
それ、99%おまえのコーディングミス。
C++の基礎事項をチェック。
16デフォルトの名無しさん:2005/05/20(金) 15:56:41
VC6ならあるいはそういうことがあっても不思議ではなかろう
17デフォルトの名無しさん:2005/05/20(金) 16:13:43
#pragma warning (disable : 4786)
↑↑糞なVC6だけに必要なプラグマですね(プ
18デフォルトの名無しさん:2005/05/20(金) 19:12:42
このスレはなにげにレベルたかいな・・・
19デフォルトの名無しさん:2005/05/20(金) 19:50:44
クオリティなら高いかもな
20デフォルトの名無しさん:2005/05/20(金) 23:19:28
黒ジャーを作るテンプレートないですか
21デフォルトの名無しさん:2005/05/20(金) 23:25:15
VCのhash_mapはO(N)じゃなくてO(logN)だって聞いたんで
速攻STLPortにしますた。
22デフォルトの名無しさん:2005/05/20(金) 23:33:34
それじゃ逆効果だろw
23デフォルトの名無しさん:2005/05/20(金) 23:48:08
>>21
正しくはO(N logN)ね、
愚かな人間のくせになまいきな・・
24デフォルトの名無しさん:2005/05/21(土) 22:40:11
http://pc8.2ch.net/test/read.cgi/tech/1104898734/562

562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。

このスレが不要である事に疑いの余地は無い。
25デフォルトの名無しさん:2005/05/22(日) 06:17:48
>>24
テンプレートを使わないスタイルの人や
テンプレートの相談なんて必要無い人(vector,list,stringの一般的な使い方で十分な人)も
まだまだ多いからC++スレにテンプレート厨を入れたく無いってのが本当の理由だろうな。

いってみりゃただの隔離スレw
でも、必要でしょ?テンプレート厨ウザイからw
26デフォルトの名無しさん:2005/05/22(日) 15:14:21
>>23
余計間違ってるし・・・
27デフォルトの名無しさん:2005/05/23(月) 19:37:34
std::stringって文字列受け取ったときに内部のバッファにコピーするんでしたっけ?

int main(void)
{
  string str;

  //寿命の短いほげほげ
  {
    str = "HogeHoge";
  }

  //スコープ外れても大丈夫?
  printf(str.c_str());

  return 0;
}
28デフォルトの名無しさん:2005/05/23(月) 20:09:39
>>27
>std::stringって文字列受け取ったときに内部のバッファにコピーするんでしたっけ?
する。

ちなみに、文字列リテラルはプログラムの実行中ずっと生きてる。
29デフォルトの名無しさん:2005/05/25(水) 10:39:43
vector<int> v;
vector<int>::const_iterator p=v.begin();

こういう使い方をしていると、v の型を(たとえばlist<int>などに)変えたときに
「vector<int>::」の箇所も変えなくてはならなくて不便なので、

v.const_iterator p=v.begin();

という感じのことをしたいのですが、これだとコンパイルエラーになってしまいます。
このようなことをする方法ってありますか?
30デフォルトの名無しさん:2005/05/25(水) 11:01:07
>>29
typedef vector<int> v_type;
v_type v;
v_type::const_iterator p = v.begin();

or

template<typename Iterator> void do_something(Iterator p);
do_something(v.begin());
31デフォルトの名無しさん:2005/05/25(水) 11:01:31
typeof!

3227:2005/05/25(水) 11:42:12
>>28
どうもありがとうございました。
ところでちょこっとスレ違いになりそうな気もしますが、
文字列って27のようにスコープ外れたり極端な例でいえば
char* getString()
{
  char* p = "HogeHogeHoge";
  return p;
}

みたいな文字列でもプログラムの実行中は生きてるのでしょうか?
33デフォルトの名無しさん:2005/05/25(水) 13:05:06
>>32
yes
34デフォルトの名無しさん:2005/05/25(水) 15:45:13
char*をconst char*に変えれば、そのプログラムは無問題
35デフォルトの名無しさん:2005/05/25(水) 17:27:32
char *に文字列リテラルを代入できるのはCとの互換性のため。
36デフォルトの名無しさん:2005/05/27(金) 06:27:32
vectorをシャフルする方法を教えてください
37デフォルトの名無しさん:2005/05/27(金) 06:45:45
vectorをシャフル?
単にstd::random_shuffleを知らないってだけの話なのか、
それとも何かひねったこと訊いてるのか。
38デフォルトの名無しさん:2005/05/28(土) 00:01:46
初心者なんですが教えてください。
市販の本で、STLのvectorとかlistの説明で
vector<char>
とか
list<int>
とか簡単な例が載っていますが、これってほとんど実用性がありません。
で、考えたのですが、例えば構造体のポインタ(アドレス)を格納するようにして、

#include <vector>
using namespace std;
struct Hoge
{
double A[ 3];
int B[ 5];
};
vector<Hoge*> VHoge;

などとして、

Hoge* T=new Hoge;
VHoge.push_back(T);
:
:

とかってやったらかなり便利かな、と思ったのですが、
こういう例って見たこと無いんです。
ポインタ(アドレス)を要素に使っちゃダメとかいうことってあるのでしょうか?
39デフォルトの名無しさん:2005/05/28(土) 00:04:04
問題ない
ただ、deleteするのを忘れるなよ
40デフォルトの名無しさん:2005/05/28(土) 00:04:24
やっちゃ駄目!
理由は>>41から
41デフォルトの名無しさん:2005/05/28(土) 00:05:39
>>38
普通はそうやって使う。
42デフォルトの名無しさん:2005/05/28(土) 00:05:50
>>38
文法的には全然問題ないが、動的に確保したオブジェクトを生ポインタで持つのはタブー。
boostかLokiあたりのスマートポインタを使うべし。

>これってほとんど実用性がありません。
んなこたぁ無い。
43デフォルトの名無しさん:2005/05/28(土) 00:07:31
>>42
>動的に確保したオブジェクトを生ポインタで持つのはタブー。

誰のタブーだよ?
44デフォルトの名無しさん:2005/05/28(土) 00:07:34
標準に無いものを安易にすすめるなと言いたい
45デフォルトの名無しさん:2005/05/28(土) 00:08:30
マイタブーと思われ。。。
46デフォルトの名無しさん:2005/05/28(土) 00:10:27
>>43
一般論だぞ。
たとえば38のpush_backが例外を投げたらHogeが一個リークする。

>>44
確かにそうだがauto_ptrは使えないのでしょうがない。
47デフォルトの名無しさん:2005/05/28(土) 00:14:41
vector<Hoge*> VHoge;

vector<Hoge> VHoge;
とやったら、構造体(クラス)Hogeに標準コンストラクタと
演算子<と==を定義しないといけないんですよね。
となると、やっぱりアドレス格納方式のほうが良いかなぁ、と思いますが。。。
48デフォルトの名無しさん:2005/05/28(土) 00:15:57
>>47
何の話だ
4947:2005/05/28(土) 00:17:13
>>48
>>38ですた。スマソ
50デフォルトの名無しさん:2005/05/28(土) 00:26:30
>>49
そうではなく
> とやったら、構造体(クラス)Hogeに標準コンストラクタと
> 演算子<と==を定義しないといけないんですよね。
は何の話だって事。
どっから仕入れた。
51デフォルトの名無しさん:2005/05/28(土) 00:29:48
smartpointerだと例外投げられても delete hoge してくれるのか?
どうやってんだ?
っていうかまったくsmartptr知らないんだけどさ。
52デフォルトの名無しさん:2005/05/28(土) 00:32:36
>>47を見て、え!?と思った人が、日本全国で3人ぐらいいると思う。
53デフォルトの名無しさん:2005/05/28(土) 00:35:31
>>51
boostのshared_ptrみたいなスマートポインタは、デストラクタで
確実に資源の解放をする

Stroustrupの「資源の獲得は初期化である」戦術に沿ってるわけだ。
つか、それをやらないと例外安全なコードが書けないのがC++。
54デフォルトの名無しさん:2005/05/28(土) 00:37:59
ベクトルを使ってオブジェクトを格納する場合、
クラスがデフォルトのコンストラクタを定義し、
<と==の演算子のオーバーロードバージョンを提供する必要あり、
って手元の本には書いてあるよー。
コンパイラのSTLの実装方法によっては、その他の比較演算子も
必要になることもあるって。( ^∀^)つ" ∩ヘェー
55デフォルトの名無しさん:2005/05/28(土) 00:40:13
>>54
STL使うときって面倒くさいね。
かなり巨大なクラスになってからだと、やっかいだな。
そもそも、比較演算なんて想定していないクラスはどーすんだ?
56デフォルトの名無しさん:2005/05/28(土) 00:41:59
>>55
STLが予期しない結果や動きをすることもあるってことだろ?
これまでの原因不明のバグは、これだったのかと...orz
57デフォルトの名無しさん:2005/05/28(土) 00:42:11
比較をしないなら比較が必要なコードはコンパイルされない
ゆえにエラーにならない
んじゃなかったか
5851:2005/05/28(土) 00:42:27
>>53
>スマートポインタは、デストラクタで確実に資源の解放をする

それは予想内のことだけど、そのスマートポインタのデストラクタが、
例外が投げられた後どうやって呼ばれるかと疑問に思っているわけだが?
59デフォルトの名無しさん:2005/05/28(土) 00:43:33
>>58
なんだかよくわからんな。スタック巻き戻しの際にデストラクタをいちいち
よんでやるのはC++の基本機能だろ。
60デフォルトの名無しさん:2005/05/28(土) 00:43:38
そういえば、俺の恩師は、STLを真に理解している人は、
世界に5人しかいないだろうって言ってたな。
61デフォルトの名無しさん:2005/05/28(土) 00:44:55
>>57
コンパイルされないと実行時どうなっちゃう?
62デフォルトの名無しさん:2005/05/28(土) 00:46:04
比較されないから、結果は不定とか。
63デフォルトの名無しさん:2005/05/28(土) 00:46:06
>>61
あのね、実行時必要になるような(=つかってる)コードはもちろん
コンパイルされるの。
ぜんぜん使ってないコードは、コンパイルされないわけ。

もちろんテンプレートに限った話だよ。
64デフォルトの名無しさん:2005/05/28(土) 00:47:11
>>54
そうなのか?本のタイトルは?
俺の本(Generic Programming -STLによる汎用プログラミング-)には

vector< T >
型の要件: T は代入型のモデルである。

代入型
有効な式:
X(x); x は X のオブジェクト、X(x) は x のコピー。
X x(y); y は X のオブジェクト、y は x のコピー。
x = y; 戻り値の型はX&、x は y のコピー。

とあるぞ。
あるいは最後の x = y だけを以って代入型とする場合もある。


>>60
最近はもっと増えた思う。
65デフォルトの名無しさん:2005/05/28(土) 00:47:51
>>63
ダイナミックリンクならぬダイナミックコンパイルみたいだ。
66デフォルトの名無しさん:2005/05/28(土) 00:49:38
Assignableである必要すらなかったと思うんだが、記憶違いかな。
6751:2005/05/28(土) 00:50:05
>>59
一体どういうスコープなのそれって?
スタックにsmartpointerをインスタンス化するってこと?
そんなんじゃ、そのvector自体、関数内のローカルな寿命でしかないじゃん。
使えないよそれじゃ。
68デフォルトの名無しさん:2005/05/28(土) 00:50:29
>>65
そうそう、テンプレートはそういう面倒くささと高度な技術を
実装系にもとめちゃうわけ。

初期のCfrontは、とりあえずリンクしてみて、(テンプレートがらみで)
たりないものがあったら再度コンパイラを走らせる
みたいな実装だったらしいよ。
69デフォルトの名無しさん:2005/05/28(土) 00:51:43
>>51
まあ君がなにも分かっていないことが、よくわかった
70デフォルトの名無しさん:2005/05/28(土) 00:52:42
C++にはテンプレートの型の要件を明示する機能はないし
コンパイルエラーが意味不明になりがちなのは欠点だよね
7151:2005/05/28(土) 00:56:49
>>69
まぁ、キミは表面的な理解しかしてないが、とりあえず「スマートポインタ」
とか言ってみたかっただけだという事が判った。
72デフォルトの名無しさん:2005/05/28(土) 00:57:31
>>67
vector破棄->スマートポインタ破棄->オブジェクト破棄
の連鎖が成り立つことが重要。
そのvector自体もスマートポインタで管理されてるかも知れないけど、
連鎖を逆にたどっていっていつかはローカル変数にたどり着くなら、
その関数が例外で終了したときにすべて破棄されることが保障される。
73デフォルトの名無しさん:2005/05/28(土) 00:59:56
>>64
標準講座C++
基礎からSTLを利用したプログラミングまで
P559、P565あたりかな。
intやcharの組み込み型は既に用件を見てしているから無問題だって。
ユーザーが定義した型(構造体やクラス)だと必要なのかな?
74デフォルトの名無しさん:2005/05/28(土) 01:01:19
>>73
×見てしているから
○満たしているから
7551:2005/05/28(土) 01:01:31
>>72
そうだね。たとえ行き着く先のsmartptrがstaticであっても破棄されるね。
76デフォルトの名無しさん:2005/05/28(土) 01:03:38
STL使うためだけに演算子定義するの面倒だー。
オブジェクトの集合が順序集合じゃなきゃダメってことか?
なんか使いにくいのねー。
77デフォルトの名無しさん:2005/05/28(土) 01:04:51
>>76
いやだから、比較が必要なコンテナやアルゴリズム、メソッドが
使えないというだけ
78デフォルトの名無しさん:2005/05/28(土) 01:05:19
>>76
vector使うだけなら要らんぞ。mapは必要だがな。
79デフォルトの名無しさん:2005/05/28(土) 01:06:43
>>77-78
そうなの。少し安心。
80デフォルトの名無しさん:2005/05/28(土) 01:07:25
ここって良スレだね。
81デフォルトの名無しさん:2005/05/28(土) 01:07:42
>>67
スタック巻き戻しだけでなく、
コンストラクタの最中におちた場合にも、基底やそん中で生成された
オブジェクトのデストラクタは起動されるし、
何かがdelete(delete[])される際には、そのオブジェクトの
デストラクタは起動される。

これ以上の確実性は、手作業では保証できんのよ。だから、「資源獲得は
初期化である」テーゼが重要なの。
82デフォルトの名無しさん:2005/05/28(土) 01:09:29
クラスは回らない寿司屋の板前みたいに格式ばってるが
テンプレートはファーストフードのマニュアル対応みたいなもん
インターフェースだけあわせておけばとりあえず店員として通用する
それがテンプレートクオリティ
83デフォルトの名無しさん:2005/05/28(土) 01:11:23
STLの唯一の間違いは、
インターフェースにクラスを強要してしまっていることだ

つまりファーストフードの店員に板前の真似事を無理矢理強要させるのと同じ
84デフォルトの名無しさん:2005/05/28(土) 01:11:24
そのインタフェースが言語機能的には明示されないのが欠点なんだけどね
8551:2005/05/28(土) 01:11:39
>>81
もう判った。ごめんごめん。
あとは、pointee_ に代入するオーバーヘッドの問題だけだな。
86デフォルトの名無しさん:2005/05/28(土) 01:12:14
>>83
それは違う
組み込み型や組み込みの配列やただの関数ポインタが使えるのが
STLのいいとこじゃないか
87デフォルトの名無しさん:2005/05/28(土) 01:12:34
なんかレベルが高くなってきたのでそろそろねまつ。
みなさん、ありがとうございました。
88デフォルトの名無しさん:2005/05/28(土) 03:53:34
>83
>インターフェースにクラスを強要してしまっていることだ
これは,例えばコンテナの要件がbeginやendなどをメンバ関数として実装していることを
要求していることを指している,と解釈して良いですか?

で,これを
>STLの唯一の間違い
と指摘する具体的な理由も聞いてみたいです.後半の
>つまりファーストフードの店員に板前の真似事を無理矢理強要させるのと同じ
という文章だけだと抽象的過ぎてあまり良く理解できなかったので・・・.
89デフォルトの名無しさん:2005/05/28(土) 06:51:55
begin endの実装なんて、
ファーストフードの店員にスマイルを強要する程度じゃないか?
90デフォルトの名無しさん:2005/05/28(土) 08:10:14
いったん比喩を取っ払わないと
以後数十レスほど混沌とし続ける予感
91デフォルトの名無しさん:2005/05/28(土) 08:24:17
二次元のベクトル
vector< vector< double > > x(SIZEX, vector< double >(SIZEY));
はうまくいくのですが
vector< vector< vector< double > > > x(SIZEX, vector< double >(SIZEY),vector< vector< double > >(SIZEZ));
3次元の場合、コンパイルエラーになります。
どこが間違えているのでしょうか?
92デフォルトの名無しさん:2005/05/28(土) 08:32:36
>>91
こうじゃないか?
vector<vector<vector< double > > > x(SIZEX, vector<vector<double > >(SIZEY, vector<double>(SIZEZ)));
93デフォルトの名無しさん:2005/05/28(土) 12:15:37
コンテナがクラスなのは失敗どころかむしろ歓迎すべきだろ。
ちょっとした開発環境ならメンバ関数の候補を出す機能くらい備えてる。
これが関数ベースだとそうは行かない。
特に関数テンプレートはそのパラメータが受け取れる型についてプログラマに殆ど情報を与えてくれない。

push_front( vec, val );

が正しいかどうかはコンパイルしてみないと判断できない。
STLの実装によっては問題なくこれを受け入れてしまうかもしれない。

むしろvector< bool >のほうがよっぽど大きな間違いだろう。
94デフォルトの名無しさん:2005/05/28(土) 12:34:50
どっちみち<algorithm>の関数類を使うからして
メンバ関数だけ候補出してもらってもさほどうれしくない
全部関数の方が、見た目の統一性があってよかったよ
95デフォルトの名無しさん:2005/05/28(土) 12:38:23
要件の記述がC++言語内で標準的に出来たらさぞ幸せだろうなぁ。
96デフォルトの名無しさん:2005/05/28(土) 20:57:26
標準など幻想
97デフォルトの名無しさん:2005/05/28(土) 21:06:08
>>95
D&Eにテンプレート引数に対する要件を記述するテクニクみたいなのが
載っていたよ
あくまでテクニクでありtipsだけど
98デフォルトの名無しさん:2005/05/28(土) 22:10:04
そろそろC++の次期仕様を作るべきだな。
Cとの互換性はそろそろ犠牲にしてもよし。
あとvector<bool>を思いついたバカをこの機会に処刑。
99デフォルトの名無しさん:2005/05/28(土) 22:29:53
そんなもん誰も使ってないんだから実害なし。
本からの知識をひけらかすのは楽しいものだが
100デフォルトの名無しさん:2005/05/28(土) 22:31:41
処刑確定だろ
101デフォルトの名無しさん:2005/05/28(土) 22:32:45
むしろstd::vector<bool>こそ知識をひけらかす為に作ったもの。
102デフォルトの名無しさん:2005/05/28(土) 22:43:50
とりあえず規格をさらっと見てみたところではコンテナの要素についての要求は
以下の通り。

・23.1-3 から要素の型は CopyConstrutible でかつ Assignable である必要がある。
・Sequence(vector, deque, list)については他になさそう。
・Associative container(set,map,multiset,multimap)については key の比較が必要
 だけど、同値は比較から導出するから必要ない(23.1.2-3)。
 テンプレートで指定してやれば、比較が operator < である必要はない。

無論、各メンバ関数では remove で operator == が必要、だとかさらに要求が
つく場合はあるけど。

で、関係ないけど恥ずかしながらポインタの比較について知らなかったことを晒してみる。
・同じオブジェクトを指している場合、同じ配列中の要素を指している場合以外に、
 同じ集成体(構造体等)のメンバを指している場合もポインタの比較が規定されている。・ただしアクセス指定子で分けられている場合を除く。
・C では規定外の場合は未定義、C++ では不定

んが、20.3.3-8 で
>For templates greater, less, greater_equal, and less_equal, the
>specializations for any pointer type yield a total order, even if
>the built-in operators <, >, <=, >= do not.
とされているため、ポインタを associative container などに突っ込むことができる、と。
逆に規格を厳密に解釈した場合、例えば list<T*> に対して sort() は意味のある結果を
返さないかもしれないが、sort(less<T*>) は意味のある結果を返すということになるね。

後、おまいら STL における比較は strict weak ordering が必要って知ってましたか?

>98
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96
vector<bool> はやめて別の名前にする方針みたいっすよ?
しかしま、豪快なタイトルですな。
103デフォルトの名無しさん:2005/05/28(土) 23:04:44
>>102
参考になった。乙。

>後、おまいら STL における比較は strict weak ordering が必要って知ってましたか?
当たり前だと思ってたんだが、何か意外な点でもあるのか?
104デフォルトの名無しさん:2005/05/29(日) 00:12:36
vector<bool>って何がおかしいの?
105デフォルトの名無しさん:2005/05/29(日) 00:16:40
>>104 >102のリンク先読め。
106デフォルトの名無しさん:2005/05/29(日) 00:31:44
意味わかりません
boolの配列は作れないということですか?
107デフォルトの名無しさん:2005/05/29(日) 00:47:44
>>106 >102のリンク先読め。
108デフォルトの名無しさん:2005/05/29(日) 08:17:25
俺はvector<bool>::pointerとvector<bool>::referenceやそれのconst版が
実際にはポインタや参照ではないことがまずいと読んだが。
109デフォルトの名無しさん:2005/05/29(日) 09:08:43
vector<bool> vec;
vec.push_back(true);
bool* p = &vec[0];
ができないわけだな
110デフォルトの名無しさん:2005/05/29(日) 20:10:45
>103
いえ、結果からすれば当たり前ではあるんですが無意識のうちに使っていたもので。
一度 strict weak ordering というのをおいてから equivalence を導出して、最終的に同値類での strict な全順序を
持ってくるところと、
・comp(a,a) は常に false
・comp(a,b) && comp(b,c) ならば comp(a,c)
・equiv(a, b) を !comp(a,b) && !comp(b,a) として equiv(a,b) && equiv(b,c) ならば equiv(a,c)
という 3 つの制約で定義しているのが面白い、と。
確かに、これで comp(a,b) と comp(b,a) が同時に成立しない、とか最終結果が出てくるんですよね。
後、単純に比較させるだけなら ≦ を使っても良かったと思うんですけど、そうしなかったのは
equality と equivalence とを区別する意味からなんだろうなぁとか。
と思ったら、既にそんなことを書かれてる人がいますね。
ttp://d.hatena.ne.jp/Cryolite/20040529
111デフォルトの名無しさん:2005/05/30(月) 08:49:21
112デフォルトの名無しさん:2005/05/31(火) 12:32:37
ifstreamのバイナリモードで、テキストファイルをget()で1文字ずつ読んでいます。
なぜか、eofの前に余計な1バイトをget()してしまいます。
テキストファイルをバイナリエディタで開いて確認しても、そんな文字はないのですが
どういうことでしょうか?
113デフォルトの名無しさん:2005/05/31(火) 12:39:44
>>112
バイナリモードならEOFだろ。
114デフォルトの名無しさん:2005/05/31(火) 12:41:40
>>112
というか、一度でもいいから、テキストファイルをバイナリエディタで
覗いてみろと小一時間。
115デフォルトの名無しさん:2005/05/31(火) 12:55:52
>>113
ifstream.eof()の前に、get()が"4294967295"という値を取得してしまうんです。
116デフォルトの名無しさん:2005/05/31(火) 12:59:00
>>15
それ、-1(EOF)だって。
117デフォルトの名無しさん:2005/05/31(火) 13:01:28
>>115
どうしてもeof()を使いたいなら、istream& istream::get(char& c); を
使った方がいいよ。ストリームがeofになったら、cの値を捨てればいいから。
118デフォルトの名無しさん:2005/05/31(火) 14:46:38
>>116

よく、

while(!in.eof()){
c = in.get();

..色々処理
}

ってソース見るけど、

while(!in.eof()){
c = in.get();

if(!in.eof()){
..色々処理
}
}

にしなきゃいけないの?(getして値を使う前にeofチェック??)
とりあえず上記で解決したようですが。
119デフォルトの名無しさん:2005/05/31(火) 14:59:03
>>112-118
お前らが語っているそれは STL ではない。
120デフォルトの名無しさん:2005/05/31(火) 15:21:36
>>118
117の言うように、
char c;
while(!in.get(c).eof()){
  // 色々処理
}
とするのがわかりやすいんじゃないか。
121デフォルトの名無しさん:2005/05/31(火) 15:52:23
>>119
スマン。すぐ終わる。
>>118
CもC++も、値を読み込んで初めてEOFかどうか判断できる。
その書き方はBASICのそれだ。

istream& istream::get(char& c);は返却値がistreamなんだから、
operator !() を使って、

while (!in.get(c)) {
なんかの処理
}

とやるのがスマートだろう。

これは余談だが、C++でfstream関連についてあまり分かってない人が
多い。多分cstdioを使う方が速いからだろうが、大学で情報処理を
とってきた人でもfstreamはさっぱり・・・・という人がほとんどだ・・・orz
122デフォルトの名無しさん:2005/05/31(火) 17:31:50
俺もstream系はさっぱりだ。
多分抽象化し過ぎなんだよな。
a << "aaa" << "bbb" << endl;
これはC系言語C++にとって異質。
123デフォルトの名無しさん:2005/05/31(火) 17:37:26
>>122
んな事ねーーーーー
慣れの問題。
124デフォルトの名無しさん:2005/05/31(火) 19:47:24
性能が(少なくとも)昔は悪かったとか
クラス階層が複雑だとか
ものによっては入力系の先読みがウザいとか
まあ嫌う理由はいろいろあるな

複雑なフォーマットとか、printf系では一発でも
iostreamではゴテゴテとしたマニュピレータが必要になるし。

125デフォルトの名無しさん:2005/05/31(火) 20:21:56
mingw-gccでサイズが一気に200KB超えるのが嫌だな、printfだけなら10KBですむのに、
iostreamは仮想継承で全部の階層の全部の関数がリンクされるそうだから。
boostのlexical_castやformatもstream& operator>>(stream& o, ...)を使ってるのでデカデカになる。
126デフォルトの名無しさん:2005/05/31(火) 21:23:28
char c;
while (in.get(c)) {
 処理
}

だと思うのだが。
127デフォルトの名無しさん:2005/05/31(火) 22:07:48
>125
ケチケチすんなよ
128デフォルトの名無しさん:2005/05/31(火) 23:32:43
>>125
MinGW+STLportなら、-D_STLP_USE_DYNAMIC_LIB をコンパイルオプション
に指定して主要部分をDLLに追い出せば、プログラムをたくさん作っても、
ほとんどCと変わらんよ。

速度的には、そりゃあ多量のデータをファイルに書いたり読んだりすれば遅いけど、
小さなデータならあっという間だし、現時点でcstdioを使う必要はあまりなくなって
来たなあ。意味があるとすれば、ベンチマーク時くらいかね。
129デフォルトの名無しさん:2005/05/31(火) 23:42:24
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
130デフォルトの名無しさん:2005/06/01(水) 00:07:23
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
131デフォルトの名無しさん:2005/06/01(水) 00:21:20
MS本社の方にむかって3回土下座をすると直ります。
MS本社の場所はサポートセンターに問い合わせてください。
132デフォルトの名無しさん:2005/06/01(水) 07:22:41
#include "stdafx.h"

後氏ね。
133デフォルトの名無しさん:2005/06/01(水) 07:42:29
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
134デフォルトの名無しさん:2005/06/01(水) 08:28:57
100過ぎてやらんでいい
135デフォルトの名無しさん:2005/06/01(水) 17:29:57
ていうかスレ違うし
136デフォルトの名無しさん:2005/06/01(水) 21:10:54
しかし住人は違わなかったわけだw
137デフォルトの名無しさん:2005/06/01(水) 21:38:56
sizeof(std::size_t)は32ビット処理系で4,64ビット処理系で8・・・・以下略
は保証されているんだっけ?

ついでにsizeof(char)は1で8ビットは保証されているんだっけ?
138デフォルトの名無しさん:2005/06/01(水) 21:47:13
言語規格での保証ならsizeof(char) == 1だけ
139デフォルトの名無しさん:2005/06/01(水) 21:52:26
std::size_tはたしかsizeof演算子が返す値の型と定義されている。
charは8ビット「以上」でなければならない。(<climits>のCHAR_BITS)
8ビットでなくても良いということだな。
140デフォルトの名無しさん:2005/06/01(水) 23:54:09
いや、俺の環境では -1 より小さいらしい。

std::cout << (sizeof(char) < -1) << std::endl;
141デフォルトの名無しさん:2005/06/01(水) 23:58:20
>>140 つまらん。
142デフォルトの名無しさん:2005/06/02(木) 00:39:12
つ default promotion rule
143137:2005/06/02(木) 16:19:17
レスサンクス

・・・numeric_limitsで場合わけするか。
144デフォルトの名無しさん:2005/06/03(金) 09:29:18
独自のメモリー管理機能をもったライブラリーを使ってる。
(画像処理のライブラリー)

STLのデフォルトアロケータと何か問題を起こしてるみたいだ。

std::vector<char> newVec(10)

でこける

なんとかならないのか
環境はVC++.net2003
145デフォルトの名無しさん:2005/06/03(金) 09:43:17
>>144
STLport入れてみ。
146デフォルトの名無しさん:2005/06/03(金) 09:44:30
自分でアロケータ書け
147デフォルトの名無しさん:2005/06/03(金) 09:59:04
>>144
boost::poolでも使ってみろ。
148デフォルトの名無しさん:2005/06/03(金) 11:21:38
>>144 情報不足。
149デフォルトの名無しさん:2005/06/03(金) 12:25:02
> STLのデフォルトアロケータと何か問題を起こしてるみたいだ。
糞だなw
150デフォルトの名無しさん:2005/06/03(金) 12:28:01
>>144
多分、その「独自のメモリー管理機能」にバグが残っていると見た。
STLのせいにする点で、糞。
151デフォルトの名無しさん:2005/06/03(金) 13:23:41
STLに干渉しようしている時点でやばい
152デフォルトの名無しさん:2005/06/03(金) 13:40:29
2次元のvector
vector< vector<  int > > vwork(X, vector<int> (Y))
でYの部分をなぜ(Y)にしないと、コンパイルエラーが起きるのでしょうか?
153デフォルトの名無しさん:2005/06/03(金) 13:44:25
ちなみにその画像処理ライブラリーというのは
OpenCVとIPL

IPLは基本部分がバイナリーで与えられてるので改造できない。
アロケーターにバグあっても対処できね
154デフォルトの名無しさん:2005/06/03(金) 16:23:24
>>152
vector<int>(Y) がコンストラクタだと気付いてないとしても
vector<int> Y が文法的におかしいことには気付いて欲しい。
155デフォルトの名無しさん:2005/06/03(金) 23:59:42
>>144
そもそもなぜこれでこけるのかが分からない。
operator newの置き換えでもやってるんだろうか?
156デフォルトの名無しさん:2005/06/04(土) 00:02:36
>>155
>>144の頭がこけてるんだよ。
157デフォルトの名無しさん:2005/06/04(土) 00:17:55
vector<Base> に Base から派生したclass を挿入するのは
文法的に禁止されているのでしょうか?
class Base
{
public:
Base(){}
};

class Derived : public Base
{
int hoge_;
public:
Derived(int hoge):hoge_(hoge){}
int test() {return hoge_;}
};

int main()
{
Derived a(3);
vector<Base> b_list;
b_list.push_back(a);
Derived& b = static_cast<Derived&>(b_list[0]);
cout << b.test() << endl;
}
上のコードをコンパイル・実行すると 3 が出力される事を
期待しているのですが不定値が出力されてしまいます。
(環境: Intel compiler 8.1 Windows版)
上の例は文法的に間違っているかどうか、詳しい方がいらっしゃいました
らご教授ください。m(__)m
158デフォルトの名無しさん:2005/06/04(土) 00:22:14
文法的には間違っちゃいないが(コンパイル通ってるんだし)
常識的には間違っている。スライシングが起こるから。
vector じゃなくても、
Base b = Derived();
とかやると何が起こるか考えてみよう。
159デフォルトの名無しさん:2005/06/04(土) 00:22:48
>>157
vector<Base>に何か入れようとするとコピーコンストラクタが発生して
Derivedを入れようとしてもBaseのオブジェクトとして格納される。

こういうときにはBase *とかboost::shared_ptr<Base>をvectorに入れるようにすれば良い。
160157:2005/06/04(土) 00:31:38
>>158
>>159
お二人とも素早いレス、どうもありがとうございます。
大いに勉強になりました。なるほど、スライシングですね。
Base* を利用してみる事にします。
とても助かりました。ありがとうございます!
m(__)m m(__)m m(__)m m(__)m
161デフォルトの名無しさん:2005/06/04(土) 22:27:34
>>1
wikipediaのリンク外さない?
162デフォルトの名無しさん:2005/06/04(土) 22:30:40
>>16
次スレはないのでそんな心配は無用です。
163162:2005/06/04(土) 22:31:24
アンカーミスった。
×>>16>>161
164デフォルトの名無しさん:2005/06/04(土) 22:52:56
>>129
それがdllのメリットじゃん。
なにか疑問でも?
165デフォルトの名無しさん:2005/06/05(日) 00:15:30
>>12
でもVC以外のSTLの準拠率が話題に上ることはあまりないな…
他は全て完全準拠してるのか!?
166デフォルトの名無しさん:2005/06/05(日) 00:44:45
>>164
テンプレにマジレスカコワルイ!
167デフォルトの名無しさん:2005/06/05(日) 04:47:23
>>164
半年ROMれ
168デフォルトの名無しさん:2005/06/05(日) 11:14:49
VCのシリアライズを使うと
クラスの内容をファイルに簡単に書き出せるけど

stlのコンテナにシリアライズはできないの?
169デフォルトの名無しさん:2005/06/05(日) 11:33:08
>>168
つ[boost::Serialization]
170デフォルトの名無しさん:2005/06/05(日) 11:49:48
>>169
thx
171デフォルトの名無しさん:2005/06/05(日) 13:26:17
boostってstl?
172デフォルトの名無しさん:2005/06/05(日) 13:28:12
>>171 ちがうよ。
173デフォルトの名無しさん:2005/06/05(日) 14:05:29
stringのc_str()が返すポインタは、いつまで有効なのでしょうか?
またこの関数を使う上で注意点ってありますか?
174デフォルトの名無しさん:2005/06/05(日) 14:14:09
>>173
>stringのc_str()が返すポインタは、いつまで有効なのでしょうか?
次にそのstringの非constメンバ関数を呼ぶまで。
175デフォルトの名無しさん:2005/06/05(日) 14:46:29
string str = hogehoge();
const char* cp = str.c_str();
if (str[0] == '$') {

とやったら、3行目でおじゃんかよ
ほんとかよ?
176デフォルトの名無しさん:2005/06/05(日) 14:47:40
>>175
ほんとです。
COWで実装されてたらあたりまえだろう。
177デフォルトの名無しさん:2005/06/05(日) 14:51:56
ふーん
ま、Writeしてないのに、勝手にCopyしてリソースを浪費するのは
実装として話にならんと思うが・・・
178176:2005/06/05(日) 14:57:58
>>177
ごめん。比較が代入に見えてた。
「あたりまえ」ってのは言い過ぎだな。
179デフォルトの名無しさん:2005/06/05(日) 15:11:10
非constメンバ関数が呼ばれた時点でWriteされたと見なすしかないだろ。
operator[]がプロキシを返すことは許されてないんだし。
180デフォルトの名無しさん:2005/06/05(日) 15:12:06
operator=はconst関数だな
181180:2005/06/05(日) 15:12:49
ド間違った>>180なし
182デフォルトの名無しさん:2005/06/05(日) 15:13:11
C++の言語定義上はね
その定義がなんとも不自然だなあと思うだけで
183デフォルトの名無しさん:2005/06/05(日) 15:13:33
まあ、最近は多くのbasic_stringが
COWを使わなくなったからどうでもいいんだが。
184デフォルトの名無しさん:2005/06/05(日) 15:34:27
こんなの見つけた。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263
ここで修正されている 21.3/5 には「要素に対する参照、ポインタ、イテレータ」が無効になるような
basic_string の使われ方が列挙されている。
ここと、 21.3.6/2 に書かれている c_str() の戻り値が無効になるタイミングが
食い違っているのがおかしいような気がする。
185デフォルトの名無しさん:2005/06/05(日) 15:38:51
>184
実装が終端に'\n'を持つかどうかの自由度を残したんじゃないですかね?
186デフォルトの名無しさん:2005/06/05(日) 15:39:53
ちなみに

template<class T>
T const &as_const(T &x){ return x; }

char const *cp = str.c_str();
if(as_const(str)[0] == '$'){

は安全ですね.
187デフォルトの名無しさん:2005/06/05(日) 23:57:32
c_str()のポインタはstrdupでコピーしておくのが一番安全。
188デフォルトの名無しさん:2005/06/06(月) 00:08:04
>>187
なんでやねん。stringに代入したりすると、ポインタが変わったりするぞ?
189デフォルトの名無しさん:2005/06/06(月) 00:18:00
>>187
そんなことするぐらいなら string をコピーしとけばいいだろ。
190デフォルトの名無しさん:2005/06/06(月) 00:39:31
>>187
釣られてみる。
strdup()は、「標準に含まれていない」という理由だけでも使う価値はない。
百歩譲ったとしても、「strdup()が確保するメモリの開放方法はない」という
点においてもまた、使うべきでない。

昔からこんな関数考えたやつの気が知れんのだが。
191デフォルトの名無しさん:2005/06/06(月) 00:41:42
>>190
> strdup()が確保するメモリの開放方法はない
は?free()すればいいのでは?

> 昔からこんな関数考えたやつの気が知れんのだが。
char * p = malloc(strlen(s)+1);
strcpy(p, s);
と毎回書くのが面倒だったからでしょ。
192デフォルトの名無しさん:2005/06/06(月) 00:48:23
>>191
規格にない以上、strdup()が確保したメモリがfree()で開放されるとは
保証されていない。
193デフォルトの名無しさん:2005/06/06(月) 00:53:23
>>192
規格に無い関数の仕様を規格で判断してどないすんだっちゅーの。
「CreateWindowは規格に無い以上、その動作は保証されていない」
とか言うのかよ。

現実問題として、free()で開放できないstrdup()の実装なんぞ
見たことがないぞ。
194デフォルトの名無しさん:2005/06/06(月) 00:53:35
非標準ライブラリなんだから非標準のドキュメントを参照するべきだろ。
195デフォルトの名無しさん:2005/06/06(月) 00:59:23
>>193
>「CreateWindowは〜」
その通り。
>現実問題
書いてないことは決まっていない。

>>194
その通り。
196デフォルトの名無しさん:2005/06/06(月) 01:05:14
なら規格厳密合致の清く正しい世界で生きてくれや
俺はGUIやsocketやDBの存在する現実の世界で生きるから
197デフォルトの名無しさん:2005/06/06(月) 01:06:58
>百歩譲ったとしても、「strdup()が確保するメモリの開放方法はない」という

言い切っちゃうところがすごいねw
198デフォルトの名無しさん:2005/06/06(月) 01:15:08
>>197
メモリの開放方法ってどこに書いてあるの?
199デフォルトの名無しさん:2005/06/06(月) 01:16:24
>>198
たとえばこんな風にだ(これはfreeBSDのmanからの引用)

The strdup() function allocates sufficient memory for a copy of the
string str, does the copy, and returns a pointer to it. The pointer may
subsequently be used as an argument to the function free(3).
200デフォルトの名無しさん:2005/06/06(月) 02:02:52
規格に無いということはstrdup()は独自のメモリ管理をしているに決まっている。
だからfree()できない。
201デフォルトの名無しさん:2005/06/06(月) 02:04:03
なんだかわからんが、string::c_str()じゃだめなのか?
202デフォルトの名無しさん:2005/06/06(月) 02:06:48
>>200 妄想イクナイ。ドキュメント嫁。
203デフォルトの名無しさん:2005/06/06(月) 02:11:38
>>200
はいはい、規格に無いんだったら free() できる仕様かもしれないし、そうでないかもしれないし、
あんまり短い文章で論理破綻しないでくれよ。
204デフォルトの名無しさん:2005/06/06(月) 02:14:43
>>197
規格厳密合致がこんだけ好きなくせにどうして規格にないことが言い切れるんだろうね
>>200
規格にない関数は独自のメモリ管理をしなくてはならないなんて規格には書いてない。
205デフォルトの名無しさん:2005/06/06(月) 02:26:33
皆さんなんか物凄くレベルが低くなってますんでこの辺でdupの話題は打ち切りということで。
206デフォルトの名無しさん:2005/06/06(月) 02:41:17
そうだな。dup()なんて規格に書いてねーからそれがfile descripterを
複製してくれるとは限らないしな。
207デフォルトの名無しさん:2005/06/06(月) 02:43:40
>>206
餌乙
208デフォルトの名無しさん:2005/06/06(月) 02:50:10
今まで標準だと信じて使ってきたstrdup()が、ここに来ていきなり
否定されてファビョっている奴。情けねー
209デフォルトの名無しさん:2005/06/06(月) 02:53:56
まあ一つ言えるのは、strdup()はSTLとは何の関係も無いことなのだが。
210デフォルトの名無しさん:2005/06/06(月) 02:54:10
>>208
ちゃんと読もうねw
211デフォルトの名無しさん:2005/06/06(月) 02:59:01
>>210
余程悔しいようだな。strdup()は 非 標 準 で す。
212デフォルトの名無しさん:2005/06/06(月) 03:06:23
>>211
よほど日本語が読めないようですが、誰もstrdup()を否定してません。
ファビョるっていってるくらいだから、かの国由来なのかな。
213デフォルトの名無しさん:2005/06/06(月) 03:21:56
>>212
よく読め。strdup()なんかを薦めてしまった>>187
strdup()をものすごい勢いで否定してる>>190
それを肴に悪乗りしてるその他大勢がいるだけだから。
214デフォルトの名無しさん:2005/06/06(月) 03:26:35
そうですよ。今度はちゃんと読めましたね。
215デフォルトの名無しさん:2005/06/06(月) 03:30:36
>>211 != >>213
なんだが、わかってるのかな。
216デフォルトの名無しさん:2005/06/06(月) 03:32:00
せっかくだから調べてみたよ。strdup() は SVID 規定だそうな。
第4版だけど strdup() で確保される領域は malloc() で確保されると書いてあるね。
ttp://www.caldera.com/developers/devspecs/
>System V Interface Definition Fourth Edition
>Volume 1a
>string(BA_LIB)
217デフォルトの名無しさん:2005/06/06(月) 03:40:12
月の輪クマの映像まじびびった。宇宙人が轢かれたのかとおもた。
218デフォルトの名無しさん:2005/06/06(月) 03:43:45
>>217
くあしく
219デフォルトの名無しさん:2005/06/06(月) 03:46:44
>>218
どっかの高速道路の事故現場の中継で、つきのわぐまの轢死体が写ってた。
220デフォルトの名無しさん:2005/06/06(月) 05:11:55
strdupはX/OPENらしい
221デフォルトの名無しさん:2005/06/06(月) 05:27:10
222デフォルトの名無しさん:2005/06/06(月) 07:12:34
COWってCopy On Writeか。
牛が思い浮かんで笑えたんで。
223デフォルトの名無しさん:2005/06/06(月) 10:16:55
>>222
実際、COW が嫌いな人は Mad COW Disease なんて呼んだりもする。
224デフォルトの名無しさん:2005/06/06(月) 10:25:48
ライスおばさんの顔が浮かんだ
225デフォルトの名無しさん:2005/06/06(月) 16:22:59
copy-on-write って書くから無問題
226デフォルトの名無しさん:2005/06/07(火) 02:49:49
STLとあまり関係のない牛の話をするスレはここですか。
227デフォルトの名無しさん:2005/06/07(火) 13:21:52
違います
228デフォルトの名無しさん:2005/06/07(火) 13:59:58
牛は標準ですか、非標準ですか。
229>>228:2005/06/07(火) 14:32:11
標準は狂牛病かどうかは気にしない。
230144:2005/06/07(火) 18:43:15
原因判明
iplでは
画像格納してるの先頭のポインターのアドレスがなぜか
変動する
231デフォルトの名無しさん:2005/06/07(火) 20:57:18
境界判定を省略するために
バッファを大きめにとって
バッファ先頭+画像横幅+1あたりにポインタを移動してるとか
232デフォルトの名無しさん:2005/06/08(水) 15:09:38
そういえばゲートウェイって日本市場復活したんだっけ?
233デフォルトの名無しさん:2005/06/09(木) 20:43:36
std::vector<float>の中身が
ちゃんとメモリーのアドレスどおりに並んでない場合ってあるの?

std::vector<float> vf(10)
float *p_float= vf..begin()
なら
p_float[0]==vf[0]
p_float[1]==vf[1]
p_float[2]==vf[2]
...

だよね? ならない場合ってあるの?
234デフォルトの名無しさん:2005/06/09(木) 20:46:42
>>233
std::vector<bool>を除くstd::vector<>は、配列と同じメモリレイアウトに
なっていることが保証されている。
begin()の前のドットは1つな。
235デフォルトの名無しさん:2005/06/09(木) 21:21:19
>>233
アドレス通りに並んでいることは保証されているけど、
vector<float>::begin()が返す型であるvector<float>::iterator型が
float型のtypedefである保証は無い。

float *p_float= &vf[0];
とやらなきゃダメ。
236デフォルトの名無しさん:2005/06/09(木) 21:57:23
&*vf.begin()とか&vf.front()とか方法はいろいろ。
237デフォルトの名無しさん:2005/06/09(木) 22:06:18
まさかとは思うが、begin()を取り出した後にpush_back()とかerase()とかしてないよな?
238デフォルトの名無しさん:2005/06/09(木) 23:15:55
サイズ変更しない関数呼ばなければ、中身のアドレスは変わらないことが保証されているぞ。
プログラミング言語C++嫁。
239デフォルトの名無しさん:2005/06/09(木) 23:22:06
> サイズ変更しない関数呼ばなければ
サイズ変更する関数呼ばなければ

の間違いか
240デフォルトの名無しさん:2005/06/09(木) 23:49:49
あ、スマソ
241デフォルトの名無しさん:2005/06/10(金) 13:56:22
こんにちは

質問ですが、
std::wstring wstr;

wstr.c_str()はwchar_t*を返しますが、
char*(マルチバイト文字)を返す関数、または方法はありますか?
できれば、一つの関数でchar*を得たいのですが。

よろしくお願いいたします。
242デフォルトの名無しさん:2005/06/10(金) 13:56:52
一応あげときます。
243デフォルトの名無しさん:2005/06/10(金) 14:03:53
>>241
DBCS -> MBCSに変換したいっつーことか?
244241:2005/06/10(金) 14:14:16
>>243
いえ、変換の仕方は知ってますが、
std::wstring wstr;
を関数一つの呼び出しでchar*を得られるものがあるのかどうかを知りたいだけです。
たぶん無いと思いますが。
245デフォルトの名無しさん:2005/06/10(金) 14:20:36
>>244
std::wstringにそういうメンバ関数はない。
246デフォルトの名無しさん:2005/06/10(金) 15:34:25
qsortにstd::vectorの配列先頭ポインタを渡したいのですが、
得る方法はありませんか?
247デフォルトの名無しさん:2005/06/10(金) 15:40:38
&v[0]

すでにFAQだな。
248デフォルトの名無しさん:2005/06/10(金) 16:18:12
まあいいだろ。話題ないし。
249デフォルトの名無しさん:2005/06/10(金) 16:40:21
とは言え、11コ上のレスも読まない/読めないなんてのは。
250デフォルトの名無しさん:2005/06/10(金) 18:11:37
基本的にqsortでなくsort使うべきだが
251デフォルトの名無しさん:2005/06/10(金) 18:55:48
vectorを使っておきながらqsort使う理由はないわなあ
252デフォルトの名無しさん:2005/06/10(金) 18:58:40
コンストラクタが重いからという理由以外はな
253デフォルトの名無しさん:2005/06/11(土) 11:30:14
ベクターをソートするときってコピーコンストラクタが呼ばれるんだよね?
vector<HOGETYPE*>でなく、こんなvector<HOGETYPE>だったら、かなり痛いよね。
class HOGETYPE{
 ...
 hoge& operator = ( const hoge& right ) {
  if( ptr ) { delete ptr; ptr = new float[NUM]; memcopy( ptr, right.ptr, NUM*sizeof(float)) }
 }
 float* ptr;
};
vector<HOGETYPE> buffer;

おまけに、
swap( T& a, T& b ) { T temp = a; a = b; b = temp; }
なので、1回の並べ替えでコピーコンストラクタが3回も呼ばれる。
254デフォルトの名無しさん:2005/06/11(土) 11:33:02
↑間違い
class HOGETYPE{
 ...
 hoge& operator = ( const hoge& right ) {
  if( ptr ) { delete ptr; }
  ptr = new float[NUM]; memcopy( ptr, right.ptr, NUM*sizeof(float)) }
 }
 float* ptr;
};
255デフォルトの名無しさん:2005/06/11(土) 11:34:39
代入できるクラスを書くときは必ずstd::swapを特殊化するとか。
256デフォルトの名無しさん:2005/06/11(土) 11:35:53
>>253
swap を特殊化すれば回避できるだろう。
257デフォルトの名無しさん:2005/06/11(土) 12:39:26
>>253
あれだよな、vector<HOGE*>だと関数オブジェクト書くのがめんどいんだよな。
vector<HOGE>だとHOGEの実装をハンドル持つようにして=の最適化かvectorっぽくswapの特殊化だよな。

>>255
まじで全部特殊化してんの?
258デフォルトの名無しさん:2005/06/11(土) 16:15:51
>>254 関係ない部分だが、 delete ptr の前の if( ptr ) は冗長だぞ。
259デフォルトの名無しさん:2005/06/11(土) 17:28:12
>>255
>>256
std::swapを特殊化してもそれらがstd::sortから呼ばれる保証はどこにもないですよ.
それにクラステンプレートの場合std::swapを特殊化することができないです.
260デフォルトの名無しさん:2005/06/11(土) 17:39:03
んな苦労せずに、qsort使えよ
261デフォルトの名無しさん:2005/06/11(土) 17:47:56
うーんなるほど。
std::memcpyをコピーコンストラクタの代わりに用いるのは
C++では大抵の場合間違いだが、
この場合はそれでいいし効率も勝る訳か。特殊例だな。
262デフォルトの名無しさん:2005/06/11(土) 17:48:58
>>260
やだよ。ソート基準が関数ポインタになっちゃうじゃん。
263デフォルトの名無しさん:2005/06/11(土) 18:12:55
>>261
どの場合?
264261:2005/06/11(土) 18:18:34
>>263
いやその、上の話に感心しただけなんだが、
実際にはオブジェクトのコピーではなくswapをしたい場合
265デフォルトの名無しさん:2005/06/11(土) 18:27:02
>>262
じゃあ、listに入れてsortしろ
特殊化とかアホなことするの無意味
266261:2005/06/11(土) 18:31:05
>>264
どこからmemcpyの話が出てきたんだ?
267デフォルトの名無しさん:2005/06/11(土) 18:35:19
>>265
listはマージソートが出来るから、quick_sortの約1/2程度の速度でソートできる。
そのため、listにはメンバ関数にsort()が用意されている。

その他には、make_heapでヒープを作っておき、sort_heapでソートするという変態技
もあるが、RandomAccessIteratorを必要とするので、listには使えない。
268261:2005/06/11(土) 18:36:11
>>266
おまえは偽者だな!!
おれが本物の>>261だ!!

とかいうのはさておき、qsort()ならswapはmemcpy()つかてるでしょ
と思ったの。
でも、今VC++のCRTのソース見たら、swapするのにmemcpy()つかわず
なぜか手動でバイトコピーしてるな。
なんでだろう。
269デフォルトの名無しさん:2005/06/11(土) 18:38:33
>>267
んな話じゃなくて、listならコンストラクタ走らねえってこと
270デフォルトの名無しさん:2005/06/11(土) 18:41:51
いやvectorが向いてるかlistが向いてるかって他の要素も絡むし
重要だから
sort()でコピーコンストラクタを走らせないためだけにlistを
選ぶってのはどうかと
271デフォルトの名無しさん:2005/06/11(土) 18:44:44
じゃあ、qsortだな
あるいは、無理やり同サイズの構造体にでもキャストして、sortを呼ぶか
272デフォルトの名無しさん:2005/06/11(土) 18:48:59
swapの特殊化で済むならそれで良いんじゃねえの?
保障はないみたいだが。
273デフォルトの名無しさん:2005/06/11(土) 18:54:24
swap以外にコンストラクタが走らないという保証もないだろ
274デフォルトの名無しさん:2005/06/11(土) 19:20:11
つーか この問題は大規模オブジェクトのコストってやつで。
後置++とか+とかの演算子の一時オブジェクトのコピーについて、最適化としては=のコストを検討すること。
じゃねーの?
275デフォルトの名無しさん:2005/06/11(土) 19:26:40
>>274
日本語壊れててよくわからない。
276デフォルトの名無しさん:2005/06/11(土) 22:54:50
>>258
世の中にはnewしていないものをdeleteしたくない人だって居る。
277デフォルトの名無しさん:2005/06/11(土) 22:57:07
世の中には↑のようなボケも居るんだな
278デフォルトの名無しさん:2005/06/11(土) 23:15:17
>Using delete on a pointer to an object not allocated with new gives unpredictable results.
>You can, however, use delete on a pointer with the value 0.
ISOの規格は知らんが、MSDNにはこうあるな。
勉強になったな俺もお前も
279デフォルトの名無しさん:2005/06/11(土) 23:21:09
if (p) delete p の方が、null時には速いだろうってことでないの?
280デフォルトの名無しさん:2005/06/11(土) 23:27:09
↑今日一番のボケ発言だな
281デフォルトの名無しさん:2005/06/11(土) 23:31:09
>>279
delete内でもNULLチェックぐらいやっているって。
282デフォルトの名無しさん:2005/06/11(土) 23:36:32
NULL時に早くてもNULLばっかわたるわけでもない品
283デフォルトの名無しさん:2005/06/11(土) 23:39:50
>>281
中でやるより外でやったほうが速いわな
284デフォルトの名無しさん:2005/06/11(土) 23:46:51
>>283
最適化で同じになるだろ。
285デフォルトの名無しさん:2005/06/11(土) 23:50:01
最適化効かなくても全然変わらなそう
286デフォルトの名無しさん:2005/06/12(日) 00:08:31
VCだと最適化後の delete 0 でさえ、関数呼んでるという話を聞いたが
287デフォルトの名無しさん:2005/06/12(日) 00:10:35
int* i=new int;
delete i;
delete i;
てやったら2回目のdeleteで堕ちた。。。
288デフォルトの名無しさん:2005/06/12(日) 00:12:11
でも、
if(p) delete p;
にしといたほうが、おばかなコンパイラには優しそうだ。
289デフォルトの名無しさん:2005/06/12(日) 00:14:13
冗長っても行数が増えてるわけじゃないし。
プログラマの気持ちが伝わってくるのはいいんじゃね?
大勢に影響は無いのは事実だし。
290デフォルトの名無しさん:2005/06/12(日) 00:14:46
>>253 の例だけど、
・コピーコンストラクタの話なのに、なぜ HOGETYPE(const HOGETYPE&)
ではなく operator=( const hoge& right ) をあげているのでしょう?
・デフォルトコンストラクタには触れてないけど ptr は NULL に初期化なのか、
ptr = new float[NUM] なのかどっちのつもりでしょう?
・delete ptr ではなく delete [] ptr ではないでしょうか?
291デフォルトの名無しさん:2005/06/12(日) 00:27:32
>>287
そりゃそうだ。
deleteはデストラクタを呼んでポインタの指す領域を解放するだけで、
ポインタ変数の値を0にしてくれはしない。
292デフォルトの名無しさん:2005/06/12(日) 00:35:55
deleteしていいポインタかどうかを確認するには本来
null pointerかどうかのチェックでは不完全であって、deleteしちゃいけない
ケースは山のようにある
そして移植性の高い方法では、完全なチェックは事実上不可能だ

そういった中でnull pointerかどうか「だけ」をチェックするのは意味がないし、
そもそもnull pointerをdeleteするのは安全であることが
規格で保証されている以上、間抜けなコードだと言われても仕方が無かろう
293デフォルトの名無しさん:2005/06/12(日) 00:40:20
>>287
ISO/IEC 14882:1998 5.3.5 Delete -4
[Note: the value of a pointer that refers to deallocated storage is indeterminate.]
294デフォルトの名無しさん:2005/06/12(日) 00:57:21
んーでも、0だけは例外ね♪的な仕様の方が
本流から外れてる気がしないでもないが。
例えば、あるクラスがあってコンストラクタでnewして
デストラクタでdeleteするような設計だったならば
delete内のNULLチェックがそもそも冗長ってことになる。
まあ仕様で決まってるんだから、ウダウダ言っても仕方ないんだけれども。

>null pointerかどうかのチェックでは不完全であって、deleteしちゃいけない
>ケースは山のようにある
そんなケースある?
295デフォルトの名無しさん:2005/06/12(日) 01:01:23
>>294
deleteしていいのは
newで確保されて、
まだ開放されておらず、
もう誰も使っていないポインタだけ
だろ

他のポインタは全部deleteしちゃだめ
296デフォルトの名無しさん:2005/06/12(日) 01:34:29
int* i=NULL;
i=new int[ 100];
:
:
if(i) delete [ ] i;
i=NULL;
:
:
ってやってるほうが精神的に落ち着く自分がいる。
っていうか、ポインタ変数ってNULLで初期化しておくのが
定石かとおもたら違うの?
297デフォルトの名無しさん:2005/06/12(日) 01:38:57
オレはコーディングの際、ポインタが未使用のときはNULL、
メモリを指しているときは!NULLであるということを徹底してる。
だから騒然、最初にポインタ変数宣言するときはNULLで初期化するし、
処理の途中でdeleteしたら必ずNULLを入れるようにしている。
deleteしっぱなしだと、使いまわしているポインタだと、
わけわからなくなるから、これはやめられない。
298デフォルトの名無しさん:2005/06/12(日) 01:40:01
例えば、windows+DirectXのようなシングルデバイス,マルチスレッドだと以下のようなメソッドの構成になりがちだし、それぞれのメソッドが必ず一定の順序で呼ばれる保証も無い。というかそれを期待してはいけない。
したがって、NULLでポインタはinvalidであるという約束事にしておく必要がある。
HOGETYPE::HOGETYPE() { Resume(); }
HOGETYPE::~HOGETYPE() { Suspend(); };
void HOGETYPE::suspend() { if( ptr ) { delete[] ptr; ptr = NULL;} }
void HOGETYPE::resume() { if( ptr == NULL ) { ptr = HOGETYPE[size]; }
299デフォルトの名無しさん:2005/06/12(日) 01:41:54
ちゃんと自分でポインタ管理してますよ、って
ソースでアピールする意味でもif(p) delete p;ってやるな。
俺ならだけど。
300デフォルトの名無しさん:2005/06/12(日) 01:44:19
すごい勢いの自演だなぁ
301デフォルトの名無しさん:2005/06/12(日) 01:44:35
>>296-297
0で初期化すると、実は2度deleteしているような分かりにくいバグを
発見するのが難しくなる。
一方で、0で初期化しないと、0で初期化していたときには何故か動いて
いたものが肝心なときに限って(納品の直前とか?)落ちることが多くなる。
どっちがいいかはジレンマですな。宗教戦争の予感がする。
302デフォルトの名無しさん:2005/06/12(日) 01:49:10
>>301
それってプログラムをちゃんと組めてないだけ。
設計思想とかそういうレベルの話じゃない。
303デフォルトの名無しさん:2005/06/12(日) 01:53:20
>>298
そのsuspend()は
単に
void HOGETYPE::suspend() { delete[] ptr; ptr = NULL; }
でいい気がするんだが

という話ではなくて?
304デフォルトの名無しさん:2005/06/12(日) 01:54:32
deleteなりfreeなりをした後にポインタをNULLにセットするような
マクロを使うようなコードも良く見るね
305デフォルトの名無しさん:2005/06/12(日) 01:55:33
>>302
全部自分でやれる内はいいが、ライブラリのような
ある程度使い方を他人に委譲せざる得ない場合もあるしねえ
306デフォルトの名無しさん:2005/06/12(日) 01:58:17
>>301
deleteのときは必ずNULL代入するから、
2度deleteとかはありえないですよ。
307デフォルトの名無しさん:2005/06/12(日) 02:00:04
>>305
それは自分が管理している範疇じゃないから、
原因特定するときも、むしろわかりやすいよ。
308デフォルトの名無しさん:2005/06/12(日) 02:00:38
>>306
NULL代入したら、二度目のdeleteは実質的に安全になるからな。
でも、二度deleteを呼んでしまうこと自体はあり得て、それが
ソフトウェアクラッシュに結びつかないから、露見しにくくなる、と
>>301は言っているのだろう。
それをバグと言うべきかどうかは微妙なところだと思うが。
309デフォルトの名無しさん:2005/06/12(日) 02:01:14
>>305
そんなときでも、使用していないポインタはNULLの原則は守れますよね。
310デフォルトの名無しさん:2005/06/12(日) 02:03:53
>>308
ちゃんと、if(p) delete p; p=NULL;してるから
2度deleteは無いんです。はい。
311デフォルトの名無しさん:2005/06/12(日) 02:04:18
>>310
ああそういう意味か。
312デフォルトの名無しさん:2005/06/12(日) 02:05:16
まあ、つまらんこだわりです、はい。
313デフォルトの名無しさん:2005/06/12(日) 02:06:00
ここはチャットルームかw
314デフォルトの名無しさん:2005/06/12(日) 02:07:35
まあ、意識しているに越したことないんでね?
315デフォルトの名無しさん:2005/06/12(日) 02:07:45
レベルが限りなく下がってる時に限って盛り上がる。これいかに。
strdup()しかり。
316デフォルトの名無しさん:2005/06/12(日) 02:12:50
>>315
もし>>190=>>301だったらどうする?
317デフォルトの名無しさん:2005/06/12(日) 02:14:59
>>305
どちらにせよ、あなたのポインタを0にセットするとクラッシュするっていうバグが
「pointerをNULLで初期化すべきでない」という論の論拠にはならないってことだ。
318デフォルトの名無しさん:2005/06/12(日) 02:23:51
使わないんだからNULLでいいじゃん、
って単純に思っちゃう私はおばかチャン?
NULLにしとけば、アクセス時に確実にクラッシュするから、
むしろバグ発見しやすいって思ってたんだけどな。
newし忘れとか、するタイミングを間違ってるとか。
319デフォルトの名無しさん:2005/06/12(日) 02:25:19
えっと、シンプルに考えて、
デフォルトコンストラクタは黙ってれば
メンバ変数はNULLで初期化してくれるんですよね?
320デフォルトの名無しさん:2005/06/12(日) 02:29:04
それはPODで明示的に呼び出したときだけ
321デフォルトの名無しさん:2005/06/12(日) 02:35:09
ところで、std::vectorの効率のよいソートのしかたについては?

322デフォルトの名無しさん:2005/06/12(日) 03:31:48
>>321
とりあえずstd::sortがstd::swapを
呼ぶと仮定して話を進める。
前述どおりソートを改良するにはswapの
特殊化が最適だろう。
swapも対象が4byteに収まるなら
デフォルトのインプリメントが最も速いが
4byteで収まらない場合、メモリへの書き戻しが
発生してストールする可能性が出る。
ならば強制的にレジスタのみを使ってswapをするようにしれば
速くなるのではないか?
具体的にはmmレジスタ or xmmレジスタをテンポラリに使って
値の交換を行う。この際ふたりはプリフェチを忘れないように。
では>>321実験よろしく。
323デフォルトの名無しさん:2005/06/12(日) 11:50:54
delete の後に NULL 入れるっていう人は、
アクセス前に全部 NULL チェック入れるの?
そうじゃないと中途半端だよね?
324デフォルトの名無しさん:2005/06/12(日) 12:12:08
deleteなんてどうでもいいだろ。
後で判定に使いたきゃ0ポインタにしておけばいいし、delete後にすぐ変数破棄するなら0いれる意味は無い。
325デフォルトの名無しさん:2005/06/12(日) 12:29:13
俺の前居た職場では、ポインタNULL初期化強制だった

int *ip = new int[Num];

は、NGで

int *ip = NULL;
ip = new int[Num];

だとよ、なんつうか地味に鬱なコード書かされる
理由を聞いても意味不明なこというだけだし
326デフォルトの名無しさん:2005/06/12(日) 13:14:42
∧_∧
( ´∀`)すまぽ
327デフォルトの名無しさん:2005/06/12(日) 13:45:29
サイズが4000KBほどの構造体のスワップを
1000回繰り返すテストを行ったら下記のようになった。
MMXは最適化は全然してなくてこれなんで結構使えるかも。
SSEにしたらもっとよくなるかな?

std::swap = 121532867 clock
std::memcpy = 149840084 clock
MMX = 26874815 clock
328デフォルトの名無しさん:2005/06/12(日) 14:02:39
>325
ださっ...そんな部署なら移動してよかっただろ。
329デフォルトの名無しさん:2005/06/12(日) 14:11:17
まあな、やめた理由の(とってもとっても小さい)一つだしな
昔からこういう規則になってるというのならいざ知らず
去年、突然意味不明に導入された規則なところがまた笑える
330327:2005/06/12(日) 14:13:04
SSE対応の為、構造体のアライメントを8byteから16byteにしたら
std系まで速くなってしまった。
アライメントって大事なんだな、へたな最適化より効果あるし。

std::swap = 98215796
std::memcpy = 107130904
MMX = 26091994
SSE = 22441920
331デフォルトの名無しさん:2005/06/12(日) 14:17:18
桁多すぎて見づらいよ
332デフォルトの名無しさん:2005/06/12(日) 14:31:37
>>327
これってMMXは、下のようにmovqで64ビット単位で転送しているだけでその性能がでているの?

//VC.Net 2003
#include <iostream>
#include <iterator>
int main(int argc, char* argv[])
{
    long data1[2] = {100, 200};
    long data2[2] = {300, 400};

    std::copy(data1, data1 + 2, std::ostream_iterator<long>(std::cout, " "));  std::cout << std::endl;
    std::copy(data2, data2 + 2, std::ostream_iterator<long>(std::cout, " "));  std::cout << std::endl;

    __asm {emms}
    __asm{
        movq mm0, data1
        movq mm1, data2
        movq data1, mm1
        movq data2, mm0
    }
    __asm {emms}

    std::copy(data1, data1 + 2, std::ostream_iterator<long>(std::cout, " "));  std::cout << std::endl;
    std::copy(data2, data2 + 2, std::ostream_iterator<long>(std::cout, " "));  std::cout << std::endl;
    return 0;
}
333デフォルトの名無しさん:2005/06/12(日) 17:15:14
桁多すぎて見づらいよ
334デフォルトの名無しさん:2005/06/12(日) 17:18:53
>>325
万人がそこまでやるやらないは別として、
何もわかっちゃいないアフォに強制するコードとしては、
そのほうがいいのかもしれない。
ポインタでヴァグを出しまくりのヤツには
仕方のない仕打ちかと思われ(アナタのことじゃないよ)。
335デフォルトの名無しさん:2005/06/12(日) 17:24:05
それくらい普通に教育できないもんかな。
336デフォルトの名無しさん:2005/06/12(日) 17:50:38
>>334
そんな奴にC++でコード書かせるなよ、と
337デフォルトの名無しさん:2005/06/12(日) 18:17:49
っていうか、それが教育の一環だろw
338デフォルトの名無しさん:2005/06/12(日) 19:04:09
>>332
こんな感じです。
でもひとつの構造体を使いまわしてるし
信憑性は低そう。

ttp://www.uplo.net/www/vip15568.zip
339デフォルトの名無しさん:2005/06/12(日) 20:26:35
そういう予防措置的コードを書く香具師に限ってバグを出す罠。
340デフォルトの名無しさん:2005/06/12(日) 22:53:56
書かない香具師はもっと出す罠。
341デフォルトの名無しさん:2005/06/12(日) 22:56:27
そもそも、ポインタ変数を繰り返し使うときって、
メモリが確保されているかいないかを判断するのって、
ポインタにNULLが入ってるかいないか以外にどうやって判断してるの?
なんか確認できる関数ってあったっけ?
342デフォルトの名無しさん:2005/06/12(日) 23:09:57
>>341
何かを指すかもしれないし指さないかもしれないポインタに
0を入れて「何もさしていない」と明示するのは、今の話題とは違うだろ。
343デフォルトの名無しさん:2005/06/12(日) 23:14:01
>>341 判断しないという選択肢もある。
344デフォルトの名無しさん:2005/06/13(月) 00:29:17
前のHOGETYPEのケースで、
swap を特殊化するならコピーする必要はないでしょ。
ポインタをswapすればいいだけ。
345デフォルトの名無しさん:2005/06/13(月) 00:50:30
deleteするべきかどうかも判断できないし、
メモリリークやりたい放題したい放題だね。
346デフォルトの名無しさん:2005/06/13(月) 00:52:25
>>342
だから「そもそも」って改めて聞いてるんだけど。。。
347デフォルトの名無しさん:2005/06/13(月) 00:56:45
>>345
それ、どこにレス付けてんの?
348デフォルトの名無しさん:2005/06/13(月) 00:58:22
おとなしくスマートポインタつかっとけ
349デフォルトの名無しさん:2005/06/13(月) 01:00:47
new/deleteなんてカワイイもんだろ
COMのAddRef()/Release()に比べりゃよっぽど管理しやすい
350デフォルトの名無しさん:2005/06/13(月) 01:24:44
>>349
ふつー CComPtr か CComQIPtr 使うでしょ。
351デフォルトの名無しさん:2005/06/13(月) 01:29:31
そんな存在すら知らなかった漏れはboost::move_ptr使ってた
352デフォルトの名無しさん:2005/06/13(月) 01:48:36
>>350
いや_com_ptr_tだろ
353デフォルトの名無しさん:2005/06/14(火) 07:03:30
単に初期化強制でいいのにNULL初期化強制してるのが突っ込みどころなんでしょ
354デフォルトの名無しさん:2005/06/14(火) 16:11:34
質問ですが、
std:vectorは、デフォルトで、どれだけのサイズが設定されているのでしょうか?

たとえば、
std::vector<int> nVal:
とすれば、デフォルトのベクター配列のサイズというものがあると思いますが。
355デフォルトの名無しさん:2005/06/14(火) 16:19:20
>>354
引数無しのコンストラクタで初期化したら初期サイズは0だよ。
356デフォルトの名無しさん:2005/06/14(火) 20:52:43
std::vector はデザパタの Composite の一種と言えるのでしょうか?
357デフォルトの名無しさん:2005/06/14(火) 21:20:09
>>356 いいえ。
358デフォルトの名無しさん:2005/06/14(火) 21:36:01
>>356
すごい質問だな。
C++ で Composite パターンを実装するときに
std::vector を用いることはあるかもしれないけど・・・
359デフォルトの名無しさん:2005/06/14(火) 23:33:32
>354
capacity() については規定されてなさげ。以下、俺メモ。

> 23.2.4.1
> Complexity: The constructor template <class InputIterator> vector(InputIterator first, InputIterator last)
> makes only N calls to the copy constructor of T (where N is the distance between first and last) and
> no reallocations if iterators first and last are of forward, bidirectional, or random access categories.
> It makes order N calls to the copy constructor of T and order logN reallocations if they are just input
> iterators.

no reallocations ということは最初に要素数を調べて最低でもその分は capacity() を確保しておく、と。
InputIterator の場合は、reallocation が発生するので N ではなくて O(N) のコピーコンストラクタ呼び出しが発生する、と。
O(logN) の reallocation ということは、capacity() を倍々にしていく、みたいな方法がとられると考えられる、と。
360デフォルトの名無しさん:2005/06/17(金) 00:05:35
データをソートして格納するコンテナにずっとmapを使っているのですが、
priority_queueとの違いがよくわかりません。
単にインターフェースが違うだけなのか、それとも計算量自体異なるのか…。
両方とも2分木探索をしているのではないですか?
361デフォルトの名無しさん:2005/06/17(金) 00:21:02
>>360
mapの「ソートされている」という性質はあくまで二次的なもので、
「key-valueのペアを格納し、keyを指定しての高速なデータアクセスを提供する」
のがmapの目的。
全然違うでしょ。
362デフォルトの名無しさん:2005/06/17(金) 00:21:57
>>360
priority_queueにはempty(),size(),top(),pop(),push()しかなく、内部では
heapを使っている。
mapはその他たくさんのメンバを持っていて、2分木探索をしているという
保証まではしていない(計算量のみ)。
363360:2005/06/17(金) 00:47:39
どうもありがとうございます。

>>361
ソートされているという性質が二次的なものであったとしても、
実際問題、イテレータを使ってpriority順にアクセスできるのであれば
目的に適っていると思うのですが…。
そうしたい場合のpriority_queueの効率がmapよりも優れている、
というのであれば納得です。

>>362
heapもmapも、要素挿入は対数時間、priority最大要素の取得は定数時間、
という認識は間違っていないでしょうか??
2分木探索をしている保証はなくても、計算量が保証されていれば私としては十分なのですが…。
364360:2005/06/17(金) 00:49:04
分かりにくくてスミマセン。
つまり、聞きたかったことはpriority_queueの存在意義です。
365デフォルトの名無しさん:2005/06/17(金) 00:55:53
とりあえず省スペースではあるよね。
まあその分、make_heapするたびにコピーとかいっぱいしてそう。
366デフォルトの名無しさん:2005/06/17(金) 01:57:26
>>365
std::priority_queue<>::push()ではstd::push_heap()を、std::priority_queue<>::pop()
ではstd::pop_heap()を使っているだろうし(少なくともそうしたときと同じ効果である
事が保証されているから)、毎回std::make_heap()するわけじゃないからそこまで
なさそう。

>>364
ということで、計算量の保証に対する認識としては正しい。std::map<>というよりも
std::set<>の方が近いかもしれないけれども。std::priority_queue<>自体は、感覚と
してはstd::make_heap()、std::push_heap()、std::pop_heap()とコンテナをカプセル化
したと考えればいい。普通の実装を考えればstd::set<>の方が各ノードのポインタ
の分余計にスペースをとっているから、その分単なるシーケンスである
std::priority_queue<>の方が省スペースだろう。もしかしたらstd::set<>の方が挿入
や削除に時間がかかるかもしれない。例えば赤黒木で実装されていたら木の組み
換えの際にビット操作を行っている場合もある。計算量の保証だけで十分なので
あればどちらを使っても構わない。無能な上司のせいで後で仕様が変わって、中を
いじらなければならなくなるかもしれない。そうでなければstd::priority_queue<>を
使うのが必要十分だろうね。
367360:2005/06/17(金) 02:07:48
>>365-366
むはー。ありがとうございます。
私もなんとなく>>365さんのように「コンテナを別に持ってそれに演算を加えてたら
余計な計算たくさんしてそう」程度に考えてたのですが、
map(set)も結局コンテナ構造の維持に手間を割いているわけですね。
私の用途だとpriority_queueの方が意味的にあっているので、そちらを使う踏ん切りがつきました。
どうもでしたー。
368デフォルトの名無しさん:2005/06/17(金) 02:43:03
ヒープは最小(最大)要素の削除はO(log N)が保証されますけれど,
平衡探索木などとは対照的に一般の要素の削除が平均・最悪でO(N)かかります.
一方で空間消費量の点で大きな強みがあり,
最小(最大)要素の削除のみを必要とする,あるいはそれが主たる演算となる
priority queueの実装にヒープが最適な場合が多いというのが通説だったと思います.
369デフォルトの名無しさん:2005/06/17(金) 06:13:18
質問です。
listを使ってるのですが、
class USER
{
public:
int age;
char name[16]
char memo[64];
};
std::list<USER> userlist;
これをUSERのメンバのnameでソートしたい場合どのようにすればいいのでしょうか?
sortを使った場合、入門サイト見る限りはstd::list<int> numlist;のような場合は出来るようですが、個々のメンバに対しては出来ないようなので・・・
また、nameを検索したい場合、algorithmでそのような関数は用意されてますか?
370デフォルトの名無しさん:2005/06/17(金) 07:34:54
>>369
template<class Compare>
void std::list::sort(Compare comp);
371デフォルトの名無しさん:2005/06/17(金) 15:36:20
2次元配列を
std::vector<std::vector<float>> matrixA(10)
って感じで作ったけど
for(i=0;i<10;i++)
matrixA[i].resize(20)
って感じで初期化しないといけないよね。

でもこうすると2次元配列がメモリー上でちゃんとならんでくれない
つまり
float *pf=&matrixA[0][0]
としたとき
pf[i*20+j]=matrixA[i][j]
になってくれない。ちゃんとメモリーに並ぶように
2次元配列を作る方法ないのかな
372デフォルトの名無しさん:2005/06/17(金) 15:45:59
>>371
おとなしく boost::multi_array 使っとけ。
373デフォルトの名無しさん:2005/06/17(金) 15:52:14
どうせならboost::numerics::ublas の
matrixを使いたい。あれもメモリー上で
きちんと並んでることは保障されてるの?
374デフォルトの名無しさん:2005/06/17(金) 16:03:39
どうせなら?
用途が全然違うんだが…。
375デフォルトの名無しさん:2005/06/17(金) 16:13:06
すまない自己解決した
boost::numerics::ublas::c_matrix<10,20>
が目的のものだった。
376デフォルトの名無しさん:2005/06/17(金) 20:09:28
valarrayってあるけど使ったことないからな。
377360:2005/06/18(土) 21:13:11
>>368
簡潔にまとめて下さってありがとうございます。
378デフォルトの名無しさん:2005/06/19(日) 17:01:22
std::stringのfindで指定した文字(列)が見つからなかった場合は「npos」が返されると記述されてるのですが、
nposとは何をさしてるのでしょうか?
http://www.wakhok.ac.jp/~sumi/stl/header/string.html
379デフォルトの名無しさん:2005/06/19(日) 17:12:56
>>378
ISO/IEC 14882:1998 21.3 Template class basic_string -6
namespace std {
    template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
    class basic_string {
    public:
    //...
        static const size_type npos = -1;
380デフォルトの名無しさん:2005/06/19(日) 17:49:22
>>379
そんな風に書くと>>378が直接-1と比較するコードを書いてしまいそうだ。
381デフォルトの名無しさん:2005/06/19(日) 17:49:35
つうかむしろ何が入ってるかは意識しない方がよくね?
382デフォルトの名無しさん:2005/06/19(日) 17:53:32
>>378
何も刺してないからnposなんだと
383デフォルトの名無しさん:2005/06/19(日) 17:58:51
>>378
最低でも禿本くらいは読め
384378:2005/06/19(日) 18:18:38
-1で検出無しとしてコーディングしました。
それで問題なくプログラムが動いてます。

ハイ。

MFCのCStringやCArrayからSTLへ移植中です。
385デフォルトの名無しさん:2005/06/19(日) 18:23:02
>>384
おいおい....

「動けばいいってモンじゃねーだろ」という言葉をプレゼントしておこう
きみ、
EOFもつねに-1と書いて
NULLはつねに0と書いて
Cならプロトタイプ宣言など絶対にせず
nとかiとかいうグローバル変数を定義するタイプか?
386デフォルトの名無しさん:2005/06/19(日) 18:24:21
>>384
-1使うな。std::string::npos使え。
387デフォルトの名無しさん:2005/06/19(日) 18:29:06
NULLの場合は常に0と書くのが普通だがな
388384:2005/06/19(日) 18:38:03
-1からnposにしました

nposというメンバがあるんですね。
知りませんでした。
本当に、すいませんでした。
389デフォルトの名無しさん:2005/06/19(日) 18:52:23
>>388
>>379で真っ先に書いてある。
390デフォルトの名無しさん:2005/06/19(日) 22:05:35
頭悪そうな香具師が一匹いるな。
391デフォルトの名無しさん:2005/06/20(月) 03:19:50
exit(EXIT_SUCCESS)をexit(0)とか書いちゃう人かな。
392デフォルトの名無しさん:2005/06/20(月) 03:28:39
俺はEXIT_SUCCESSなんて書かないなあ
失敗がEXIT_FAILUREだけってのも使いものにならんし
393デフォルトの名無しさん:2005/06/20(月) 05:42:04
>>391
それは同じであることが保証されてるぞ
NULLと違って
394デフォルトの名無しさん:2005/06/20(月) 06:11:28
>>391
EXIT_SUCCESS なんて使った事がないんだが、それより
() 付けちゃうってのがアレだなあ。
395デフォルトの名無しさん:2005/06/20(月) 06:18:35
>>394 ん? () がどうした?何の話?
396デフォルトの名無しさん:2005/06/20(月) 06:45:24
>>395
何でもない。忘れて。吊ってくるから…orz
397デフォルトの名無しさん:2005/06/20(月) 09:54:19
main()からのreturn EXIT_SUCCESS;かぁ。使わないな。
398デフォルトの名無しさん:2005/06/20(月) 16:24:10
なまじ演算子に括弧つけなくていいからマクロで置き換えられなかったり
するんだよな。
newとかdeleteとか、全部括弧がついていたら苦労しないのにと思ったことも
あったような希ガス。

399デフォルトの名無しさん:2005/06/20(月) 16:45:37
std::vector<> の各要素はデフォルト構築ではないのですか?
VC++6,.NET 2003, gcc-3.3.3 でデフォルト構築したテンポラリをコピーしやがりますよ?
#include <iostream>
#include <vector>
class V {
public:
V() : m_v(num++) {print("Constructor"); }
V(const V& v) { m_v = v.m_v; print("CopyConstructor"); }
V& operator=(const V& v) { m_v = v.m_v; print("="); return *this; }
virtual ~V() { print("Destructor"); }
private:
void print(const char* s) { std::cout << s << ":" << m_v << std::endl; }
static int num;
int m_v;
};
int V::num = 0;
int
main()
{
std::vector<V> v(5);
return 0;
}
400デフォルトの名無しさん:2005/06/20(月) 18:18:19
>>399
これがコンストラクタ。当然そうなるわな。
explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());
401デフォルトの名無しさん:2005/06/20(月) 22:46:30
逆に逐一生成した値を入れたい場合だったらどう書きますか?
・ループで push_back()
・back_inserter を使って generate_n()
他、どんなもんでしょ?
402デフォルトの名無しさん:2005/06/21(火) 00:35:14
>>401 コンストラクタの引数による。
403デフォルトの名無しさん:2005/06/21(火) 02:17:06
vectorクラスで
typedef struct {
char str[512];
} t_str512;
std::vector<t_str512> strings;
という風に固定幅(片方の次元が)の2次元配列を作成するのに、
いつも固定幅の配列の方を定義してるんですが、
便利な方法はありませんか
std::vector<char[256]>のような直感的な書き方がしたいのです。
404デフォルトの名無しさん:2005/06/21(火) 02:24:43
>>403
固定幅の配列をテンプレートで書けば良い。
std::vector<array<char, 512> > strings;
boost::arrayがまさにそれ。
405デフォルトの名無しさん:2005/06/23(木) 15:01:11
std::string と std::vector<char> の相互変換で、
string->vector は

std::string s;
std::vector<char> v;
std::copy(s.begin(), s.end(), std::back_inserter(v));

みたいなので出来るかと思うのですが、逆はどうしたら良いのでしょうか。
std::getline() が使えると嬉しいのですが。
406デフォルトの名無しさん:2005/06/23(木) 15:13:35
>>405
back_inserterはstringにも使えるが。
そもそも、
std::string s;
std::vector<char> v(s.begin(), s.end()); /* string -> vector */
std::string s1(v.begin(), v.end()); /* vector -> string */
で十分じゃないか?
407デフォルトの名無しさん:2005/06/23(木) 15:26:23
priority_queue に以下のデータを格納したいです

struct myData
{
float key;
Dtata data;
}

格納される順番は myData.key の昇順で並ぶようにしたい。
priority_queueでこんなことできるの?
408デフォルトの名無しさん:2005/06/23(木) 15:42:58
>>407
keyで比較する関数オブジェクトを比較関数(第三テンプレート引数)に指定するべし。
409デフォルトの名無しさん:2005/06/23(木) 21:36:46
test
410デフォルトの名無しさん:2005/06/24(金) 22:58:45
>>361
Primer一回立ち読みでもしてみては?
411デフォルトの名無しさん:2005/06/25(土) 00:17:22
えーとなんで

for (set<X>::iterator it = foo.begin(); it != foo.end(); ++it)
  if (it->IsInvalid())
    foo.erase(it);

って想定通りの挙動してくれないでしょうか

set<X>::iterator it = foo.begin();
while (it != foo.end()) {
  if (it->IsInvalid()) {
    if (foo.erase(*it)==0)
      ++it;
    else
      it = foo.begin();
  }
}

こんなコードしか思いつかなくて泣きそうなんですが…
412デフォルトの名無しさん:2005/06/25(土) 00:21:27
あ、間違えた

if (it->IsInvalid()) {
  foo.erase(it);
  it = foo.begin();
}
else
  ++it;

です
413デフォルトの名無しさん:2005/06/25(土) 00:23:52
>>411
it = foo.erase(it);
setに限らずSTLコンテナのeraseは削除した要素の次を指すイテレータを返す。
414411:2005/06/25(土) 00:33:30
>>413
Σ(゚д゚lll)ガーン
私の手元の資料だとiteratorを引数にとるeraseの戻り値はvoidで
実際アドバイスどおりのコーディングすると「許されない型」と怒られます…
415デフォルトの名無しさん:2005/06/25(土) 00:51:07
foo.erase(*it++)
416デフォルトの名無しさん:2005/06/25(土) 00:57:04
>>411-413
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130
Defect とされてはいるものの、現行の規格では
AssociativeContainer(set,map,multiset,multimap) の
erase() は void を返すと決められているので
it = foo.erase(it) が動作しない環境のほうが多いんじゃないか?

Effective STL かなんかに載ってたと思うが、
erase() が void であっても動くコードにしとくのが正解だろう。

set<X>::iterator it = foo.begin();
while (it != foo.end()) if (it->IsInvalid()) foo.erase(*it++); else ++it;
417411:2005/06/25(土) 01:06:26
みなさんありがとうございます
簡潔な例にするためにsetで書きましたが
実装はmapでやってたのでこんな不気味な演算子になりました

pool_t::iterator it = m_Pool->begin();
while (it != m_Pool->end())
{
  if (it->second.IsAlone())
    m_Pool->erase(it++->first);
  else
    ++it;
}
418416:2005/06/25(土) 01:14:49
あれ? foo.erase(*it++) は間違いだな。

>>417
m_Pool->erase(it++) でいいんじゃないか?
419デフォルトの名無しさん:2005/06/25(土) 01:16:17
わざわざkeyを引数に取るerase呼ばなくても,
iteratorを引数に取るeraseを呼べば良くないですか?

m_Pool->erase(it++);

eraseの内部実装的にも恐らくこちらが速いでしょうし.
ただ,multi(set|map)の場合はkeyを引数に取るeraseと
iteratorを引数に取るeraseで意味が異なるので注意が要りますけれど.
420419:2005/06/25(土) 01:17:00
って先に書かれてました.すいません.
421デフォルトの名無しさん:2005/06/25(土) 02:08:21
これを見たあなた!!ヾ(・ε・。)
 あなたゎこの1ヶ月以内に好きな人と両思い
またゎ付き合っている子ゎすごくLOVE2になります!!
 それにゎこの文章をコピーして他の掲示板に3回別の掲示板に
はればOK!!!たったこれだけであなたわぁ
 最高の生活がおくれます!!
ただしこれをしなかったら
 きっと両思いになることゎないでしょう!!(/□≦、)
やった子ゎ今でゎ学校1のLOVE2カップルです!!
これをやらなかった子ゎすぐに彼氏と別れてしまいました

422デフォルトの名無しさん:2005/06/25(土) 14:21:18
>>421
好きな人がいません。どうしたら良いですか。
423デフォルトの名無しさん:2005/06/25(土) 15:55:06
5年生のあいちゃんに片思いなんです。
あいちゃんとLOVE2になれますか?
私は30代独身です。彼女いない暦=年齢です。
424デフォルトの名無しさん:2005/06/26(日) 01:12:12
>>423
君が恋愛する事自体が犯罪
425デフォルトの名無しさん:2005/06/26(日) 03:20:46
>>423
あいちゃんてOOスレに出てくるアンチOOのお猿さんでしょ?
426デフォルトの名無しさん:2005/06/26(日) 03:23:40
>>423
諦めろ。君の恋愛の対象となった女の子の人生が可愛そうな事になる。
427デフォルトの名無しさん:2005/06/26(日) 03:23:45
>>411しかり、Effective STL のような本を熟読し、物凄く注意深く使わないとすぐ
予定外の動作をするSTLって、正直ダメなんじゃないか?
STLを使う前からインターフェースだけ見てその罠を全て見抜ける天才なんか存在しないわけだし。
そんなfragileなライブラリってやっぱダメだろ?
428デフォルトの名無しさん:2005/06/26(日) 03:44:23
>>427
それは、あんたの頭がパーだから。STL向きじゃないので、すぐにC++を
触るのをやめましょう。
429427:2005/06/26(日) 04:12:26
>>428
つまんねーやつ。キミ、アタマ悪いでしょ?
430デフォルトの名無しさん:2005/06/26(日) 04:28:31
それはある意味、C++そのものを否定するのと同じだな。
431デフォルトの名無しさん:2005/06/26(日) 04:56:46
>>429
図星を突かれたからと言って、ファビョんなよw
432デフォルトの名無しさん:2005/06/26(日) 05:18:59
STLのインターフェースがクソなのは間違いない。
433デフォルトの名無しさん:2005/06/26(日) 05:33:23
>>432
なんか改善案があるなら教えてくれよ。
434デフォルトの名無しさん:2005/06/26(日) 06:07:16
>>432
そう思うんならC++標準委員会で発言してみろ。
できない癖に偉そうな口聞くんじゃない。
435デフォルトの名無しさん:2005/06/26(日) 15:01:36
自作のステキライブラリでも使ってればいいのに
436デフォルトの名無しさん:2005/06/26(日) 21:49:42
            , -'"´  ̄`丶、_
           ,.∩         `ヽ
         〃∪'´ ̄`二二人\  ヽ
         | ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ',
         |ハ ,ニ、   ,. - 、 | | | l |
         | ハ ィハ     ,二ヽ. | | | | | 同じ板にコピペするとそのままだけど、
         | | | じ'   |トJ〉  /)} l | 違う板にコピペすると鬼のような怖い顔
         | ハ  、'_,   ̄,, 厶イ川| に変わる摩訶不思議な佳子様コピペ。
         l l /\    .. イV\川 |
         ,' l l ,イ `l ̄´ /   /ヽl l
         l | l ハ  `メ、    〃  ヽヽ、__ノ
         l  ∨ └‐イ「ト--ァ'´     ハヽ__ノ
         ヽ/  }  l」」 /     / }`ー
          〈_n| 八   / /     /ノ
          〈二二人 c /\/ / , イ
           /  /厂 /\__>< {_



437436:2005/06/26(日) 21:50:10
なんだよ!
全然かわんねーじゃん!!
騙された・・・orz
438デフォルトの名無しさん:2005/06/26(日) 23:30:35
C++は「泥にまみれた現実を通り抜ける」ために
「一部の馬鹿を冷徹に置き捨てることを厭わない」言語だからねえ。

どうしても、肯定派の会話は戦略会議的に、否定派の会話はしゃべり場的に
なっちゃうね。
439デフォルトの名無しさん:2005/06/26(日) 23:41:04
     .┌━┐    ┌━┐
      ┃┌╋──╋┐┃
      └╋┘    └╋┘
        ┃ ・   ・  ┃        ┌━━┐
    ●━╋┐    ┌╂━━━━╂┐  ┃
    └━┷┴━━╂┘        └╋━┘
            ┌╋┐        ┌╋┐
バカには出来ない ┃└╋╋━━╋╋┘┃
C++です       ┃  ┃┃    ┃┃  ┃
            ┃  ┃┃    ┃┃  ┃
            └━┘┘   └└━┘
440デフォルトの名無しさん:2005/06/27(月) 03:37:24
>>427-439

C++ならではのバグに悩まされて泣き言言っている連中がよく言うぜw
笑わせるな凡人風情がw キミたちの為にJavaはある。

441デフォルトの名無しさん:2005/06/27(月) 10:05:37
>>440
>C++ならではのバグ

詳 し く
442デフォルトの名無しさん:2005/06/27(月) 10:50:32
boostとSTLを駆使して作ったプログラムを携帯で動かすには
Javaで書き直すしかないのかな
443デフォルトの名無しさん:2005/06/27(月) 23:37:30
BREWでもboostやSTLは動かんだろ。
444デフォルトの名無しさん:2005/06/28(火) 01:15:43
boostとSTLを駆使して作ったプログラムを携帯で動かすには、
ARM C++用に、boostとSTLを自分で書く。
445デフォルトの名無しさん:2005/06/28(火) 03:51:45
>>441
しゃべり場の参加者にその質問は酷。
446デフォルトの名無しさん:2005/06/28(火) 18:09:03
javaにはboostに対応するものはないの?
447デフォルトの名無しさん:2005/06/29(水) 13:35:38
BREWでSTLはメモリー食いすぎで進められないって
ttp://www.gamedev.net/community/forums/topic.asp?topic_id=327860
448デフォルトの名無しさん:2005/06/30(木) 00:01:32
>>447
"Go ahead and use the STL" と書いてあるのが見えないのか?
449デフォルトの名無しさん:2005/06/30(木) 03:20:31
>>447
馬鹿だ・・・・
450デフォルトの名無しさん:2005/06/30(木) 13:31:03
そのまま使うな
カスタムアロケータを使えと書いてある
451デフォルトの名無しさん:2005/06/30(木) 15:51:36
そういやBREWのメモリ割り当てって
なんか凄い間抜けな仕様だと聞いた事がある。
452デフォルトの名無しさん:2005/06/30(木) 22:27:10
boost::multi_array よりも
vigra::MultiArray
のほうが機能が充実してて使いやすい気がするんだけど
俺だけ?
453デフォルトの名無しさん:2005/06/30(木) 23:03:27
>>452
|ω・´)バイアグラ?
454デフォルトの名無しさん:2005/06/30(木) 23:28:16
>>452
スレ違い
455デフォルトの名無しさん:2005/07/01(金) 13:22:47
>>454
vigraは画像処理がメインのターゲットだけど
vigra::MultiArray は一般的に使える

例えば行列演算のvigra::Matrixは
vigra::MultiArrayの特殊化

数値計算関係はboostは充実してないって結論に達したけど
反論求む


boostの行列演算
boost::numerics::ublas::matrix
は、ublas::matrixViewクラスがないので使いにくい

boost::numerics::ublas::matrixは
boost::multi_arrayの派生クラスになってないよね?
456デフォルトの名無しさん:2005/07/01(金) 13:29:12
ここはSTLのすれなんだが。
457デフォルトの名無しさん:2005/07/01(金) 20:44:02
>>456
別にいいんじゃねえ?
話題ねえし
458デフォルトの名無しさん:2005/07/01(金) 21:35:14
でもtemplateスレは別に在るわけで。
459デフォルトの名無しさん:2005/07/01(金) 23:31:22
そもそも相談室であって雑談スレではない
「反論求む」とかバカじゃねえの?
460デフォルトの名無しさん:2005/07/02(土) 06:35:19
C++ スレの >>1 がやっと直ったんで
このスレは要らなくなったわけだが。
461デフォルトの名無しさん:2005/07/02(土) 17:59:07
std::stringstreamの中身を捨てて初めからやり直したい時ってss.str("");でいいんですか?
(ssはstringstreamの変数名としてます)
ss.flush(); とか ss << std::flush; とか何も起こらないみたいですがどうなってるんでしょうか?
462デフォルトの名無しさん:2005/07/02(土) 18:34:07
>>461
ss.str(""); でいい。

flush()は、std::stringstreamがデバイスに連結されている訳ではないので、
何も起きない。継承上の残骸と思えばいい。
463デフォルトの名無しさん:2005/07/02(土) 18:49:52
>>462
そうだったんですか。
どうもありがとうございます!
464デフォルトの名無しさん:2005/07/02(土) 20:26:28
>>455

>boostの行列演算
>boost::numerics::ublas::matrix
>は、ublas::matrixViewクラスがないので使いにくい
matrixView ってどんなクラス?意味がわからん。
ExpressionTemplate なら実装されてるが。

>boost::numerics::ublas::matrixは
>boost::multi_arrayの派生クラスになってないよね?
派生クラスである必要は全くないし、
派生クラスだったらむしろ困る。
メモリの並び方とか指定できないじゃん。
465デフォルトの名無しさん:2005/07/03(日) 19:49:06
プログラム板が荒れているため、IDを導入するか検討中です。
賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。

プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/

理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
466デフォルトの名無しさん:2005/07/04(月) 10:29:39
STL始めたばかりの初心者です。
void insertion(list<string> & a, int l, int r)
{int i, j;
for(i=l+1; i<=r; i++)
{
string temp = a[i];
j = i;
while((j>l) && (temp < a[j-1]))
{
a[j]=a[j-1];
j--;
}
a[j] = temp;
}
}
上記の挿入ソートにリストを受け渡そうとしていたのですがvectorやdequeのように ls[] とするとエラーになってしまいます。
list<string> ls;
ls.push_back("c");
ls.push_back("a");
ls.push_back("b");
insertion(ls, 0, ls.size()-1);

そこで、list<string>::iterator it = ls.begin();などとして、なんとかリストの受け渡しをしようと試行錯誤してみたのですがうまくいきません、大変お手数ですが、何かアドバイスなどございましたら、お聞かせいただけないでしょうか。
467デフォルトの名無しさん:2005/07/04(月) 11:14:28
>>466
listはランダムアクセス出来ないから無理。
対処としてはsetを使う。
468デフォルトの名無しさん:2005/07/04(月) 11:19:31
>>466
listを渡すのではなく、iteratorを二つ渡せば?
んで、operator[]を使わずにiteratorを++すると。
#つーか、std::sort()の実装でも見てみたら?
469デフォルトの名無しさん:2005/07/04(月) 11:52:51
お返事ありがとうございます。
>>467 さま
setをどのように利用すればよろしいでしょうか。
>> 468 さま
iterator を2つといいますと、ls.begin();に対して2つ設定するということでしょうか。
大変申し訳ございませんが、再度ご教授お願いします。今からsetおよびstd::sort
()に関して調べてきます。
470デフォルトの名無しさん:2005/07/04(月) 11:57:32
operator[]が使えなくとも、ほとんどのソートアルゴリズムは使える。
但し、O記法で、本来のオーダーが出なくなってしまう物があるので、
そういうのはSTLには入っていない。
471デフォルトの名無しさん:2005/07/04(月) 11:58:28
>>469
set について調べれば使い方がわかるだろう。
sort について調べれば「iteratorを二つ」の意味がわかるだろう。

質問は自分で調べてからにしような。
472468:2005/07/04(月) 12:03:32
教授する気はないので勝手に調べてくれ。
それでも分からなければ教示しないでもないが。
473デフォルトの名無しさん:2005/07/04(月) 12:13:01
474デフォルトの名無しさん:2005/07/04(月) 15:28:30
奴隷に噛み付かれたと思ってむかついた466がそろそろ
調べることを頑張らないまま皮肉を頑張りに来るぞ。
475デフォルトの名無しさん:2005/07/04(月) 16:50:58
ID導入反対
476デフォルトの名無しさん:2005/07/04(月) 16:58:48
テストしてない、よく考えてないが、たとえば↓
string限定という糞ぶり、こんなの書いてきたらグーパンチだろうが、何かの参考にどうぞ

template <typename BidirectionalIterator>
void insertion(BidirectionalIterator first, BidirectionalIterator last) {
  for (BidirectionalIterator i = ++first; i != last; ++i) {
    string temp = *i;
    BidirectionalIterator j = i, current = j;
    while ((current = j) != first) *current = *(--j);
    *current = temp;
  }
};

list<string> ls;
insertion(ls.begin(), ls.end());
477デフォルトの名無しさん:2005/07/06(水) 18:45:56
mapやmultimapのイテレータは、要素の追加などを行っても使えるのでしょうか?
それともvectorのように再配置が起きて使えなくなる、といったことがあるのでしょうか?
478デフォルトの名無しさん:2005/07/06(水) 19:01:08
>>477
問題ない。

23.1.2の8
The insert members shall not affect the validity of iterators and references to the container, and the erase
members shall invalidate only iterators and references to the erased elements.
479デフォルトの名無しさん:2005/07/06(水) 21:30:26
トリビアC++
480デフォルトの名無しさん:2005/07/06(水) 22:56:14
.net2003のVCでSTLのコードがコンパイル通らないので
STLport(4.6.2)をmakeしてインストールしたら
コンパイルは通るようになったが、リンクでlibc(d).libと
バッティングしてしまいました。

lb_test error LNK2005: ____lc_codepage_func は既に LIBCD.lib(initctyp.obj) で定義されています。

なかんじで。対処法ご存知でしたら教えていただけないでしょうか?
481デフォルトの名無しさん:2005/07/06(水) 23:20:50
>>479
Tribial C++とか言う本がありそうだな。
482481:2005/07/06(水) 23:21:25
Trivialだった。恥ずかす
483デフォルトの名無しさん:2005/07/07(木) 00:14:20
×.net2003のVCでSTLのコードがコンパイル通らないので
○.net2003のVCでSTLを使った初心者丸出しコードがコンパイル通らないので
484デフォルトの名無しさん:2005/07/07(木) 00:49:10
>>480
マルチスレッドDLLを選択しろ。
485デフォルトの名無しさん:2005/07/07(木) 11:57:00
stl::vector<T>の代わりにstl::vector<T*>を使うことはよくあると思うのですが、
const文脈においてdereference演算子の返り値をT * constではなくconst T*にする、
あるいはbegin(), end()の返り値をstl::vector<T*>::const_iteratorではなく
stl::vector<const T*>::iteratorにする、あるいはコピーコンストラクタで
引数stl::vector<T*>を受けてstl::vector<const T*>(ライクな型)に変換する
お約束の方法などはあるのでしょうか?

boostのiterator_adaptorsが多分目的に適っているのですが、
自前で簡潔に書けるのであればなるべくそうしたいのです。
486デフォルトの名無しさん:2005/07/07(木) 14:47:08
>>485
C++ではconst属性に対する抜け道もちゃんと用意されている。

const_cast<T*>(p);
487デフォルトの名無しさん:2005/07/07(木) 15:25:24
vector<T*> nonconst_vec;
vector<const T*> const_vec(nonconst_vec.begin(), nonconst_vec.end());
488485:2005/07/07(木) 18:22:17
>>486, 487
どうもありがとう。

>>486
std::vector<const T*>::const_iterator
begin(void) const { return std::vector<const T*>::const_iterator(const_cast<const T**>(&*m_vector.begin())); }
これでうまくいくのを確認したのですが、こんなもんでしょうか?
スマートでなければ指摘して頂けるとありがたいです。

>>487
イテレータを渡すのですね。どうもです。
489485:2005/07/07(木) 18:46:47
よく考えると、>>488だとconst_castを使わずに
std::vector<const T*>::const_iterator
begin(void) const { return std::vector<const T*>::const_iterator((T**)(&*m_vector.begin())); }
としてもよいのですね…。
490480:2005/07/07(木) 20:19:29
>>484
解決しました。ありがとございます。
LinuxとWindowsのマルチプラットフォームなもので…。
491デフォルトの名無しさん:2005/07/08(金) 00:26:40
>>488
T** から vector<T*>::const_iterator は変換 construct できるとは限らないのでは?
492デフォルトの名無しさん:2005/07/08(金) 00:52:00
>>488-489
実装依存でいいならあとはコンパイルさえ通れば大丈夫だろうけど、
規格上 std::vector<const T*>::const_iterator が const T** で初期化できるなどという保証は無い。
さらに、たとえポインタの指す先の const が違うだけでも、
要素型の違う std::vector の間で iterator を相互変換できる保証も無い。

class vector_485
{
 std::vector<T*> m_vector;

↑こんな感じで標準コンテナに準拠したラッパーを作るって話なら
iterator 型をポインタの typedef にすれば実装できそう。
493デフォルトの名無しさん:2005/07/08(金) 00:54:30
>>492
コンパイルが通って、なおかつその処理系のドキュメントが
期待する動作を保証しているならば、ね。
494デフォルトの名無しさん:2005/07/08(金) 01:17:06
stlportでstl::stringのコンストラクタにNULLを渡すと
エラーになるんですが、これって標準なんですか?
'\0'も一応文字だと思うんですが、なぜエラーに・・
495デフォルトの名無しさん:2005/07/08(金) 01:22:04
>>494
basic_string<char>::basic_string(char);
こういうコンストラクタがないからじゃないか?
496デフォルトの名無しさん:2005/07/08(金) 01:22:14
>>494
'\0' は文字と言えるが、 NULL は断じて文字ではない。
497デフォルトの名無しさん:2005/07/08(金) 01:22:46
>>494 標準です。
498デフォルトの名無しさん:2005/07/08(金) 01:50:44
std::string s(1, NULL) ってやるなよ。
499485:2005/07/08(金) 01:59:10
>>491-493
ありがとうございます。

> 要素型の違う std::vector の間で iterator を相互変換できる保証も無い。
まさにここを解決したかったわけですが、うまい方法はないようですね。
>>492の方法も試してみます。書いてみて格好悪かったら…とりあえず>>489でいきます。

> 規格上 std::vector<const T*>::const_iterator が const T** で初期化できるなどという保証は無い。
重々承知ですm_ _m
でもvectorのiteratorをポインタで初期化できない実装って存在するのでしょうか?
ただの興味ですが。
500デフォルトの名無しさん:2005/07/08(金) 02:12:29
>>499
> でもvectorのiteratorをポインタで初期化できない実装って存在するのでしょうか?

#include <vector>
std::vector<int>::iterator x(int* p) { return p; }

$ g++ -fsyntax-only
: In function `__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > x(int*)':
:2: error: conversion from `int*' to non-scalar type `__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >' requested
501デフォルトの名無しさん:2005/07/08(金) 02:36:17
>>499
Metrowerks CodeWarrior for Windows v8.3
エラー: 'int *'から'std::__wrap_iterator<std::vector<int, std::allocator<int>>, int *>'への
不当な暗黙の変換です。
502デフォルトの名無しさん:2005/07/08(金) 05:56:17
>>495-498
std::string str( '\0' );
とやっても不正アクセス例外になりますよ・・

長さゼロのstd::stringインスタンスが存在できるということは
内部的に長さゼロの文字列は('\0')を持つことと同義ですよね。
うー納得いかねえ
503デフォルトの名無しさん:2005/07/08(金) 06:09:35
>>502
だからそういうコンストラクタはないっつーに。
std::string str(""); ならわかるが。
504デフォルトの名無しさん:2005/07/08(金) 06:46:10
>>503
うわーやっとわかりました。
いままで'\0'と"\0"の違いがわかってなかったです。
ありがとう君。
505デフォルトの名無しさん:2005/07/08(金) 06:59:31
0とNULLと'\0'と""の違いをSTLスレでやるなよな……。
506デフォルトの名無しさん:2005/07/08(金) 10:33:51
""と"\0"にも違いがある
507485:2005/07/08(金) 10:39:28
>>500
#include <vector>
std::vector<int>::iterator x(int* p) { return std::vector<int>::iterator(p); }
で通りますが…。
508485:2005/07/08(金) 10:41:48
連続すみません。
>>501を見落としてました。CodeWarriorでは駄目ですか。
>>507のようにしても駄目でしょうか。
509デフォルトの名無しさん:2005/07/08(金) 11:15:49
>>507 フーン
#include <vector>
std::vector<int>::iterator x(int* p) { return std::vector<int>::iterator(p); }

$ g++ -D_GLIBCXX_DEBUG -fsyntax-only
: In function `__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*,
  __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > > x(int*)':
:2: error: no matching function for call to `__gnu_debug::_Safe_iterator<
  __gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >,
  __gnu_debug_def::vector<int, std::allocator<int> > >::_Safe_iterator(int*&)'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/debug/safe_iterator.h:122: (略
510デフォルトの名無しさん:2005/07/08(金) 11:18:09
ミクロなことで勝ち誇るなよw
511485:2005/07/08(金) 15:43:43
>>509
おぉ。ありがとうございます。
手元のg++(3.3.1)ではg++ -D_GLIBCXX_DEBUG -fsyntax-onlyで通りますが、
3.4.4では駄目なのですね。
512485:2005/07/08(金) 15:55:56
というか、_D_GLIBCXX_DUBUGってg++(3.4)からなのですね。
知らないことだらけだ…。スレ違いご容赦。
513デフォルトの名無しさん:2005/07/08(金) 20:40:25
>>508
普通にコンパイルすると恥ずかしながら通った。#define _MSL_DEBUGすると
通らない。
エラー: 関数呼び出し '[std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>].__debug_iterator({lval} int *)' が一致しません。
std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator()'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator(const std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0> &)'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator<...>(const std::__debug_iterator<std::vector<int, std::allocator<int>>, __T1_0, 0> &)'
'std::__debug_iterator<std::vector<int, std::allocator<int>>, int *, 0>::__debug_iterator(const std::vector<int, std::allocator<int>> *, int *const &)'
main.cpp 行: 4  std::vector<int>::iterator x(int* p) {return std::vector<int>::iterator(p);}
514デフォルトの名無しさん:2005/07/09(土) 01:19:50
VC7.1 付属 STL の vector って、
vector<bool> 以外は clear するとメモリを開放するんですね。
意外でした。
515デフォルトの名無しさん:2005/07/09(土) 04:18:03
>>514
人はそれを環境依存と呼ぶ。
516デフォルトの名無しさん:2005/07/10(日) 08:16:17
配列の積和を行うinner_productというのがありますが
3つ以上コンテナの積和をSTLを使ってエレガントに実現
する方法はありませんか?
予定では3つから7つ程度のコンテナの積和が必要になり
ますが、できればSTLで実現したいと思っています。

以下自作コードです。

---------------------
template<class Iter1, class Iter2, class Iter3, class T>
T inner_product3( Iter1 f1, Iter1 l1, Iter2 f2, Iter3 f3, T init )
{
  for( ; f1 != l1; f1++,f2++,f3++ )
     init = init + ( *f1 * *f2 * *f3 );
  return init;
}

#include<iostream>

void main()
{
  int a[] = {1,2,3,4,5};
  int b[] = {1,2,3,4,5};
  int c[] = {1,2,3,4,5};

  int sum = inner_product3( a, a+5, b, c, 0 );

  std::cout << "sum=" << sum << std::endl;

}
517デフォルトの名無しさん:2005/07/10(日) 12:50:28
こんばんわ

文字列検索の案件をしてるんですが、
std::stringでfindを呼び出し解析をしてましたが、

ためしに、CString(MFC)に変えてFind検索をしたら
劇的に早くなりました。

その辺どうなのでしょうか?
開発環境はVCです。

これは単にSTLが重いということでよろしいのでしょうか?
518デフォルトの名無しさん:2005/07/10(日) 12:54:25
知らず知らずの内に一時オブジェクトを生成してる悪寒
519517:2005/07/10(日) 13:05:27
今、アプリケーションを、std::stringからMFCのCStringベースに変えました。

思わず笑っちゃいました。
あまりの処理速度の違いにですw
もちろんMFCのほうが速いんですが。
時間を計測したら50倍ほど早く処理できてますね。

アルゴリズムには問題はないと思ってましたので、
どうしてこんなに重いのかと悩んでたら、
癌はSTLでした。

STLを使うのはやめようと思います。
520デフォルトの名無しさん:2005/07/10(日) 13:23:43
>>519
あーはいはいそれはよかったね。
ここはお前の日記じゃないから。チラシの裏にでも書いてろ。
521デフォルトの名無しさん:2005/07/10(日) 13:24:22
>>519
ついでに書くと、std::stringはSTLじゃないから。馬鹿ですねー
522デフォルトの名無しさん:2005/07/10(日) 13:32:09
>>516
あんまりきれいじゃないけど
template<class Iter1, class Iter2, class Iter3, class T>
T inner_product( Iter1 f1, Iter1 l1, Iter2 f2, Iter3 f3, T init )
{
vector <T> tmp (distance (f1, l1));
transform ( f1, l1, f2, tmp.begin (), multiplies <T> () );
transform ( tmp.begin (), tmp.end (), f3, tmp.begin (), multiplies <T> () );
return accumulate ( tmp.begin (), tmp.end (), init );
}
523デフォルトの名無しさん:2005/07/10(日) 13:33:53
>>519
速度にこだわるならstrstrのほうがCString::Findより3倍近く高速ですよ( ´∀`)
524デフォルトの名無しさん:2005/07/10(日) 13:45:39
>>523
strstrの逆検索バージョンはあるのでしょうか?
525デフォルトの名無しさん:2005/07/10(日) 13:52:48
部分文字列検索だけなら、自分でB&M法でも使って組んだ方が
ずっと速いだろうに。
526デフォルトの名無しさん:2005/07/10(日) 13:56:00
527522:2005/07/10(日) 13:58:17
書いてみたけど
コンテナ増えたらIteratorでなめる回数が増えて遅くなりそうだ
たぶん516の方がマシですね
忘れて
528デフォルトの名無しさん:2005/07/10(日) 14:02:00
>>527
STLは、標準化の際に大幅に内容を削除されたからね。
元々3D用のinner_product3D() なんてアルゴリズムもあったのかもしれない。
529デフォルトの名無しさん:2005/07/10(日) 15:53:17
>>517,519 最適化されてないんじゃないの?
530デフォルトの名無しさん:2005/07/10(日) 17:23:10
>>517
VCについてくるSTLはあまりできがよくない。
STLPortを使うべきだろう。
531デフォルトの名無しさん:2005/07/10(日) 18:38:35
>>517,>>519は低脳だからほっとけ。
532デフォルトの名無しさん:2005/07/10(日) 21:17:11
コンパイラオプションによるんじゃないの?
533デフォルトの名無しさん:2005/07/10(日) 22:18:54
50倍っていうくらいだから
何か根本的なところで間違っている気がする
534デフォルトの名無しさん:2005/07/10(日) 22:51:18
たとえ50倍遅かったとして、それほど処理時間に差が出るものなのか
535デフォルトの名無しさん:2005/07/10(日) 23:09:16
>>534
50倍とか言われると流石に気になるだろ
給料50倍なら、2年働けば生涯年収越えちゃうんだぜ
536デフォルトの名無しさん:2005/07/11(月) 00:40:47
std::stringよりMFCのCStringの方が早いというのは事実とは思うんだけど、
MFCって今後どうなっちゃうんだろう?
537デフォルトの名無しさん:2005/07/11(月) 00:47:04
>>536 このスレでそっちに話を広げるなよ。
538デフォルトの名無しさん:2005/07/11(月) 00:55:21
どういう操作が遅いのかが全然わからんが、
察するに、参照カウント使って
共有してるかどうかの差が出たんじゃないか?
539デフォルトの名無しさん:2005/07/11(月) 01:02:07
文字列検索って深いテーマだと思うぞ。
簡単そうに見えるが。
540デフォルトの名無しさん:2005/07/11(月) 14:41:48
for_eachにかけるfunctorの中でとなりの隣のiteratorにアクセスできるの?
struc functor
{

operator()(Iterator it)
{
return (it+1)
}
}
541デフォルトの名無しさん:2005/07/11(月) 14:48:39
>>540
となりのとなり?
542デフォルトの名無しさん:2005/07/11(月) 16:01:03
>>540
Input Iterator なら隣に行ったらもう戻れない
Forward Iterator なら問題なし
it + 1 なんて書き方ができるのは Random Access Iterator
543デフォルトの名無しさん:2005/07/11(月) 16:16:28
for_eachに渡すfunctorってIterator受け取らないよね。
544デフォルトの名無しさん:2005/07/11(月) 16:45:07
じゃあリストの前後3要素の平均求めたい場合は
functorは使えないんだね

operator()( 今いるとこ)
{
return (前 + 今いるとこ + 後)/3;
}
545デフォルトの名無しさん:2005/07/11(月) 18:04:57
>>544
Bidirectional Iterator(--と++ができるイテレータ)を取ればできるんじゃ。
std::listは双方向リストなので、Bidirectional Iteratorが使える。

ただし、現実的には、過去2つの値をメンバ変数に保存しておいて、
現在の値との平均を返した方がよさそう。
// functorを使うということは、iterativeなアルゴリズムだろうから
546デフォルトの名無しさん:2005/07/11(月) 18:14:40
struct funct0 : public std::unary_function< void, int >
{
int* average;
int index;

funct0( int* average_ ) : average(average_), index(0){}

result_type operator ()( argument_type arg ) const
{
average[index++] += arg;
}
};

struct funct1 : public std::unary_function< void, int >
{
int* average;
int index;

funct1( int* average_ ) : average(average_), index(0){}

result_type operator ()( argument_type arg ) const
{
average[index] += arg;
average[index++] /= 3;
}

};
547デフォルトの名無しさん:2005/07/11(月) 18:15:12
void f()
{
std::vector<int> srcarr:
std::vector<int> average( arcarr.size() - 2, 0);
for_each( srcarr.begin() + 0, srcarr.end() - 2; func0(average));
for_each( srcarr.begin() + 1, srcarr.end() - 1; func0(average));
for_each( srcarr.begin() + 2, srcarr.end() - 0; func1(average));
}

流石に無理あるな。
548546-547:2005/07/11(月) 18:30:10
つーか間違いまくりorz
549543:2005/07/11(月) 20:51:29
>>544
こういうことがしたいの?
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>

int main() {
  using namespace std;
  int a[] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,};
  int size = sizeof(a)/sizeof(a[0]);
  vector<int> v;

  transform(a, a + size - 1, a + 1, back_inserter(v), plus<int>());
  transform(a, a + size - 1, v.begin() + 1, v.begin(), plus<int>());
  transform(v.begin(), v.end() - 1, ostream_iterator<int>(cout, "\n"), bind2nd(divides<int>(), 3));
}
550デフォルトの名無しさん:2005/07/11(月) 21:07:06
vector<Class*> v

このvの中のいくつかがヌルポインターなんだけど、どうやって消したらいいの?
551デフォルトの名無しさん:2005/07/11(月) 21:13:09
std::erase(std::remove(v.begin(), v.end(), static_cast<Class*>(0)), v.end());
552550:2005/07/11(月) 21:18:35
>>551
ありがとうございます。
せっかくだからもうちょっとわかり易く教えていただけますか?
553デフォルトの名無しさん:2005/07/11(月) 21:46:34
>>552
std::remove()は3つ目の引数に一致する要素を探し、それを列の後ろへ集める。
そしてその集めた部分の先頭の位置を返し、そこからend()までは今回ヌルポインタの要素が集まっている。
そこをerase()で削除すればいいというわけ。
554550:2005/07/11(月) 21:48:14
>>553

なんで2回も消しているのかわかったかもしれない。ちょっと試してみる。
555デフォルトの名無しさん:2005/07/11(月) 21:52:10
ヒント : std::remove()は並べ替えをするだけで削除は行わない。
556デフォルトの名無しさん:2005/07/12(火) 01:09:44
removeて名前付けに失敗してるよな

な?
557デフォルトの名無しさん:2005/07/12(火) 01:12:24
>>556
あぁ。SGIのドキュメントにも載ってるぜ。
ttp://www.sgi.com/tech/stl/remove.html#1
558デフォルトの名無しさん:2005/07/12(火) 01:17:42
そうかな。
俺はstlの「シーケンスを変更するアルゴリズム」はそういうものだと理解すべきだと思うが。
remove_copyとの対称性もあるし。
559デフォルトの名無しさん:2005/07/12(火) 01:54:39
>>558
計算機世界の語感的にremoveは削除の意味で使われるケースが多いと思うので(辞書的には「移動」だけど)
(remove_copyも含めて)やっぱりわかりにくいと思います。
move_backwardとかの方がベタでわかりやすい…。
560デフォルトの名無しさん:2005/07/12(火) 04:28:20
>>559
「後ろ向きに動く」????
561デフォルトの名無しさん:2005/07/12(火) 04:48:35
ダイエットにいいらしい。
562デフォルトの名無しさん:2005/07/12(火) 05:19:30
> 計算機世界の語感的にremoveは削除の意味で使われるケースが多いと思うので(辞書的には「移動」だけど)
??????
思わず辞書引いちまったじゃないかモルァ
563デフォルトの名無しさん:2005/07/12(火) 06:48:56
std::remove の動作って一言でズバっと言い表せないんだよな
564デフォルトの名無しさん:2005/07/12(火) 10:42:57
要らん物を除いて要素を前に詰めてって新しい最後尾の位置を返す
・・・長いな。

除く・詰める・最後尾を返す、の3点はどれも、省くと片手落ちの説明になるしなぁ。
565デフォルトの名無しさん:2005/07/12(火) 12:55:46
>>559
いや、俺は「削除」で良いと思う。
stlのアルゴリズムで要素を削除するというのは、それを後ろに移動して、
境目のイテレータを返すことに他ならない。
標準ライブラリなんだから、そういう知識を利用者に要求してでも
名前を簡潔にすることは正しい選択だと思う。
それに、こうやって理解しないと、removeとremove_copyを統一的に把握できない。
uniqueとunique_copyについても同様。
566デフォルトの名無しさん:2005/07/12(火) 16:26:01
>>553>>559>>565
君たちは根本的に勘違いしているj。

{1,0,5,7,0,6,4,0,4,8,3}
↓remove(..., 0);
{1,5,7,6,4,4,8,3,4,8,3}
                 ここを指すiteratorを返す
後ろに移動はしない。移動させる変な処理系もあるかもしれないが、それは定められた操作ではない。
567デフォルトの名無しさん:2005/07/12(火) 16:57:26
>>565
std::list::removeの動作はまた違うわけだが…

>>551
v.erase……
568デフォルトの名無しさん:2005/07/12(火) 17:01:02
>>566
まあその通りやね。
std::remove()の動作は、「削除した要素」は、「削除されなかった要素で
上書きされる」だから。
569559:2005/07/12(火) 20:45:16
>>566
なるほどっ。
「除外するけど除外されたやつのことは知らん」という感じですか。
exclude
570デフォルトの名無しさん:2005/07/12(火) 21:00:37
>>567
確かにコンテナのサイズを変えるような処理はメンバ関数じゃナイトで金罠
571デフォルトの名無しさん:2005/07/12(火) 21:05:07
>>569
うん、だからヒープオブジェクトへの頭の悪いポインタのコンテナに対して
迂闊にremoveやuniqueを使うとメモリリークする
572デフォルトの名無しさん:2005/07/13(水) 01:28:25
STLのコンテナってAllocator指定できんのにDeallocator指定できやんの?
573デフォルトの名無しさん:2005/07/13(水) 01:42:41
Allocator が deallocate もする
574デフォルトの名無しさん:2005/07/13(水) 02:52:26
>>572
アロケータのメンバ関数allocate()、deallocate()について調べてみ。
575デフォルトの名無しさん:2005/07/13(水) 22:55:15
MFCが50倍速い
っていうのがいまだに引っかかる

boostのホームページには
abstruction のコストは2倍ぐらいって
書いてあったんだけど
50倍って本当?
576デフォルトの名無しさん:2005/07/13(水) 23:12:21
>>575
たぶんdebug版でbuildして遅いとか言ってるんじゃないの?
もしdebug版を使っていたとすると、関数がinline化されなくて遅くなるから、それでSTLが癌と勘違いしたのでは。
俺はこの可能性が一番高いと思う。

まぁ単純にCStringが物凄い速い可能性もあるけど、さすがに50倍は無いと思う。
速度を計測してないから自信は無いけど。
577デフォルトの名無しさん:2005/07/13(水) 23:20:10
具体的に50倍の速度が生じるコード片を提示してもらわないことには何とも言えんわな
578デフォルトの名無しさん:2005/07/13(水) 23:31:27
>>576
あとは、CString 同士の Find() は最近の結果をキャッシュしているとかかな。
MFC は触ったことさえないが。
579デフォルトの名無しさん:2005/07/13(水) 23:59:38
つか、stringとかは、ヘッダ見れば大体のコスト分かるだろ。
まあ、50倍ってのは無知が適当に書いただけにしか見えんが。
580デフォルトの名無しさん:2005/07/14(木) 01:14:35
コンパイラが最適化したんじゃないの?、const文字列扱いで。
581デフォルトの名無しさん:2005/07/14(木) 01:15:35
はい、噂だけが先行してますね〜
582デフォルトの名無しさん:2005/07/14(木) 07:35:32
マルチったからこっちでも話題になっていた。
http://pc8.2ch.net/test/read.cgi/tech/1119793525/529-540
583デフォルトの名無しさん:2005/07/15(金) 03:49:04
stringからwstringに変換したいのですがうまくいきません. STLport4.6.1です
using namespace std;
wcout.imbue(locale("japanese"));
mbstate_t state = mbstate_t();

string in("波浪ワールド");
wstring out(in.size(),L'.');

cout << "Before:" << endl;
cout << in << endl;
wcout << out << endl << endl;

string::iterator in_it = in.begin();
wstring::iterator out_it = out.begin();

locale loc("japanese");
const codecvt<wchar_t,char,mbstate_t>& cdcvt = use_facet<codecvt<wchar_t, char, mbstate_t> >(loc);

cdcvt.in( state, in.begin(), in.end(), in_it, out.begin(), out.end(), out_it);

cout << "After:" << endl;
cout << in << endl;
wcout << out << endl;
584デフォルトの名無しさん:2005/07/15(金) 04:54:03
>>583
STLportにはstd::locale("japanese")なんか実装されてなかった希ガス。
585デフォルトの名無しさん:2005/07/15(金) 11:08:27
私の記憶が確かならば、STLport の codecvt ってか、ctype.widen は、
単に1文字ごとに static_cast< wchar_t > してただけだったような気がする。
586デフォルトの名無しさん:2005/07/15(金) 12:27:45
STLPortになければ自分でfacet書いてlocaleにブチ込めばよいじゃない
587デフォルトの名無しさん:2005/07/15(金) 15:42:46
結局、オープンソースはそうなっちゃうのよね>他力本願

金もらわずに半ば趣味で作ってる人がほとんどだから、
「規格はこちらで決めるから、後はwchar_t関連などは、それぞれの国で
実装してちょ」って感じなんでしょ。ほとんどが7bit圏の人ばかりだったり、
そうでなくても7bitで我慢している人がほとんどだろう。

日本なんかはまだ恵まれている方。
588583:2005/07/15(金) 18:27:07
locale loc("american");
const codecvt<wchar_t,char,mbstate_t>& cdcvt =
        use_facet<codecvt<wchar_t, char, mbstate_t> >(loc);
で成功しました.
stringのiteratorを渡せるのはreleaseモードの場合だけでした
c_locale_win32.cでMultiByteToWideCharを呼び出していました
589デフォルトの名無しさん:2005/07/15(金) 18:56:20
>>588
なんじゃそりゃ
localeの設定に関係なく、MultiByteToWideChar()で結局ACP依存の変換やっとるのか
バグっつーか腐ってるな
590デフォルトの名無しさん:2005/07/15(金) 19:07:08
>>589
バグではなくて、意図的な手抜きだろ。
591デフォルトの名無しさん:2005/07/15(金) 19:28:44
>>590
バグでしょ。あきらかに。>>588のコードで
CP932からUnicodeへの変換が行われるのが仕様通りだとでも?
592デフォルトの名無しさん:2005/07/15(金) 19:49:22
>>591
お前が直せ。これは手抜きだ。
593デフォルトの名無しさん:2005/07/15(金) 20:14:20
手で抜いてください。
594デフォルトの名無しさん:2005/07/16(土) 00:05:08
VC7.1のstd::char_traitsのcopyやmoveって間違ってないか?
FromとToの関係が逆なような希ガス

copy(_Elem *_First1, const _Elem *_First2, size_t _Count)
において、_First2 → _First1 の方向にコピってるようだが...
595デフォルトの名無しさん:2005/07/16(土) 00:06:16
まぁconstにはコピーできんわな
596デフォルトの名無しさん:2005/07/16(土) 00:13:17
>>595 そりゃそうだな。でもコメントには
// copy [_First1, _First1 + _Count) to [_First2, ...)
って書いてあるし、ヘルプにもそうある(゚Д゚)
597デフォルトの名無しさん:2005/07/16(土) 00:22:48
ごめんヘルプはそうじゃなかった。
コメントと、参考にしたこれ↓の説明文が間違ってた。
ttp://www.cc.nao.ac.jp/vppman/HTML/japan/langCpls/stl/stdref/cha_3696.htm#Value%20Functionscopy()
598デフォルトの名無しさん:2005/07/16(土) 00:55:14
class A{
  public:
  void scr(){
     std::cout << "A!" << std::endl;
    };
};

int main(){
   std::vector<A> AV;

   AV[8798].scr();
   
   return 0;
}

結果:
A!

釈然としないんですが、規格上こうなんですか?
599デフォルトの名無しさん:2005/07/16(土) 01:03:37
>>598
偶然。
ってかA::scr()がAのプロパティに触らないからアクセス違反が起きないだけ。
600デフォルトの名無しさん:2005/07/16(土) 01:28:17
メソッド呼び出しよりAV[8798]の方が問題
601デフォルトの名無しさん:2005/07/16(土) 01:36:02
いや、だから、何でそれでエラーが起きないかって話しなんだが。
602598:2005/07/16(土) 01:41:01
>>599
いや、まあそうなんですけど
スルーしちゃうのはどうかなと
vectorの速度を落とすようなチェックは要らんということでしょうか

603598:2005/07/16(土) 01:42:46
とりあえず偶然ということで納得しました
ありがとうございます。
604デフォルトの名無しさん:2005/07/16(土) 01:44:07
>>602
そこにチェックが入って速度落とされちゃたまらないからね。

標準ライブラリの実装によっては、デバッグモードを使えば安心できるかもしれない。
605デフォルトの名無しさん:2005/07/16(土) 01:54:50
operator[]()はチェックなし。
at()はチェックする(範囲外は例外を投げる)。

使い分けできるようになってんだよ。
606デフォルトの名無しさん:2005/07/16(土) 02:29:51
マイクロソフトはなんでSTLのiostreamとstring,wstringなどをある程度扱うDLLを
Windows標準添付にしないのか、なぜもっとc++をプッシュしないのか?
607デフォルトの名無しさん:2005/07/16(土) 07:35:24
>>606
msvcpXX.dllならWin98のあたりから標準搭載だけど。
608デフォルトの名無しさん:2005/07/16(土) 07:37:57
>>606
他をプッシュしてるということでは?
609デフォルトの名無しさん:2005/07/16(土) 08:49:57
>>606
>STLのiostreamとstring,wstringなどを
帰れ。
610デフォルトの名無しさん:2005/07/16(土) 11:11:48
配列の中に、ベクタを作成したいのだけどどうすればいいのでしょうか?

ベクタ型の配列

  [0] vector<int> 〜
  [1] vector<int> 〜
  [2] vector<int> 〜
  [3] vector<int> 〜
611デフォルトの名無しさん:2005/07/16(土) 11:19:26
vector<int> v[n];
でできました。すみません。
612デフォルトの名無しさん:2005/07/16(土) 11:34:29
vector<vector<int> > v;
のほうがいいんじゃない?
613デフォルトの名無しさん:2005/07/16(土) 11:40:46
>>612
元のほうは可変の必要が無いので大丈夫です。有難う御座います。
614デフォルトの名無しさん:2005/07/16(土) 20:43:38
598って、偶然なの?
仕様どおりな希ガス
615デフォルトの名無しさん:2005/07/16(土) 20:48:42
>>614 未定義動作
616デフォルトの名無しさん:2005/07/16(土) 20:54:20
char a[10];

printf("%p", a + 4096);

は未定義ということでいいのかな?
参照剥がししない限り、こういうコードは問題なく動く処理系が
多いとは思うけれど。
617デフォルトの名無しさん:2005/07/16(土) 20:55:16
>>615
ちなみに、どこが未定義ですか?
618デフォルトの名無しさん:2005/07/16(土) 20:56:42
未定義。
a+10までは大丈夫だけど
ただし*(a+10)は未定義
でも&*(a+10)は大丈夫
619デフォルトの名無しさん:2005/07/16(土) 21:01:08
620デフォルトの名無しさん:2005/07/16(土) 21:04:21
>>618
>>616はどこも参照剥がし
*(a+10)
をしていないと思うんだが。

ついでにいえば、>>598も、thisポインタは必要だが
参照剥がしはしないから動くんだと思うんだが。
621618:2005/07/16(土) 21:09:20
>>616が参照剥がしをしている
なんて一言も言ってないが。
622デフォルトの名無しさん:2005/07/16(土) 21:09:30
関係ないが>>598はscr()定義の直後にある無駄なセミコロンが気になる
623デフォルトの名無しさん:2005/07/16(土) 21:12:42
std::stringにフォーマット出力はないんか?
624デフォルトの名無しさん:2005/07/16(土) 21:13:02
operator[] が例外を投げないとは限らない
at と同じ実装である可能性もある
625デフォルトの名無しさん:2005/07/16(土) 21:15:43
>>621
じゃあ、一行目の「未定義」ってのは、何が未定義だと言ってるんだ
626デフォルトの名無しさん:2005/07/16(土) 21:16:32
>>624
operator[]が例外を投げるのなら、未定義動作にはならないと思う
627624:2005/07/16(土) 21:18:05
おれは >>598 の結果が仕様どおりではないと言いたいだけ。
未定義云々の話はしてない。
628デフォルトの名無しさん:2005/07/16(土) 21:18:06
もしかして>>621って聞かれてもいないことについて、勝手に自分で
例を作ってそれを未定義だと言ってるだけ?

アフォじゃないの?
629デフォルトの名無しさん:2005/07/16(土) 21:18:28
>>616
...は未定義ということでいいのかな?
を受けて、言ってるんだが。
読解力無いのか?
630デフォルトの名無しさん:2005/07/16(土) 21:18:59
>>629
で、参照剥がしはしていないんだが、なんで未定義なの?
631デフォルトの名無しさん:2005/07/16(土) 21:21:16
あーごめん
>>618は「最後の一個後の要素」の扱いについて、親切に解説を加えてある
だけなのね。
誤読してたわ。
632デフォルトの名無しさん:2005/07/16(土) 21:26:31
つまり、AV[0].scr(); ならば、規格どおりとそういうことか?
633デフォルトの名無しさん:2005/07/16(土) 21:28:22
>>632
AV.empty() なので AV[0] も規格に従い未定義動作です。
634デフォルトの名無しさん:2005/07/16(土) 21:47:39
class A{
  public:
  static void scr(){
     std::cout << "A!" << std::endl;
    };
};

int main(){
   std::vector<A> AV;

   AV[8798].scr();
   
   return 0;
}

これなら規格通りだろ?
635デフォルトの名無しさん:2005/07/16(土) 21:51:00
>>634
それだとAV[8798]を評価せずともscr()を呼び出せるけど
AV[8798]を評価するならば、その時点で未定義になるんじゃないの

636デフォルトの名無しさん:2005/07/16(土) 22:00:51
>>635
「規格通り」って何が言いたいんだ?
とりあえず、そのコードが未定義動作を引き起こしても規格通りだよ。
637636:2005/07/16(土) 22:01:28
アンカーミスった。 >636 は >>634 宛て。
638デフォルトの名無しさん:2005/07/16(土) 22:05:10
>>623
printf/scanfがcout/cinになったように<sstream>に<<と>>で入出力するstringstreamがある。
639デフォルトの名無しさん:2005/07/16(土) 22:06:27
C/C++なんでも質問スレはここですか?
640デフォルトの名無しさん:2005/07/16(土) 22:08:26
>>634
staticメンバ関数呼び出し時のメンバアクセス演算子の左辺は常に評価される。
641デフォルトの名無しさん:2005/07/16(土) 22:08:55
>>639
いいえ違います。
642デフォルトの名無しさん:2005/07/17(日) 00:24:17
>>634
VC7.1+STLportで追いかけてみたけど、operator[]で、AV[8798]
のアドレスを計算していたけど、その後のメンバ関数コールは静的に
解決されていて、折角計算したアドレスは使用してなかった。

これが仮想関数だったりすると、動的解決なので、まずクラッシュ
するだろうな。
643デフォルトの名無しさん:2005/07/17(日) 00:31:23
>>642
へえ、最適化してもわざわざAV[8798]評価してるんだ。意味無いのに。
それともデバッグ版のコードの話?
644デフォルトの名無しさん:2005/07/17(日) 00:40:20
>>643
STLportのデバッグじゃないけど、VCのデバッグで最適化無しのコード。
最適化したら、コード通りにバイナリ吐いてくれない事があるから。
645デフォルトの名無しさん:2005/07/17(日) 00:43:29
これならやっぱりクラッシュした。

class A {
public:
 virtual void scr() {
  std::cout << "A!" << std::endl;
 }
};

int main()
{
 std::vector<A*> AV;

 AV[8798]->scr();
}
646デフォルトの名無しさん:2005/07/17(日) 00:43:55
>>644
最適化無しなら、評価してる限りコードが出るのは当然だな。

って、オマエ、コード通りのバイナリ吐く最適化なんて意味無いじゃん。
最適化の意味わかってんのか?
647デフォルトの名無しさん:2005/07/17(日) 00:49:50
>>646
お前の噛み付き方だけが意味不明だぞ。
ちょっと落ち着けよ。
648デフォルトの名無しさん:2005/07/17(日) 02:24:13
>>646
何でも噛みつけばいいってもんじゃないよ、知ったかぶりさん。
649デフォルトの名無しさん:2005/07/17(日) 02:43:48
>>646
まあまあ、ちょっと落ち着いて。
650デフォルトの名無しさん:2005/07/19(火) 00:41:20
>>646
落ち着けっ!
落ちぼああああああ着がはぁあああああああああああ!!
651デフォルトの名無しさん:2005/07/19(火) 05:49:05
>>650 オチツケ
652デフォルトの名無しさん:2005/07/19(火) 11:35:25
結構ひっぱるなぁ みんな。なかなかオチがつかない・・・









ごめんなさい、ごめんなさい、ごめんなさい、暑さで脳をやられてます。
653デフォルトの名無しさん:2005/07/19(火) 11:52:36
>>646のプロジェクトがデスマ中のようです
ω・`)っ旦旦 冷えた麦茶ドゾー
654デフォルトの名無しさん:2005/07/20(水) 01:13:38
template<calss T>
void func()
{
vector<T> ve;
vector<T>::iterator itrt = ve.begin(); *
}

*でコンパイルエラーが出るのですが、どのように記述すればいいのでしょうか?
655デフォルトの名無しさん:2005/07/20(水) 01:17:56
>>654
class Tとか。std::vectorとか。typename vector<T>::iteratorとか
656デフォルトの名無しさん:2005/07/20(水) 01:21:14
>>655
ありがとうございます
試してみます
657デフォルトの名無しさん:2005/07/20(水) 19:34:03
>>10
Visual Studio .NET 2003を使っています。
STLを使おうかと思ってるのですが、VS2003のSTLも糞ですか?
SGIやSTLPort版を使うべきですか?

エロイ人教えて!
658デフォルトの名無しさん:2005/07/20(水) 20:15:18
先ずは使ってみよ。
659デフォルトの名無しさん:2005/07/20(水) 23:25:08
>>657
STLPortを使え
660デフォルトの名無しさん:2005/07/20(水) 23:56:35
VC 7.1はDinkumwareじゃなかったっけ?
ソースのなかにP.J. Plaugerという署名がポロポロ……

661デフォルトの名無しさん:2005/07/20(水) 23:58:16
>>660
ポロポロがボロボロに読めて吹き出してしまったよ
662デフォルトの名無しさん:2005/07/21(木) 12:13:22
Visual StudioのSTLを悪く言う人がいるけど
STLPortとくらべて具体的にどこがどう悪いのか指摘してくれないかな。
昔は確かに問題が多かったけど最近はよくなってきてると思うけど。
663デフォルトの名無しさん:2005/07/21(木) 16:00:02
>>662
それは逆に君が
VCSTLが以前と比べどのように改善したのか
述べてくれるといいと思うよ。
664デフォルトの名無しさん:2005/07/21(木) 17:24:29
関数ポインタをvectorにしたいのですが、具体的な記述がよくわかりません。
vector<void (__cdecl *)()> pf;
これではエラーでした。
どうすればいいのでしょうか?
665デフォルトの名無しさん:2005/07/21(木) 17:53:02
うちはこんな感じで通ったけど。

void
foo()
{
  cout << "hello, world" << endl;
}

int
main()
{
  vector<void(*)()> pf;
  pf.push_back(&foo);
  (*pf.begin()) ();
  return 0;
}
666デフォルトの名無しさん:2005/07/21(木) 18:08:45
>>665
ありがとうございます。
以下でやったら通りました。ありがとうございました。

void f::f1(){
AfxMessageBox("f2");
}
void f::fmain()
{
vector<void (*)()> pf;
pf.push_back(&f::f1);
}
667デフォルトの名無しさん:2005/07/21(木) 20:31:28
>>666
そのf::f1へのポインタ型はvoid (*)()だけど、
もしstaticじゃなければその関数へのポインタ型はvoid (f::*)()になる。
668デフォルトの名無しさん:2005/07/21(木) 20:32:00
もちろんfがクラスだとしての話。
669デフォルトの名無しさん:2005/07/21(木) 21:23:58
>>667
すみませんstaticじゃ無いほうがいいんでアドバイスどおり
void (f::*)()
とやったんですが、以下の部分でコンパイルが通りません。
  (*pf.begin()) ();
670デフォルトの名無しさん:2005/07/21(木) 21:57:59
>>669
インスタンスが無いんじゃないの?

pf.push_back(&f::f1);
f F;
(F.**pf.begin())();
671デフォルトの名無しさん:2005/07/21(木) 22:02:58
>>670
メンバ関数の中でそのメンバの関数ポインタを呼んでるので、
インスタンスは呼ばなくていいんじゃないのですか?

error C2171: '*' : オペランドが不正です。
というエラーになります。
672デフォルトの名無しさん:2005/07/21(木) 22:12:25
>>669
void f::fmain()
{
  vector<void (f::*)()> pf;
  pf.push_back(&f::f1);
  (this->*pf.front())(); //(this->*(*pf.begin()))()相当
}
.*と->*はそれぞれ1つの演算子で、.や->と*には分けられないからthisを補う必要がある。
pf.front()は先頭要素を返すから*pf.begin()相当。
673670:2005/07/21(木) 22:15:06
>>671
あ、しつれい。f::mainなのね。
>>672氏の通りで、どのみちインスタンスを明示しないと呼べないです。
674デフォルトの名無しさん:2005/07/22(金) 11:25:35
>>672-673
コンパイル通りました。
回答ありがとうございました。
675デフォルトの名無しさん:2005/07/22(金) 13:11:11
std::iterator_traits<std::list<int const>::iterator>::reference
が VC7,1 の STL では int& になってしまうのですが、これは正しいのでしょうか?

std::list<int const> l(1, 1);
*l.begin() = 2;
l.back() = 3;

がコンパイルを通ってしまい複雑な心境です。
676デフォルトの名無しさん:2005/07/22(金) 14:23:41
>>675
int constって値の要件を満たしてないので
コンテナに入れられないような気がする
677675:2005/07/22(金) 21:02:15
>>676
言われてみればそうでしたね。
vector や deque 以外は、コンテナに入る型が
assignable じゃなくても良いのだと勘違いしていました。
678662:2005/07/22(金) 21:44:51
>>663
>それは逆に君が
>VCSTLが以前と比べどのように改善したのか
>述べてくれるといいと思うよ。
いかにも2ch的な反応ですね(苦笑)

それでは実際に自分が体験した範囲でだけ述べます。
Ver6と.NET2003との比較では
1.streamクラスでメモリーリークが起きていた。
2.string::push_backが極端に遅かった。
この2点が改善されています。

STLPortとの比較ではVer6の頃コンテナクラスの速度を
比べてみたことがありますががSTLPortの方がやや早かった(数%〜十数%)
記憶があります。
この点は最近テストしてないのでどうなっているかはわかりません。
679デフォルトの名無しさん:2005/07/22(金) 23:34:04
パフォーマンスの改善もさることながら、一番大きいのは、
仕様の間違いが修正されてる点でしょ。
例えば、list::sort()の比較関数がちゃんと利用できるようになってる点とか。
680デフォルトの名無しさん:2005/07/22(金) 23:38:28
VC6では使えてなかったのかよ
681デフォルトの名無しさん:2005/07/23(土) 00:00:05
ベンチとって比較してみればいいのに
682デフォルトの名無しさん:2005/07/23(土) 00:38:15
>>680
メンバ関数テンプレート?
683デフォルトの名無しさん:2005/07/23(土) 00:43:52
>682
ああ、なるほどそれのせいか。
684デフォルトの名無しさん:2005/07/29(金) 20:39:18
適当なクラスを取るvectorを作って
vector<Choge> v; のように宣言し
v.push_back(v()); とすると
Chogeのコンストラクタが呼ばれるのは分かるんですが
デストラクタまで呼ばれてしまうのは何故でしょうか?
また、呼ばれないような使い方はありますでしょうか?
どなたかご教授頂けると幸いです
685684:2005/07/29(金) 20:44:07
v();って何だ・・・
v.push_back(Choge());
の間違いです。
686デフォルトの名無しさん:2005/07/29(金) 20:46:34
>>684
v.push_back(CHoge());の間違いだよな。
v.push_back(CHoge())ではこんな流れになる。
CHogeの一時オブジェクトが作られる。(コンストラクタが呼ばれる)
push_backの中の人がvの末尾に引数のコピーが作る。(コピーコンストラクタが呼ばれる)
式が終わったので一時オブジェクトが破壊される。(デストラクタが呼ばれる)

その後、vのデストラクタで要素の開放が行われ、CHogeのデストラクタが酔うその数だけ呼ばれる。

つまりちゃんとコピーコンストラクタを用意すれば無問題。
コピーコンストラクタのコストがどうしても無視できないほど馬鹿でかければ生ポインタやスマートポインタをvectorの要素にする。
687デフォルトの名無しさん:2005/07/29(金) 21:21:10
>>686
お早いレス感謝です。
v.push_backの挙動について、一時的にオブジェクトが作られるため
デストラクタが必然的に呼ばれるということですね。
デストラクタ内の処理を、一時オブジェクトに行わせたくない
部分を隔離する事で解決しました。
ありがとうございました。
688デフォルトの名無しさん:2005/07/29(金) 22:46:55
>>687
隔離?どうやって隔離するのん?
689デフォルトの名無しさん:2005/07/30(土) 00:20:07
確保したメモリを開放しないとか?((((((;゚Д゚))))))ガクガクブルブル
690デフォルトの名無しさん:2005/07/30(土) 03:12:46
なんでresize使わないの?
691デフォルトの名無しさん:2005/07/30(土) 19:47:42
vector<string> vc;
if (!vc.empty()) vc.clear();
cout << "\nEnter a filename of a collection of strings to sort: ";
cin >> filename;
userin.open(filename);
while(userin)
{
userin >> temp;
vc.push_back(temp);
}
userin.close();
としてCase文でファイルにかかれている文字列をVectorに格納しようとしてるの
ですが、ファイル実行後、1回目はうまく読み込んでくれるものの、2回目にファイ
ルを読み込もうとするとプログラムviolationが表示され、強制的にプログラムを
停止しなくてはいけなくなってしまいます。clearの利用方法が間違っているので
しょうか。アドバイスなどありましたら、よろしくお願いします。
692デフォルトの名無しさん:2005/07/30(土) 19:57:11
>>691
Case文ってなんだ? filename, userin, temp の型は?
とりあえず、 vector はデフォルトで空だから最初の clear() は要らない。
693デフォルトの名無しさん:2005/07/30(土) 20:07:51
>>692
レスありがとうございます。型は
char menu, filename[80];
ifstream userin;
string temp = "aaaaa";
となっています。
while (done != 1){
cout << "1: ファイルを読み込む." << endl;
cout << "9: Exit." << endl;
cout << "command? : ";
cin >> menu;

switch (menu) {
case '1'{
if (!vc.empty()) vc.clear();
  :
  : //691の内容
}
break;
case '9':done = 1;
break;
default: cout << "Invalid Command Try Again." << endl;
のように、2回目以降ファイルを読み込む際に、vcの中身をclearしようとしてい
るのですが、コンパイル後にプログラムを実行すると下記のエラーが表示されて
しまいます。
Unhandled exception at 0x0041f156 in hw5.exe: 0xC0000005: Access violation reading location 0x00000018.
694デフォルトの名無しさん:2005/07/30(土) 21:07:40
>>693
clearしないとどうなる?
695デフォルトの名無しさん:2005/07/30(土) 21:26:54
>>693
落ちるのはvc.clear()であってvc.empty()でないのは確実かい?
全然関係ない落ちが待ってそうな悪寒。
696デフォルトの名無しさん:2005/07/30(土) 21:30:16
>>694
if (!vc.empty()) vc.clear();をコメントアウトし、clearしないで、再度vectorにpush_backしようとしても前の情報が残ったまま、上書きしてくれないようです。結局前に保存した情報が表示されてしまいます(TДT)
697デフォルトの名無しさん:2005/07/30(土) 21:40:35
>>695
今試しにclear()だけにもしましたが、同様にコンパイル後、実行時にviolationがで
てしまいます。 あと>>696の追記ですが、if文の一行をコメントアウト時はプログラ
ム実行後もviolationは表示されません。結果をプリントアウトしても1度目に読み
こんだ内容と同じものになってしまいます。なんだろう、、バッファとかそういった問題
でしょうか。
698デフォルトの名無しさん:2005/07/30(土) 21:43:46
>>696
落ちるのはその表示じゃないの?
1回目はfile読み込み成功して2回目は失敗してない?
699デフォルトの名無しさん:2005/07/30(土) 21:44:10
>>697
情報小出しウザイ。エラーが再現するソース貼れ。
700デフォルトの名無しさん:2005/07/30(土) 21:47:50
>>697
どこで落ちるか調べるのにステップ実行できないの?
それがダメなら昔ながらのprintf()挟みまくり。
怪しい箇所をコメントアウトして全体を実行しても見当外れのことがあるよ。
701デフォルトの名無しさん:2005/07/30(土) 22:21:21
>>691の例ではvcがif (!vc.empty()) vc.clear();のすぐ上で作られてるけど、
>>693では無くなってるよな。

どうせ>>691のvc生成の記述はデタラメで、本当は別のところに、
まだこのスレで説明していない形で書いてあるんだろ。だから>>696のようなことが起こる。

情報小出し野郎が示した乏しい情報が、一発目の冒頭からいきなり
実際と違っているケースはよくあるが、今回もそれなんじゃないかと。
702デフォルトの名無しさん:2005/07/30(土) 22:21:21
>>698
試しに別のcaseオプションを作り、clear()させて、内容がなくなっているのを確認し
てから読み込んでも同様の結果になってしまうので、この文かと思います。
>>699
すいませんでした。↓にあげましたので、よろしくお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/820.txt
問題のif文はコメントアウトしてある状態です。
>>700
今ステップ実行というものを試してみました。700さんの言うとおり、なんか違う場所が原因のような気がしてきました。(userinかも、、)もう少し、試してみます。
703デフォルトの名無しさん:2005/07/30(土) 22:37:41
userin.close();
のすぐ下に
userin.clear();
を入れたらどうなる?
704デフォルトの名無しさん:2005/07/30(土) 22:50:24
>>702
@@ -107,7 +106,6 @@
string temp = "aaaaa";
string max="A",min="Z";
int exchange=0, compare=0;;
- ifstream userin;

vector<string> vc;
vector<string>::iterator it;
@@ -129,17 +127,16 @@
{
case '1':
{
- //if (!vc.empty()) vc.clear();
+ vc.clear();
cout << "\nEnter a filename of a collection of strings to sort: ";
cin >> filename;
- userin.open(filename);
+ ifstream userin (filename);
while(userin)
{
userin >> temp;
vc.push_back(temp);
}
- userin.close();
for (int i=0;i<vc.size()-1;++i)
705デフォルトの名無しさん:2005/07/30(土) 22:55:19
>>703
はい、 userin.clear(); をつけるまでは、ステップ実行した時に while(userin) の
ループに入っていなかったのが、付けたことによってキチンとvectorに保存できるよう
になりました。しかしまだ上に記述しなかった別の場所に問題があるようなので、今
からそれを調べてみようと思います。ありがとうございます。
706デフォルトの名無しさん:2005/07/30(土) 23:06:01
>>704
ありがとうございます!なんだかウソのように直りました! 違いについては今から勉強し
てみます。本当にありがとうございました。
707デフォルトの名無しさん:2005/07/30(土) 23:09:37
>>706
いずれの回答も、キーワードは「ストリームの状態フラグ」だ。
708デフォルトの名無しさん:2005/07/30(土) 23:22:47
>>707
関連した参考ページをたくさん見つけることができました。ご親切にありがとうござい
ます。あとSTLのスレなのに、汚してすみませんでした。
709デフォルトの名無しさん:2005/07/30(土) 23:33:07
なんだ、std::ios::failbitの下げ忘れか。
710デフォルトの名無しさん:2005/08/03(水) 15:52:31
>>686
>コピーコンストラクタのコストがどうしても無視できないほど馬鹿でかければ生ポインタやスマートポインタをvectorの要素にする。
一旦、空のデータをpush_backして
data[data.size()-1].setValue();
のほうがコスト少なくない?

711デフォルトの名無しさん:2005/08/03(水) 16:55:04
SETまたはxtreeを修正し、データの比較回数、移動回数を調べたいのですが、
そういった場合は、xtreeの中にカウンターを設けるべきでしょうか。何かアドバイスな
どありましたら、よろしくお願いします。
712デフォルトの名無しさん:2005/08/03(水) 17:04:19
>>710
コピーコンストラクタのコストが無視できないほど馬鹿でかい時って、
大抵は「引数をとらないコンストラクタ + データセット」のコンボも負けずにでかくないか?
713デフォルトの名無しさん:2005/08/03(水) 19:13:15
>>711
xtreeなんて標準にないぞ。まぁ、他スレでVCのSTL弄れっていう宿題を
質問している香具師だろうけど
714デフォルトの名無しさん:2005/08/03(水) 22:07:53
>>710
一般的には、
push_back() の時点でコピーコンストラクタが呼ばれるんだから意味が無い。
格納する型が「空」という状態を持つとは限らない。

つまり、格納する型が「空」という状態を持ち、且つ
「空」のインスタンスのコピーはコストが無視できるという条件付きで
そのやり方のほうがコストが少ない。
715デフォルトの名無しさん:2005/08/03(水) 22:10:43
boostとかにコピーコンストラクターのコストかからない配列ないの?
716デフォルトの名無しさん:2005/08/03(水) 22:16:45
>>715
boost::shared_ptr<std::vector>
boost::shared_array
717デフォルトの名無しさん:2005/08/04(木) 01:55:17
だからなんでresize使わないの……
718デフォルトの名無しさん:2005/08/04(木) 08:51:53
resize使うとコンストラクターの初期化処理がされなかったような.
class CData{
public:
int *pointer
int data
CData()pointer(&data) {}
setVal(int v){data=v}
};
std::vector<CData> dataArray;
dataArray.resize(100).
dataArray[3].setVal(3);
std::cout << *dataArray[3].pointer;
どうなると思う?
719デフォルトの名無しさん:2005/08/04(木) 09:53:56
>>718
デフォルトコンストラクタとデストラクタはちゃんと呼び出されます。
嘘書くな。
720デフォルトの名無しさん:2005/08/04(木) 11:37:21
だいたい、「コンストラクターの初期化処理」ってなんだよw
721デフォルトの名無しさん:2005/08/04(木) 12:06:30
>>718-719 コピーコンストラクタも忘れるなよ。
722デフォルトの名無しさん:2005/08/05(金) 14:17:44
CData::CData() : data(0) //←コンストラクタの初期化処理ってこれのことか?
{}
723デフォルトの名無しさん:2005/08/05(金) 14:45:41
下記のプログラムでエラーを吐かれるのですがどうしたらいいでしょうか。
#include <vector>
#include "position.hh"
int main(){return 0;}

position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
position.hh:15: error: invalid use of ‘::’
position.hh:15: error: ‘Vector3’ declared as an ‘inline’ field
position.hh:15: error: expected ‘;’ before ‘<’ token
position.hh:17: error: ‘Vector3’ has not been declared
position.hh:17: error: expected ‘,’ or ‘...’ before ‘<’ token
position.hh:18: error: ‘Vector3’ has not been declared
...

position.hhの15行目 inline Vector3<float>& get_pos();

position.hhでもSTLはまったく使っていないのですが、
自前テンプレートクラスのVector3の部分でエラーが出ます。。
また、STLをインクルードしないでposition.hhを使っている分にはエラーは出ないのですが。
724デフォルトの名無しさん:2005/08/05(金) 14:50:47
>>723
・インクルードする順番を変えてみる。
・position.hhの1-15行を晒してみる。
725デフォルトの名無しさん:2005/08/05(金) 14:51:43
>>724
Vector3がtemplateクラスとして宣言されてないように見えるな
726デフォルトの名無しさん:2005/08/05(金) 15:02:30
インクルードの順番を変えたら違うエラーが。。
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:426: error: ‘vector’ is not a template
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:821: error: wrong number of template arguments (2, should be 1)
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:426: error: provided for ‘template<class _Alloc> class std::vector’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h: In member function ‘void std::vector<_Alloc>::swap(int&)’:
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:823: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:824: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/stl_bvector.h:826: error: request for member ‘_M_impl’ in ‘__x’, which is of non-class type ‘int’
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/bits/vector.tcc: At global scope:
...
727デフォルトの名無しさん:2005/08/05(金) 15:03:34
position.hhの頭は、
#ifndef _POSITION_H
#define _POSITION_H

#include "vector.hh"


namespace namae {

/*!
@brief 3d position class
*/
class Position
{
public:
inline Vector3<float>& get_pos();
inline const float* get_pos_vec(); //irane('A`)
inline void set_pos(Vector3<float>& spos);
inline void move_pos(Vector3<float>& spos);

protected:
Vector3<float> pos;

};
}
こんなかんじです。
728デフォルトの名無しさん:2005/08/05(金) 15:04:29
Vector3は
template<class Ctype>
class Vector3
{
protected:
//class member value
union {
struct {
Ctype x, y, z;
};
Ctype vec[3];
};
...
と、templateクラスなんです。(今まで普通に使ってきましたし)
729デフォルトの名無しさん:2005/08/05(金) 15:05:04
vector.hhの中身は?
Vectorもnamespace namaeに入ってる?
違うならusingか::指定が必要だが
730デフォルトの名無しさん:2005/08/05(金) 15:05:36
postion.hhでusing namespace stdしていて、vector内の宣言とぶつかっているとか?
731デフォルトの名無しさん:2005/08/05(金) 15:07:00
vector.hhはVecotr2,Vector3,Vector4が宣言してあって、
全部namespaceに入ってます。。
732730:2005/08/05(金) 15:07:31
うわ、既に貼られてたか。
vector.hh内でvector内の宣言と名前がぶつかっているって落ちっぽいね。
namespaceをきちんと正しく宣言し、無闇とusing namespaceしないこと。
733デフォルトの名無しさん:2005/08/05(金) 15:30:28
vector.hhのusing namespaceを消してnamaeeee::に置き換えましたが、エラーは消えず。
手作業で疲れました。。
734デフォルトの名無しさん:2005/08/05(金) 15:45:44
>>723
>position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
>position.hh:15: error: invalid use of ‘::’
invalid use of ‘::’の::はどれ?
晒してる?
735デフォルトの名無しさん:2005/08/05(金) 15:47:01
情報を小出しにする人って嫌い。どっかのロダにプログラム毎上げれ。
736デフォルトの名無しさん:2005/08/05(金) 16:15:01
ttp://ccfa.info/cgi-bin/up/src/up14501.gz
すいません、これです。
SDLとか使ってるし、makefileは自分専用もいいとこ(かつグチャグチャ)ですが。
もうSTLは使わない方向でいこうかと思い始めました。。
737デフォルトの名無しさん:2005/08/05(金) 16:26:50
>>736のbklで main.cppとして>>723の3行を貼り
g++ (GCC) 3.3.5 (Debian 1:3.3.5-13)
で-Wallでコンパイルしてみたが
何も言わずコンパイル成功。。
738デフォルトの名無しさん:2005/08/05(金) 16:38:44
マジデスカ。
私の環境が悪いのかしら。gcc バージョン 4.0.1 20050727 (Red Hat 4.0.1-5)
739デフォルトの名無しさん:2005/08/05(金) 16:49:08
makefileが腐っているか、ディレクトリを別けてtestでやってるのがダメなのかと思い
bkl内に>>723のmain.ccを作る。これで>>737とまったく同じ状態だとおもうんですが、結果は
g++ main.cc
position.hh:15: error: ISO C++ forbids declaration of ‘Vector3’ with no type
position.hh:15: error: ‘Vector3’ declared as an ‘inline’ field
position.hh:15: error: expected ‘;’ before ‘<’ token
position.hh:17: error: ‘bkl::Vector3’ has not been declared
...
涙そうそう
740デフォルトの名無しさん:2005/08/05(金) 17:38:05
>>739
関係ないのかも知れんないけど
このへんはどうかな?
$ cat morio2.diff.gz.base64
H4sICIIj80IAA21vcmlvMi5kaWZmAKVVwY6bMBA9l6+YXiIWcAC3dBPSriL1XvXUS1WtCJBd
VIKRYVF3q/57DQYCxHZIwsXAe/NmPH4aR8l+D+jlG4UDoQnBS0Kf7IKG9u53auekSMqEZMvn
5xYWQRpC6Ez0O+w4HnJWyPHA9XwP+9hbOt0DprN2HM00TUWWkcS9j1c+/nQisd0CcrHlsm++
bLcahGlQFPC9ldLgrwb5yy5NQl9DAEmWJlkMP+KwJPTD531KgvJhAU9x+ciy63ebASkkWVFC
QzE6xmMVh2NWRZIIijae7cL3p+IFQ05DDqSKz8aYoCqVoaoaGTy7uI47qyoAYE2lpGRwHPn1
95gJjLfRIpXZqiZAYLUekBmtJ1xrM7EAM9nax1hosvuV5a7B5Ettsn7D+tfyNWcn+seC9u21
f3vjreqY/Kg4tq9+/qrR2hRd6xrkAUge04D9AKTf8ePdqFhmqzvGF1DJgxeD6C/ScGVWdFNW
dGVW46asxpVZ7Zuy2lfvlTslnLu3jn5mL5eo2kPV4ygSWlQET7w5bNmRrnAjb5I48WXKU8fJ
lY0LlaeukivbFypPnaOqeXqqslLVx3nqDllhRx2oR1x3zcyYhj1VMA6b+9z5aLmYXeh8rYdt
HcZ5wa44Om74F6tmZUboQYEvGkKQJm+xPm7MOHDYi1FEM8V5KRFhVy0lkT5NkSumBYSUFAWP
k8wK1wIJgm/RzUcWFG9hyuqaIxMXVDsqc5bEICX8a0xmG++1/8ZdaxK+CgAA
$ < morio2.diff.gz.base64 base64-decode | gunzip - > morio2.diff
741デフォルトの名無しさん:2005/08/05(金) 18:21:25
>>740
エラーが1行だけ短くなりました。>>739の'inline'てやつです。
クラス宣言のときはtemplateの型を書かなくてもいいなんて始めて知りました。というか書くのは間違いなんですかね。

あとusing namespaceを消したときに気になってたんですが、例えば
template<class Ctype>
Vector2<Ctype> Vector2<Ctype>::operator +(const Vector2<Ctype>& v) const

template<class Ctype>
bkl::Vector2<Ctype> bkl::Vector2<Ctype>::operator +(const Vector2<Ctype>& v) const
とするだけで、引数にbkl::は付けなくてもダイジョブなんですね。戻り値には付けないとエラーになるのが超不思議です。
742デフォルトの名無しさん:2005/08/05(金) 18:52:10
無名の構造体が云々言うエラーが出たのでunion/struct含めてカット、
get_vec()でvecを返す代わりに& xを返すように修正。

$ g++ -Wall -pedantic main.cc

$ g++ --version
g++ (GCC) 3.3.1 (cygming special)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


$ cat main.cc
#include <vector>
#include "position.hh"
int main(){return 0;}

$ pwd
/cygdrive/c/tmp/morio2/src/bkl

なんだろね。いっそRedHatのvectorを疑ってみるか?w
743デフォルトの名無しさん:2005/08/05(金) 19:45:31
>>742
言われた通り疑ってSTLport(5.0-RC4)を使うようにしたらwarningすら出ないでコンパイルいけました!!!
みなさんお騒がせして済みませんでした。ありがとうございました。

#でも他の環境だと通るのはなんでだろう、、、
744742:2005/08/05(金) 23:39:52
RedHatのvectorに余計なことが書いてあるに違いない。
つーことで、乙。
こんなことくらいでstlを嫌いにならないでね。
745デフォルトの名無しさん:2005/08/11(木) 15:11:32
std::stringでフォーマット出力を使いたいのですが、メンバとしてないでしょうか?
746デフォルトの名無しさん:2005/08/11(木) 15:20:43
ありません。
std::stringは一般的に文字列の加工用のメソッドしかないと思っていいかと。
#検索や抽出関係は豊富です。
フォーマット出力はstringstreamを使えと言うことなのでしょう。
747デフォルトの名無しさん:2005/08/11(木) 15:21:15
>>745

1. std::stringstream を使う
標準の範囲内で完結できる

2. boost::format
外部ライブラリに依存するが、簡単で割と多機能。
748デフォルトの名無しさん:2005/08/12(金) 00:14:03
stringをキーとして、データがvectorの連想配列を作ろうとしたのですが、
コンパイルエラーが出てうまくいきません。どうすればいいでしょうか?
map<string, vector<double>> m;
749デフォルトの名無しさん:2005/08/12(金) 00:21:14
map<string, vector<double> > m;
750デフォルトの名無しさん:2005/08/12(金) 00:29:50
初歩の初歩だな。
751デフォルトの名無しさん:2005/08/12(金) 00:37:55
>>749さん
うまくいきました。
STL使いへの道は長い(´・ω・`)
752デフォルトの名無しさん:2005/08/12(金) 05:20:30
まぁこれは仕様のほうにも非はある。
753デフォルトの名無しさん:2005/08/12(金) 09:34:51
int hoge[] = {0, 1, 2, 3, 4, 5} ;

みたいにvector を初期化、あるいはいっぺんに要素を追加する方法はありますでしょうか。
754デフォルトの名無しさん:2005/08/12(金) 09:42:21
>>753
Boost Assignment Library

std::vector<int> v; 
v += 1, 2, 3, 4, 5, 6, 7, 8, 9;
755デフォルトの名無しさん:2005/08/12(金) 09:50:02
STLの範囲なら

int hoge[] = {0, 1, 2, 3, 4, 5} ;

std::vector<int> v(hoge, hoge+6); // 初期化

std::vector<int> v;
v.assign(hoge, hoge+6); // 初期化

v.insert(v.end(), hoge, hoge+6); // 追加

ってなやり方しかねえかな?
756デフォルトの名無しさん:2005/08/12(金) 09:59:18
>>755
std::vector<int> v(hoge, hoge + sizeof(hoge) / sizeof(*hoge));
757デフォルトの名無しさん:2005/08/12(金) 10:07:57
そう書こうかと思ったけど面倒でねえ
ちなみにsizeofの後ろの括弧は要らんぞ
758756:2005/08/12(金) 12:10:53
>>757
知ってる。けど習慣でね。
sizeof hoge / sizeof*hoge
だと分子がhogeみたく見えるし。
759デフォルトの名無しさん:2005/08/12(金) 18:44:32
括弧をいかに減らそうか考えるような人はコーディングに不向き。
数学数式のような美しさを求める人とほぼ同レベル。つまり初心者。
760デフォルトの名無しさん:2005/08/12(金) 19:43:50
俺様宗教の結論部分だけ並べられてもな・・・。
761デフォルトの名無しさん:2005/08/12(金) 20:15:48
>>760

テキストエディタで括弧の前後に移動できるメリット。
Grepをかけたときの曖昧さを減らすメリット。
各演算子の優先順序に対する曖昧さを減らすメリット。

「使わなくても良い」を「使ってはいけない」に脳内変換する宗教信者もコーディングに不向き。
762デフォルトの名無しさん:2005/08/12(金) 21:16:33
やっぱ宗教だ。

全然説明になっていない。
763デフォルトの名無しさん:2005/08/12(金) 21:17:53
宗教の定義。

・教祖がいる。
・教典がある。
764デフォルトの名無しさん:2005/08/12(金) 21:36:36
俺は配列の要素数を求めたいときにsizeofを使うなら常にマクロか関数にしている。
765デフォルトの名無しさん:2005/08/12(金) 21:40:23
for_eachと単純なforループは,
fuctorの中でコピーコンストラクター呼ばれないようにしさえすれば
計算速度は同じだよね?
766デフォルトの名無しさん:2005/08/12(金) 21:45:25
>>765
そうだよ。
767デフォルトの名無しさん:2005/08/12(金) 23:55:11
>>763
・マルクス
・資本論
とかですね。「宗教はアヘン」だそうだが厳密には「異教は(ry」なわけで。
768デフォルトの名無しさん:2005/08/13(土) 00:03:46
「sizeofの後ろの括弧は要らん」がそんなに気にさわったのなら
あやまるよw
769デフォルトの名無しさん:2005/08/13(土) 00:44:51
>>763 搾取の構造がある。
770デフォルトの名無しさん:2005/08/13(土) 02:29:13
>>768
まあ、怒るほうも怒るほうだとは思うが、わざわざ言うほどのことでもなかったろうね。
演算子の優先順位の話とかでも、ときどきある騒ぎ・・・
771756:2005/08/13(土) 02:44:32
一応言っておくけど、私ゃ気にしてないからね。
#つーか、>755に対して突っ込みを入れる時点で自分も突っ込まれることは想定済み。
772デフォルトの名無しさん:2005/08/13(土) 03:30:22
>>763
・教祖 … >>759
・経典 … >>759
773デフォルトの名無しさん:2005/08/13(土) 04:58:58
なにしろ教祖様の書き下ろしだからな。貴重なんてもんじゃない。
このスレ覗いただけで寿命が3年伸びるよ。
774デフォルトの名無しさん:2005/08/13(土) 16:42:31
かっこいいいい!
775デフォルトの名無しさん:2005/08/14(日) 10:16:47
arigataya
776デフォルトの名無しさん:2005/08/14(日) 20:48:44
wstringを、stringとかchar* の文字列に変換したいのですが
どうしたらよいでしょうか。
777デフォルトの名無しさん:2005/08/14(日) 21:54:21
>>776
[cppll:4783] Re: <fyi> CppUnit 1.9.10 snapshot
ttp://www.tietew.jp/cppll/archive/4783
778デフォルトの名無しさん:2005/08/15(月) 12:40:18
>>777
ありがとうございます。
wstringをstringに変換しよう↓のようにやってみました。
しかしなんだか半角で「ヘヘヘヘヘヘ・…ンンンンンン」みたいな結果になります。
何か原因と考えられる事はあるでしょうか?

string narrow(const wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
string result = buffer;
delete[] buffer;
return result;
}
/////////////////////////////////
wstring text;
text = L"こんにちは";
MessageBox(NULL,narrow(text).c_str(),"",MB_OK);
779デフォルトの名無しさん:2005/08/15(月) 13:05:06
どこがSTLの相談なんだか。
780デフォルトの名無しさん:2005/08/15(月) 13:24:06
どこで聞くべきでしょうか。問題がどこにあるのか分からないので
stl知らない人に聞いて通じる話なのか分からないのです。
781デフォルトの名無しさん:2005/08/15(月) 13:40:23
あれかなあ、
MessageBox呼ばれた時点でスタック破壊って感じ?
782デフォルトの名無しさん:2005/08/15(月) 13:47:00
>>780
> stl知らない人

それ、自分に向けてるんだよな?
おまえ、STLってどういうものかわかってるか?
783デフォルトの名無しさん:2005/08/15(月) 13:52:39
>>781
つまり、、、どこが悪くてどう直したらよいのでしょうか。
784デフォルトの名無しさん:2005/08/15(月) 14:02:39
narrow(text).c_str()
ここが悪くて

wstring text;
text = L"こんにちは";
string result = narrow(text);
MessageBox(NULL,result.c_str(),"",MB_OK);
こう直したらよいんじゃないかなあ
785デフォルトの名無しさん:2005/08/15(月) 14:07:57
>>780
std::stringはSTLじゃないが標準C++ libraryの所属なので
そのあたりは普通のC++スレの範疇では
786デフォルトの名無しさん:2005/08/15(月) 14:12:21
>>778
main()の先頭でstd::locale::global(std::locale(""));しないとロケールが
合ってない。
787778:2005/08/15(月) 18:38:12
>>784-786
ありがとうございました。
std::localeの設定で半分くらい解決しましたが
なんだかまだちょっとおかしいのでC++スレ行ってきます。
stringってSTLかと思い込んでました。すいません。
788デフォルトの名無しさん:2005/08/15(月) 18:56:56
>>785
iteratorが用意されてるのにSTLでないとは初耳だな。
789デフォルトの名無しさん:2005/08/15(月) 19:43:34
>>788
iostream にもイテレータは用意されているけど、STLに含まれるとは聞いたことがない。
790デフォルトの名無しさん:2005/08/15(月) 19:59:21
791デフォルトの名無しさん:2005/08/15(月) 20:56:30
というか「iteratorが用意されているからSTLである」という前提が
いい感じに狂ってて笑えます ;-)
792デフォルトの名無しさん:2005/08/15(月) 20:58:07
>>787
一応向こうにも書いておいたが、リンクをば。
C++相談室 part41
http://pc8.2ch.net/test/read.cgi/tech/1120190961/965
793デフォルトの名無しさん:2005/08/15(月) 21:00:40
まぁまぁ。規格に載ってない用語についてどうこう言ってもしょうがないでしょう?
794デフォルトの名無しさん:2005/08/15(月) 21:30:16
そんなこと言い出したら、このスレの存在自体が問題になるのだが
795デフォルトの名無しさん:2005/08/15(月) 21:32:28
796デフォルトの名無しさん:2005/08/15(月) 21:33:27
つまりね、「○○パターン」という言葉で相手に意図が伝わってほしいのと同様、
「STL」という言葉は、C++プログラマ同士で同じ意味を持つべきなんですよ。
規格とか関係なく。
797デフォルトの名無しさん:2005/08/15(月) 21:39:44
まあSTLというものを知らなかった奴が
指摘されて逆ギレしてるだけだから>規格云々
798デフォルトの名無しさん:2005/08/16(火) 00:03:43
>>789
具体例を挙げてみて
799デフォルトの名無しさん:2005/08/16(火) 00:26:46
>>798
質問の意味がまったくわからん。

聞いたことがないということの具体例って、たとえばどんなのだ?
800デフォルトの名無しさん:2005/08/16(火) 01:24:06
>>796
その点、std::string は STL に含むよ派と含まないよ派がいるのよ。
で、重複スレだって言われるのは
>「STL」という言葉は、C++プログラマ同士で同じ意味を持つべきなんですよ。
そもそも STL を標準ライブラリと分ける意味がない、って理由なわけで。
801デフォルトの名無しさん:2005/08/16(火) 05:04:24
俺は使うときに型を明示しないといけないのがSTLだと思ってた。
vector<int>←コレ。アルゴリズムとかはオマケみたいな。
802デフォルトの名無しさん:2005/08/16(火) 07:06:05
まぁ、クラステンプレートで且つ標準ライブラリなのに
スタンダードテンプレートライブラリには含めない、ってのも
変な話ではあるんだけどな。
803デフォルトの名無しさん:2005/08/16(火) 07:35:45
http://pc8.2ch.net/test/read.cgi/tech/1104898734/562 (>>24)

562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。

このスレが不要である事に疑いの余地は無い。
804デフォルトの名無しさん:2005/08/16(火) 07:37:38
じゃ、もうこないでね。
805デフォルトの名無しさん:2005/08/16(火) 08:00:06
>>800
> その点、std::string は STL に含むよ派と含まないよ派がいるのよ。

STLをちゃんと知らない奴がでかい顔してる、というただそれだけのこと。
806デフォルトの名無しさん:2005/08/16(火) 08:11:19
メイヤーズは含めてたっけ。
807デフォルトの名無しさん:2005/08/16(火) 08:50:47
へー、STLとはコンテナとアルゴリズムの総称だから、MyClassに対して
std:::vector<MyClass>やstd::list<MyClass>という使い方をする人は山ほどいるけど
std::basic_string<MyClass>という使い方をする人がそんなにいるのか。

で、STLの元はSGIだかのコンテナと、(たぶんlisp由来の)アルゴリズムでしょ。
そもそも、これらのコンテナがC++標準ライブラリに含まれることが決まり、
それを「STL」という名で呼ぶことが一般的になったときに
C++には標準的な文字列クラスなどというものは無かった。

STLが標準に含まれたために、
そのインターフェースにあわせたbasic_stringクラスが作られ、標準に取り込まれ、
同時にiostreamもtemplateを使った物に書き直された、
というただそれだけのこと。

本当にMayersがbasic_stringをSTLに含まれると言っているのならば
どこでそう言及しているのか俺にも教えてくれよ。
俺も少しは考えを改めるかもしれないから。

「標準ライブラリ」に含まれるのと「STL」に含まれるのとは違うのだけど
それを読者/訳者がちゃんとわかっていない可能性があるからね。
808デフォルトの名無しさん:2005/08/16(火) 09:02:43
で、手元にあるMore Effective C++ (初版第3刷)の4ページにおいては
> 使えるときにはいつでも私は標準ライブラリーからデータ構造を用いる。このような
> データ構造は、標準テンプレートライブラリー(Standard Template Library: STL)から
> 引っ張ってこられる。STLには、ビット集合(bitset)、ベクトル(vector)、リスト(list)、
> キュー(queue)、スタック(stack)、マップ(map)、集合(set)、などが含まれるので、

と、basic_stringについては触れてないね。
もちろん、これが書かれたときにbasic_stringが無かったのかもしれないけど。
809デフォルトの名無しさん:2005/08/16(火) 09:29:39
うーん、C++FAQから辿ったSTLのリファレンスのリンクは
どこも当たり前のようにstringを(他のコンテナとは別扱いとはいえ)含めているけど
http://www.ccd.bnl.gov/bcf/cluster/pgi/pgC++_lib/stdlibug/ug1.htm
http://www.sgi.com/tech/stl/table_of_contents.html
同様にauto_ptrやhash setなんかも含めてるんだな。
つまり、単に自分のところで配布しているライブラリのリファレンスだから
「STLとは何か」の説明には使えないな。
810デフォルトの名無しさん:2005/08/16(火) 10:55:34
811デフォルトの名無しさん:2005/08/16(火) 13:55:30
>>807
Effective STL 第0章。

「STL」に公式の定義はなく、この用語を使う人によって異なるものを意味している。
本書では、「STL」は反復子を利用するC++の標準ライブラリの部分を意味する。
STLには標準コンテナ(stringを含む)、iostreamライブラリの部分、関数オブジェクト、
およびアルゴリズムが含まれる。標準コン(ry

全部読みたきゃ買え。
812デフォルトの名無しさん:2005/08/16(火) 16:50:15
>>811
「STL=iteratorを用いる部分」という定義に賛同する。
iteratorはC++の言語機能ではなくライブラリ機能なのだから、しっくりくると思う。
813デフォルトの名無しさん:2005/08/16(火) 17:31:45
みんな私の体目当てにケンカをするのはヤメテ!!
814デフォルトの名無しさん:2005/08/16(火) 21:24:55
それはイテレーター=イレテーナーということか?
815デフォルトの名無しさん:2005/08/16(火) 23:20:32
過去にさんざん自分が使ってきた言葉として"STL"に
明確な定義があってほしいという気持ちはわからんでもないが、
現状から考えたらそれは無理だということぐらいわかるだろ?
どこまでいっても穴だらけの定義か、ローカル定義にしかならないんだよ。
816デフォルトの名無しさん:2005/08/17(水) 09:45:35
馬鹿な2chねらは喧嘩ができる理由があればなんでもいんですよ。
817デフォルトの名無しさん:2005/08/17(水) 11:04:42
お前のことか
818デフォルトの名無しさん:2005/08/17(水) 11:34:33
俺のことだよアホ
819デフォルトの名無しさん:2005/08/17(水) 11:36:32
別スレにしたら?
820デフォルトの名無しさん:2005/08/17(水) 13:13:21
>>819
何を?
821デフォルトの名無しさん:2005/08/29(月) 10:30:53
こんにちは。

std::stringをラッパしたクラスを作ろうとしてますが、(MFCのCStringと同等のインターフェースを持つもの)
クラス名はどのようにすればいいでしょうか。

プロの方の命名をお聞きしたいです。
よろしくお願いします。
822デフォルトの名無しさん:2005/08/29(月) 10:37:09
プロはそんなことせずにboostを使う。
823デフォルトの名無しさん:2005/08/29(月) 11:24:08
boostの理解を深めたいのですが、
このサイトだけで問題ないでしょうか?

追加して本を買いたいと思うのですが、
boostを学習する上で助かる参考書はありますか?

ご返答いただけると助かります。
824デフォルトの名無しさん:2005/08/29(月) 11:25:46
>このサイト
http://boost.cppll.jp/HEAD/
825デフォルトの名無しさん:2005/08/29(月) 11:53:54
充分じゃんーの?
あと、入門にはLet's boostがいい。リンクから、いくつかboost研究のサイトにもいけるし。
826デフォルトの名無しさん:2005/08/29(月) 17:46:40
mapからequal_rangeで検索して、
見つかった範囲内から更にvalueの一致するイテレータを返す関数を作っています。
このとき、見つからなかった場合にポインタで言うNULLみたいなものを返したいのですが、
なにを返したらいいんでしょう?
827デフォルトの名無しさん:2005/08/29(月) 18:22:00
endはどうだろう。
828sage:2005/08/29(月) 19:10:45
>>827
ありがとうございます。
試してみます。
829デフォルトの名無しさん:2005/08/29(月) 21:58:23
boost::optionalという手もある。
830デフォルトの名無しさん:2005/08/29(月) 22:05:02
そういうときはNILを返すんだよ
831デフォルトの名無しさん:2005/08/30(火) 12:05:08
>>829
標準アルゴリズムとの整合性をとる意味でも、end() 返しておけばいいところを
わざわざ boost::optional 持ち出すことも無いだろうと混じれ酢
832デフォルトの名無しさん:2005/08/30(火) 12:20:10
boost::optional が活躍する場合は、

1. 戻り値をポインタではなく値で返したいが、
  DBNull のような無効な値も戻り値で返したい場合
2. try-state なテキストボックスやチェックボックスの値と状態を、
  戻り値で一気に取得したいとき

くらいだろうか。
それ以外の場面では、NULL 返すなり、end 返したほうが分かりやすい気がする。


833デフォルトの名無しさん:2005/09/01(木) 18:13:57
boostに使われてる>>829
834デフォルトの名無しさん:2005/09/08(木) 10:56:38
VC6の bitset ってバグ有り?

bitset<32> bsVal;

cout << bsVal[0]; // NG
cout << bsVal.test(0); // OK
835デフォルトの名無しさん:2005/09/08(木) 12:21:57
>>834
スレ違い。
836デフォルトの名無しさん:2005/09/14(水) 15:54:42
安達祐実ができちゃった結婚か。やるなぁ。。。
837デフォルトの名無しさん:2005/09/14(水) 15:56:44
ロリ婚
838デフォルトの名無しさん:2005/09/14(水) 21:57:50
>>836
sexが楽しい年頃なんだろ
839デフォルトの名無しさん:2005/09/14(水) 22:47:41
避妊はせなならん
840デフォルトの名無しさん:2005/09/14(水) 22:52:44
黒田アーサーと別れて4ヶ月で種付け完了、という計算になるわけだが。
841デフォルトの名無しさん:2005/09/14(水) 23:43:53
どんどん出世していくと苦手な役職についた時に出世がとまる
だから上司は無能ばかり

そういう話があったけどこれって

色々な男とヤリまくってデキちゃったら結婚
だから旦那はDQNばかり

って置き換えられるよね
842デフォルトの名無しさん:2005/09/15(木) 00:48:44
デキちゃった結婚というのが未だに理解できん。普通、避妊しない?

って、スレ違いじゃねぇかああぁぁぁぁぁぁぁっっっヽ(`Д')ノ
843俺じゃねーよ。:2005/09/15(木) 01:31:35
出来てから否認したりして。
844デフォルトの名無しさん:2005/09/15(木) 02:17:06
生一丁はいりまーす
845デフォルトの名無しさん:2005/09/15(木) 02:23:49
お前ら、STL のネームスペース std は STanDard ( 標準 )の略であって、
Sexually Transmitted Disease ( 性感染症 )のことじゃないんだぞ。
846デフォルトの名無しさん:2005/09/15(木) 02:49:20
    /\___/ヽ
   /''''''   '''''':::::::::\
  . |(○),   、(○)、.:|:
  | " ,,ノ(、_, )ヽ、,,"".:::|:
.   |   ´,rェェェ、` .:::::::::|:
   \  |,r-r-|  .:::::/…
,,.....イ.ヽヾ`ニニ´ーーノ゙-、.
:   |  '; \_____ ノ.| ヽ i
    |  \/゙(__)\,|  i |
    >   ヽ. ハ  |   |
847デフォルトの名無しさん:2005/09/15(木) 02:51:12
          ,, --──-- 、._ 
       ,.-''"´           \ 
     /                ヽ、    
    /     (Φ),   、(Φ)     ヽ 
     l    `ー ,,ノ(、_, )ヽ、,,.        l    またまたご冗談を
    .|  ///   `-=ニ=-.   ///     |    
     l       `ニニ´.           l 
    ` 、  /⌒⌒i   /⌒ヽ        / 
      `/    |   |    \    / 

848デフォルトの名無しさん:2005/09/15(木) 03:02:39
冗談は顔だけに(ry
849デフォルトの名無しさん:2005/09/17(土) 12:38:52
すみません。
STLのvectorでイマイチ使い方が上手くないようなのですがご教授ください。

//要素を1つ増やして、増やした要素のインデックスを取得したい
mBin.resize(mBin.size()+1);
return (mBin.size()-1);

//領域を確保して、確保した領域を0で初期化したい
vector <char> mBin;
mBin.resize(Size);
memset(&(mBin[0]),0,sizeof(char)*mBin.size());

とかやってるんですけど、バグってないでしょうか?
また、もっといいやり方ってないでしょうか?
850デフォルトの名無しさん:2005/09/17(土) 12:58:45
>849
前者はそれでおkだと思う

後者は

vector<char> mBin(Size, 0);

という1行だけで可能。これの第2引数は char で0を指定する場合、省略可能。
C++ ではそれなりの理由がない限り memset の使用は推奨できない。
851デフォルトの名無しさん:2005/09/17(土) 13:11:32
>>849
size() の呼び出しがダブってるのが気に入らない。

vector_type::size_type const prev_size = mBin.size();
mBin.resize(prev_size + 1);
return prev_size;
852デフォルトの名無しさん:2005/09/17(土) 13:13:45
>>849>>850
std::vectorに限りstd::memeset()でいいだろ。

それからstd::vectorのデフォルトコンストラクタは、領域をゼロで初期化するので、
resize()した時点でちゃんとお望み通りの状態になってるよ。
853デフォルトの名無しさん:2005/09/17(土) 13:16:04
>>852
俺はmemsetはいいと思うが、850の書き方のほうが短いからいいと思う。
854デフォルトの名無しさん:2005/09/17(土) 13:51:03
>>850-853
即レスありがとうございます。
使わせていただきます。
memsetに関しては不安があったんですよね。
「もしかして、ヤバイとこクリアしてるかも」って思いまして。
ただやっぱりvector <MyClass> mBin;とかの場合はmemsetは駄目ですよね。

ありがとうございました。
855デフォルトの名無しさん:2005/09/17(土) 14:47:24
>852
>std::vectorに限りstd::memeset()でいいだろ。
POD の std::vector ならね
856デフォルトの名無しさん:2005/09/17(土) 14:57:46
>>855
うんそう。フォローサンクス。
857デフォルトの名無しさん:2005/09/19(月) 20:07:28
STLのListについての質問。
ある要素を指しているite1が、ite2の前に新しく要素を挿入した後も、
引き続き同じ要素を指しているようにするには、

if (ite1 == ite2)
ite1 = list.insert(ite2, p); // ite1が宙ぶらりんにならないように
else
list.insert(ite2, p);

とすりゃいいいんだよね?
858デフォルトの名無しさん:2005/09/19(月) 20:18:54
>>857 元スレでレス付いてんぞ。
859デフォルトの名無しさん:2005/09/19(月) 21:28:53
GCCのlibstdc++なんかだと
std::stringがスレッドセーフではないという非常に痛い状況ですが
みんなどうしてんの?
860デフォルトの名無しさん:2005/09/19(月) 21:34:47
>>859
string だからって、他のライブラリオブジェクトと比べて
特別な対策が必要とは思わない。
何の話?
861デフォルトの名無しさん:2005/09/19(月) 21:48:23
ライブラリオブジェクトがC++に関係あるのか?
862デフォルトの名無しさん:2005/09/19(月) 22:01:27
>>859
STLPort使えばいいじゃん
863デフォルトの名無しさん:2005/09/25(日) 04:11:27
いたたたたたたたたたた
864KKK:2005/09/25(日) 10:28:01
C++のstringって、固定長にできないんですかね??
865デフォルトの名無しさん:2005/09/25(日) 10:35:24
うん、できない。
866KKK:2005/09/25(日) 10:43:21
>> 865
てことは、
stiring str = "abc";
str.max_size(); ←このサイズは常に確保されてるってことですか?

867デフォルトの名無しさん:2005/09/25(日) 10:57:22
>>866
いや、必要に応じて拡張されていく。
今どれくらい確保しているかはcapacity()で知れる。
実際に使用している量はsize()あるいはlength()。
868デフォルトの名無しさん:2005/09/26(月) 10:28:06
>>864
>>KKK⇒きっと、きっと、楓さん
stringを固定長にして何がたのしいの。
869デフォルトの名無しさん:2005/10/01(土) 05:34:12
組み込み系でSTLって使っていいのかにゃ?
870デフォルトの名無しさん:2005/10/01(土) 05:55:29
>>869
なんで使っちゃダメだと思うの?
871デフォルトの名無しさん:2005/10/01(土) 06:12:52
メモリ使用量の予測がたたんから>870
872デフォルトの名無しさん:2005/10/01(土) 06:20:37
>>871
malloc() 使ってがんばった可変長配列は良くて
std::vector はダメってことか?そんなわけないよな?

あと、 algorithm なんかは問題なく使えるはずだ。
873デフォルトの名無しさん:2005/10/01(土) 09:42:51
>>872
そうじゃなくて、テンプレートのインスタンス化がテンプレート引数毎にそれぞれ行われるから、
C++ソースの見かけ以上に機械語のコードが膨張してしまいやすいので、
実行する機械語のコードのサイズの予測が立たないということ。
874デフォルトの名無しさん:2005/10/01(土) 09:50:27
そこでstd::vector<void*>ですよ
875デフォルトの名無しさん:2005/10/01(土) 09:50:51
それは設計が悪いか、アセンブルリストを読めないか、その両方なのでは?
876デフォルトの名無しさん:2005/10/01(土) 10:45:32
やっぱ、アセンブリソース見んとだめでつか。
877デフォルトの名無しさん:2005/10/01(土) 10:55:17
やっぱ組込はC++よりJavaだな
878デフォルトの名無しさん:2005/10/01(土) 11:09:20
いいよ別にアセンブリで書くから。
きついのは最初だけだし。
879デフォルトの名無しさん:2005/10/01(土) 11:21:21
STL使うとソースコードのサイズが膨らむからと言って
独自のIntArrayとかStringArrayとか作ってたりする?
880デフォルトの名無しさん:2005/10/01(土) 13:37:50
>>879
そういうことをしないとSTLが生き残れない過酷な環境もあるのです
881デフォルトの名無しさん:2005/10/01(土) 18:10:22
>>873
コードサイズなんか予測に頼らなくてもマップファイルで確認できるだろ。
882デフォルトの名無しさん:2005/10/01(土) 18:12:46
そのマップファイルで確認できるコードサイズが
どれくらいになるかの目処が建てづらい罠
883デフォルトの名無しさん:2005/10/01(土) 18:16:13
>>882
やってみればすぐわかることなのに、
なんで頭の中で目処を建てないといけないの?
884デフォルトの名無しさん:2005/10/01(土) 18:24:29
マップファイルも結果のうち。
マップファイル上でいくらになるかを予想する。
(それが予想しづらいのがテンプレートを使ったとき)

こう書けば気が済むか。
885デフォルトの名無しさん:2005/10/01(土) 18:30:41
>>883
はぁ。そうですね(呆

保守頑張ってください。
886デフォルトの名無しさん:2005/10/01(土) 18:30:42
>>884
なにそれ?数当てゲーム?
予想してからマップファイル見て「わーいピッタリだぁ」とかすんの?

ごめん、やっぱり意味がわかんない。
887デフォルトの名無しさん:2005/10/01(土) 18:31:04
>>884
結論:>875
888デフォルトの名無しさん:2005/10/01(土) 18:33:35
予測が立てづらいのではなく、コードのサイズがでかくなりやすい。
だから少しでもメモリをケチりたい組み込みではテンプレートが嫌われやすい。
889デフォルトの名無しさん:2005/10/01(土) 18:35:03
>>883
すでにソースコードがあることが前提の発言だなw
890デフォルトの名無しさん:2005/10/01(土) 18:40:11
>>889
使うか使わないかの話してるのに、
ソースコードが無いってどういう状況だ?
891デフォルトの名無しさん:2005/10/01(土) 18:47:50
使うか使わないかって何を?
892デフォルトの名無しさん:2005/10/01(土) 18:51:38
>>891 テンプレート
893デフォルトの名無しさん:2005/10/01(土) 18:55:26
最初にプロジェクトで使っていくか使わないか検討しないの?
894デフォルトの名無しさん:2005/10/01(土) 19:04:21
>>893
問題なく使える箇所では使えばいい。
問題が発生する箇所では使わなければいい。
全体で2択を迫る意味がわからない。
895デフォルトの名無しさん:2005/10/01(土) 19:11:10
>>894
>問題なく使える箇所では使えばいい。
>問題が発生する箇所では使わなければいい。
はぁ、それからどういう展開があんの?

もしかしてこれでおしまい?
896デフォルトの名無しさん:2005/10/01(土) 19:12:53
>>894
それなら俺にも言えるッ!!!!
897デフォルトの名無しさん:2005/10/01(土) 19:14:35
>>895
シラネーヨ。どんな展開期待してんだ?
はじまりが >869 だからこれで終わりでもいいだろ。
898デフォルトの名無しさん:2005/10/01(土) 19:15:12
STL使わない&プログラムサイズ削減というと、昔ながらのvoid*コンテナを
使うのか?
899デフォルトの名無しさん:2005/10/01(土) 19:16:31
>>894
つまらん結論だな。
900デフォルトの名無しさん:2005/10/01(土) 19:17:05
>>897
それだけならそれでいいよw
901デフォルトの名無しさん:2005/10/01(土) 19:20:56
思考停止しますた
902デフォルトの名無しさん:2005/10/01(土) 19:30:24
>>894
それで済ませるためには、マップファイルとかを読むなどして
問題の原因となっている箇所を特定できる能力が必要だろ。
それができない人(が居ないプロジェクト)は、使っちゃいけないんだよ。

そして「使っちゃいけない」理由が
自分にその能力がないことだと認めたくなくて、
もっともらしい理由を求める人がいる、のかもしれない。
903デフォルトの名無しさん:2005/10/01(土) 19:42:24
覚えなくて良かったよ。
標準C++ コンテナまでも改定確定
ヤマト、ロッキー、ガンダムのように永遠に続く
Cマガでは、まだauto_ptr

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1771.html
904デフォルトの名無しさん:2005/10/01(土) 20:07:07
>>894
すげー、それで解決かぁ

>>902
能力ってほどのことでもないと思うが。
905デフォルトの名無しさん:2005/10/01(土) 22:13:10
>>903
改定されそうだからという理由は覚えなくて良いという理由にはなるかもしれないが、
それが普及するまで時間もかかるだろうし、今のSTLを触れておくくらいやっても損はないよ。
906デフォルトの名無しさん:2005/10/01(土) 23:36:06
>>903
右辺値参照というか move semantics のサポートは現在の標準ライブラリに
+α として導入されるもので,現在のもの対する理解が不要になるということは
全然ないんじゃないんですかね.auto_ptr こそ deprecate されますけれど,
auto_ptr が持つ破壊的コピーのセマンティクスの考えも,move semantics に
直接つながるわけですし.
907デフォルトの名無しさん:2005/10/02(日) 03:09:10
>>903は、ちゃんと内容を理解して、発言してるんか?



908デフォルトの名無しさん:2005/10/02(日) 06:26:45
unique_ptrは実際にそれ自身の提案に相当します(そして得るだろう)。
しかしながら、それは、完全のためにここで含まれています。それは、
rvalue参照および動き意味論に関しての非常に重要なライブラリー・
コンポーネントです。unique_ptrは完全に、
後ろに互換性をもたないauto_ptr置換です。したがって、auto_ptrを
大いに非難し、かつauto_ptrを単に固定する代わりに、新しい名前
(unique_ptr)を導入する必要。主な類似性、およびunique_ptrとauto_ptrの
間の差は次のものを含んでいます:auto_ptrのようなコピー・シンタックスの
代わりにlvaluesから動きシンタックスで移動します。しかしながら、それは
ちょうどauto_ptrのようなコピー・シンタックスでrvaluesから移動します。
auto_ptrと異なり、lvaluesから移動する(あるいはコピー)ことを拒絶します。
これは総括的なコード中の安全性の鍵です。それがちょうどauto_ptrのように
、ローカルの自動変数である限り、コピー・シンタックスと共に、機能から
1つ返すことができます。デフォルトdeleter(また「空の」deleters)で、
それはauto_ptrと同じオーバーヘッド(1つのポインター)を持つことができま
す。deleterは参照タイプでありえます。deleterは「ヘビー級」でありえま
す、コピーしない、可能な(そして)移動されました。非デフォルトdeleters
で、他のRAII機能性は達成することができます。配列形式を扱う特殊化があ
ります。配列形式は単に特別のdeleterを越えるものです。インターフェース
は、配列に、より適切な一つに変更されます:

909デフォルトの名無しさん:2005/10/02(日) 06:44:14
unique_ptrは完全に、 後ろに互換性をもたないauto_ptr置換です。
移植性なんか元々ないのよ。全部書き換えてください。

いい加減、C++D言語とでも逝ってほしいです。
命名するならC&&D言語がいい。
910デフォルトの名無しさん:2005/10/02(日) 06:50:25
くだらない
第53回ポインタの安全な使い方(第x回?)
この連載では、今まで何度となくポインタとうまくつきあう方法について
考えてきました。それくらいポインタには悩まされるわけなのですが、
今回は、じゃあポインタがどんな場面で実際に使われるか、という視点で
ちょっと見ていきたいと思います。
これでいいじゃない。
include <memory>
#include <vector>

struct Base {virtual ~Base() {}};

struct Derived : Base {};

int main()
{
typedef std::unique_ptr<Base> BasePtr;
typedef std::unique_ptr<Derived> DerivedPtr;
std::vector<BasePtr> v(3); // 3 default constructed BasePtr's
v.resize(2); // No copy constructor required
v.push_back(DerivedPtr(new Derived)); // No copy constructor required
v.front() = DerivedPtr(new Derived); // No copy constructor required
v.insert(v.begin(), DerivedPtr(new Derived));// No copy constructor required
v.erase(v.begin() + v.size()/2); // No copy constructor required
// BasePtr p = v[0]; // will not compile, copy constructor required
BasePtr p = std::move(v[0]); // ok, ownership transferred to p
}

911デフォルトの名無しさん:2005/10/02(日) 15:23:03
自動翻訳ってもっとひどいもんだと思ってたよ。
鼻つまんで読めば大筋くらいは把握できるな。
912デフォルトの名無しさん:2005/10/02(日) 15:29:30
ところで、move_ptr が持っている
safe bool をとるコンストラクタと代入演算子って
どんな意味があるの?
913デフォルトの名無しさん:2005/10/02(日) 19:39:42
>自動翻訳ってもっとひどいもんだと思ってたよ。
>鼻つまんで読めば大筋くらいは把握できるな。

そうなんですよ!プログラミングはinfoseekが使えます。
おすすめはしませんが、ヤフーとか面白いですよ。○×★???

914デフォルトの名無しさん:2005/10/02(日) 22:33:57
>>911
>>913
いやっ、英語を感じろよ。
915デフォルトの名無しさん:2005/10/03(月) 16:20:33
>>903 のリンク先の「 deque && 」が気になった。アレは何?
916デフォルトの名無しさん:2005/10/03(月) 17:32:08
>>915
右辺値参照.新しく提案されている言語仕様の1つ.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm
917デフォルトの名無しさん:2005/10/03(月) 17:57:56
>>916
てゃんks

まだ読んでる途中だけど、
A.Alex が行ってた mojo みたいなのを、言語でサポートしようってこと?
918デフォルトの名無しさん:2005/10/03(月) 18:11:58
>>917
>A.Alex が行ってた mojo みたいなのを、言語でサポートしようってこと?
はい.ほとんどその通りです.
919デフォルトの名無しさん:2005/10/03(月) 23:14:00
そう言われてもわかんないだがなぁ・・・
920デフォルトの名無しさん:2005/10/03(月) 23:41:20
>>919
リンク先の「More on A&&」の項のコード見れば一発でわかるよ
921デフォルトの名無しさん:2005/10/03(月) 23:45:57
エイリアスのない右辺値がその他の右辺値・参照と区別できれば
所有権を完全に貰える場合と複製でなければならない場合を区別できるわけね。
その結果、コピーを作る手間をかける必要ない場面では移動して効率化できると。

計算式の途中では往々にしてそういう場面があるが
組み込み型だとそういう最適化ができるのにユーザー定義オブジェクトだと
それができなくて性能の制約になってたって感じか。
922デフォルトの名無しさん:2005/10/04(火) 07:22:13
いまだにそんなプリミティブなところの効率こだわる辺り
さすがC++というしかないな……
923デフォルトの名無しさん:2005/10/04(火) 10:45:14
>922
あー、はいはい。 速度を気にしないボクちゃんはHSPでも使っててくだちゃいねー。
924デフォルトの名無しさん:2005/10/04(火) 10:59:47
突然のヒステリー
925デフォルトの名無しさん:2005/10/04(火) 11:44:20
まさかのミステリー
926デフォルトの名無しさん:2005/10/04(火) 14:17:29
恥ずかしいヒストリー
927デフォルトの名無しさん:2005/10/04(火) 20:36:08
>>921
>性能の制約
って堅牢性も含めて言ってるんじゃないですか? 代入演算子やなんかで、多くのケースで
例外を送出しない保障ができるでしょう。
928デフォルトの名無しさん:2005/10/06(木) 00:11:38
質問です。

vector <MyClass> mMy;

↑と宣言したものにresizeやpush_backなどを行うと
内部的にはどうなるのでしょうか?
MyClassのインスタンスは1回全部破棄されて、
すべて新しく作り直されるのでしょうか?
それとも内部的に持っているポインタの配列(のようなもの?)が確保しなおされて
MyClassのインスタンス自体はそのままなのでしょうか?
929デフォルトの名無しさん:2005/10/06(木) 00:23:20
>>928
普段は余計にメモリを確保しておいてあるから、そこへresizeやpush_backはコンストラクタを呼ぶだけ。
足りなければ新たにメモリを確保して既存の要素はコピーコンストラクタでコピーされる。
930デフォルトの名無しさん:2005/10/06(木) 00:27:17
>>929
レスありがとうございます。
じゃあ、その余分なメモリで足りなくなった場合は、
既存の要素を一度すべて複製、削除しているということですね?
ということは、そういう確保のしなおしが気になるときは

vector <MyClass*> mMy;

を使った方がよいということでしょうか?
931デフォルトの名無しさん:2005/10/06(木) 00:38:58
>>930
vector なら reserve() とか。
list<MyClass> でもいいんじゃないかな。
932デフォルトの名無しさん:2005/10/06(木) 00:42:30
うんにゃ 
vector<MyClass> mMy;
mMy.reserve(1000);
とでもしておけば、あらかじめ1000個分確保してくれる1000個までなら
リサイズやらメモリの再配置はない。が、インスタンスを代入するたびにコピコンが動く。

ので vector<MyClass*> mMy;とした方がいいのかもしんない。
933デフォルトの名無しさん:2005/10/06(木) 00:56:18
>>931-932
レスありがとうございます。
とりあえずvector<MyClass*> mMy;で逝っときたいと思います。
934デフォルトの名無しさん:2005/10/06(木) 02:10:53
たびたび申しわけありません。
質問です。

stringであらかじめ領域を確保しておきたいのですが、
reserve関数で確保した領域というのはどういうときに変化してしまうのでしょうか?

例えば

string str;
str.reserve(20000);
str = "";
str += "ABCDEFGHIJK";
str = "";
str += "ABC";

とやってもreserve関数で確保した領域はそのままなのでしょうか?
935デフォルトの名無しさん:2005/10/06(木) 04:40:20
>>934
そのままです。reserve()で予約した領域を変化させるのは、文字列がreserve()で
予約した文字数を超えるか、再びreserve()を呼び出し、現在の容量または文字数
を下回る領域を指定した時だけです。

二番目の場合は、非強制的な要求なので、保証はされていません。
936デフォルトの名無しさん:2005/10/06(木) 16:40:48
>>935
レスありがとうございます。

string www;
www.reserve(20000);
int iiiis = www.capacity();
www = "";
int iiii = www.capacity();
www.reserve(20000);
www = "ABC";
int ii = www.capacity();

↑のようなプログラムを書いてデバッガみたところ
www = "";やwww = "ABC";のところでreserveで確保した領域が変更されてしまうようです。
937デフォルトの名無しさん:2005/10/06(木) 18:42:25
>>936
だとすれば貴方のstd::stringクラスが、代入時にreserve()を呼び出して
いるんでしょう。つねにshrink-to-fitするように。それじゃあreserve()の
意味があまりありませんね。
938デフォルトの名無しさん:2005/10/06(木) 19:13:48
>>937
レスありがとうございます。
この辺は環境依存ということでしょうか。
開発環境はVC.netです。orz
とりあえずstring使わないでなんとかしたいと思います。

おつきあいいただき、ありがとうございました。
939デフォルトの名無しさん:2005/10/06(木) 20:10:40
std::string::assign()
940デフォルトの名無しさん:2005/10/07(金) 19:18:13
STL-port4.6.2とVC.net 2003という環境でboost1.32.0導入してみました。
regexとfilesysutemが使いたかったのでbjamでvc-7_1-stlportを指定して
インストール。きちんとlibファイルができました。

そこまでは良かったのですが、実際boost::regex,filesystemを使用してみると
リンクの際に未解決の外部シンボルのリンクエラーがいくつか発生しました。
それらがすべてSTL関係っぽいのですが、STL-portとboost間の相性やら
なにかあるのでしょうか?
何か情報がありましたらご教授願います。
以下、発生したエラーのひとつです。

error LNK2019: 未解決の外部シンボル "protected: static bool __cdecl
boost::reg_expression<char,class boost::regex_traits<char>,
class _STL::allocator<char> >::can_start(char,unsigned char const *,unsigned char,
struct boost::re_detail::_narrow_type const &)"
(?can_start@?$reg_expression@DV?$regex_traits@D@boost@@V?$allocator@D@_STL@@@boost@@KA_NDPBEEABU_narrow_type@re_detail@2@@Z) が関数
"public: static bool __cdecl boost::re_detail::access_t<char,class boost::regex_traits<char>,
class _STL::allocator<char> >::can_start(char,unsigned char const *,unsigned char)"
(?can_start@?$access_t@DV?$regex_traits@D@boost@@V?$allocator@D@_STL@@@re_detail@boost@@SA_NDPBEE@Z)
で参照されました。
941デフォルトの名無しさん:2005/10/07(金) 19:34:19
>>940
作られたLibファイルをプロジェクトに参加させていないだけでは?
942デフォルトの名無しさん:2005/10/10(月) 18:01:58
class Foo{
private:
vector<A> va;
bool predicate(A a1, A a2) { ~~~ }
public:
void bar()
{
A a(~~~);
find_if(va.begin(), va.end(), bind2nd(ptr_fun(predicate), a));
}
};

↑こんなことやってるんですがpredicate周辺でコンパイルエラーがでます。
「no matching function for call to `ptr_fun(<unknown type>)'」
predicate()がグローバルな関数ならエラー無しで動作するのですが。。
何がいけないのか、どうすれば正しく動くのか、どなたかよろしくお願いします。
943デフォルトの名無しさん:2005/10/10(月) 18:27:17
>>942
メンバ関数predicate()をalgorithmに適用するには、第一引数にthisを
バインドしておかないと駄目。
944デフォルトの名無しさん:2005/10/10(月) 18:31:28
面倒ならboost::bindを使おう。こっちの方がはるかに楽。
945デフォルトの名無しさん:2005/10/10(月) 18:34:17
>>942
メンバ関数へのポインタを得るためには & が必須
且つ同クラス内でも Foo:: の明示が必要。つまり &Foo::predicate 。
あとは >943-944
946デフォルトの名無しさん:2005/10/10(月) 20:03:00
皆さんありがとうございます。必死こいて調べて、なんとかboostを使ってできました。
ただ、通常のbindを使ったものがどうしても動きません。
bind2nd(ptr_fun(predicate), a)

boost::bind(&Foo::predicate, this, _1, a)
にしたものは動いたのですが、
bind2nd(bind1st(mem_fun(&Foo::predicate), this), a)
が動かないのです。thisのバインドの仕方が間違っているのでしょうか。
・・でもどう考えてもboost使った方が簡単そうですね。。
947デフォルトの名無しさん:2005/10/10(月) 20:10:13
>>946
mem_funいらない・・・・・
948デフォルトの名無しさん:2005/10/10(月) 20:10:36
>>946
間違いじゃなくて標準のバインダが貧弱すぎるだけ。
気にせず boost::bind や boost::lambda::bind 使うのが正解。
949デフォルトの名無しさん:2005/10/10(月) 20:28:26
>>947
mem_fun消してみたんですがまたもやエラーメッセージの洪水をワッとあびせかけられたので
さすがにギブアップします・・・
>>948
はい、これからboost使うことにします。

ありがとうございました。
950デフォルトの名無しさん:2005/10/10(月) 21:31:44
>>949
結論からいって無理だもん。mum_fun は高々一変数のメンバーしか扱えない。
よって代替のインナー関数オブジェクでも作ってbind2に渡すしかないね。
951デフォルトの名無しさん:2005/10/11(火) 01:28:04
本当やねえ。SGI STL固有の拡張std::compose2()も、引数の合成ではなくて
関数の合成やから、この場合には適用できへんし。

std::bind1st2()とかstd::bind2nd2()があれば、できたかもしれへんねえ。ま、
boostがあるんやから、そちらでまとめまひょ。
952940:2005/10/11(火) 12:27:21
>>941
レスありがとうございます。
VCの場合、stol-port,boost関連のヘッダがインクルードされれば自動的に
libは読み込まれるはずです。念のため手動でプロジェクトに追加してみましたが
結果はかわりませんでした…。
953デフォルトの名無しさん:2005/10/11(火) 14:29:54
>>952
>ヘッダがインクルードされれば自動的に libは読み込まれるはず

VCはいつの間に俺の知らない魔法を使うようになったんだ?

954デフォルトの名無しさん:2005/10/11(火) 14:43:37
>>953
boostが気を利かせてpragmaでlibをリンクするようにしてくれてる。
955デフォルトの名無しさん:2005/10/11(火) 15:43:52
libpath はどうなんだ?
956940:2005/10/11(火) 17:33:31
なんとか解決しました。libpathはもちろんセットしていたのですが、

http://www.tietew.jp/cppll_novice/archive/472

と同じ原因でした。

http://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html

にしたがってSTLPORT_****_PATHのパスの追加とSTLPORT_PATHの修正を
行い、もう一度bjamでライブラリを作成して置き換えたら動作するようになりました。

自分が最初に参考にしたサイトのパス記述方法ではダメだったようです。
957デフォルトの名無しさん:2005/10/18(火) 15:58:28
age
958デフォルトの名無しさん:2005/10/29(土) 00:59:43
boost:serialization を使ってみたところ

error C2027: 認識できない型 'boost::STATIC_ASSERTION_FAILURE<x>' が使われています。
with
[
x=false
]

となるのですが何が問題でしょうか?
959デフォルトの名無しさん:2005/10/29(土) 01:30:09
>>958
それはboostが意図的に起こしたコンパイルエラー。
エラーが発生した場所に意図が書いてあるはず。
960デフォルトの名無しさん:2005/10/29(土) 01:39:19
// if your program traps here, it indicates taht your doing one of the following:
// a) serializing an object of a type marked "track_never" through a pointer.
// b) saving an non-const object of a type not markd "track_never)
// Either of these conditions may be an indicator of an error usage of the
// serialization library and should be double checked. See documentation on
// object tracking.
BOOST_STATIC_ASSERT(check_tracking<T>::value);
save(ar, const_cast<const T &>(t));

とありました。

track_neverをマークする???

http://hw001.gate01.com/eggplant/tcf/cpp/boost_serialization.html

こちらの最初の例題をまねるだけでは動かないものなのでしょうか?
961デフォルトの名無しさん:2005/10/29(土) 02:16:11
>>960
非 const なオブジェクトをシリアライズしようとしていませんか?
962デフォルトの名無しさん:2005/10/29(土) 02:23:21
で,もし非 const なオブジェクトをシリアライズしようとしてエラーが出ているなら
以下のような感じで回避できるかと思います.


X x;
ar << x; // 通らない

template<class T>
T const &as_const(T &t)
{ return t; }

X x;
ar << as_const(x); // O.K.


http://www.boost.org/libs/serialization/doc/rationale.html#trap
963デフォルトの名無しさん:2005/10/29(土) 02:23:42
>>959、961
ありがとうございます。
右も左もわからない状態でして
MFCを軽く触ったことしかなくて右往左往しています。

>>961
はい 非 constです。

どうやらBOOST_CLASS_TRACKING(Student, boost::serialization::track_never);
とするとOKのようです。

しかし
boost::serialization::track_always
boost::serialization::track_selectivly
ですと上記のエラーとなります。

boost::serialization::track_always
boost::serialization::track_selectivly
にしたい場合はどうすればよいのでしょうか?
964デフォルトの名無しさん:2005/10/29(土) 02:31:49
追記
class Student {

public:

Student(){}

Student(std::string name , int age)
{
name_ = name;
age_ =age;
}

private:
std::string name_;
int age_;

friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & name_;
ar & age_;
}
};

上記のクラスで試しています。
965デフォルトの名無しさん
>>964

template<class T>
T const &as_const(T &t)
{ return t; }

int main()
{
std::ofstream ofs("hoge");
boost::archive::binary_oarchive ar(ofs);
Student s;
ar << as_const(s);
}

こんな感じで通りませんか?手元の VC7.1 だとこれで O.K. なんですけれど.