トップページ⇒tech
1001コメント341KB

●STL スレッド●

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
無いのが不思議
0232デフォルトの名無しさんNGNG
>>231
http://www.dinkum.com/vc_fixes.html
直すべし。

つーか、SPに入れてくれよ。>MS
0233デフォルトの名無しさんNGNG
(゚д゚)
0234デフォルトの名無しさんNGNG
>>232 そのdinkumのパッチでsortも直るの?
それに、dinkumのパッチとVC6のSP5は衝突しているヘッダがあって、
どっちを取るか悩ましいっす。
つーか、STLportを使うべきか。
0235デフォルトの名無しさんNGNG
> つーか、STLportを使うべきか。
その方が、何かと幸せだと思われ。
0236デフォルトの名無しさんNGNG
STLport/SGI STLを使わない理由がわからん。
0237デフォルトの名無しさんNGNG
STLportって、list以外はdinkumに比べてちょっと遅くない?
0238デフォルトの名無しさんNGNG
実際に計ってみて遅く、
しかもその遅さが許容範囲を超えるならdinkum patchを宛ててそっちを使え。
0239デフォルトの名無しさんNGNG
そういえば対したことじゃないから忘れてたんだけど、
random_shuffleが元と同じには絶対ならないのって仕様?

(1 2 3 4 5)てsequenceをrandom_shuffleすると
絶対(1 2 3 4 5)にはならないってことね。

とりあえず2回random_shuffleすることにして回避したけど、そのときは。
0240234NGNG
>>236 STLportへいきたいのはヤマヤマなれど、
発注元の意向とかイロイロあるのです。
MSから出ていれば説得できるんだが。
0241デフォルトの名無しさんNGNG
発注元の上の方の人に相談するのはダメ。
技術的な相談は、下から。
下っ端の、技術一本でやってる人つかまえて
たばこでも吸いながらマターリと、
付録のSTLをこき下ろそう。
0242234NGNG
技術的な相談は通っているけど、
問題はそういうことではなくて、
誰が責任をもつか、ってことなんだな。
0243デフォルトの名無しさんNGNG
>>242
うーん、

 VC の STL (Known Bug あり) を使うと MS が責任をとってくれるの?
 STLport を使わずに自作すれば、上の人が責任をとってくれるの?

と考えると、俺は STLport 使うように説得した方が良いと思うけどな。STLport はフリーだけど
品質はかなり高いよ。

もし金を払ってサポートを買いたいって話なら http://www.stlport.org/services.html に情報が
あるから、そちらもどうぞ。

(これ以上は技術と関係なくなりそうだから、プログラマー板かな)
0244デフォルトの名無しさんNGNG
C++相談室でSTLスレ逝けと言われたのでこっち来ました。

STLport好きな人、教えてください。
STLportを使った自分のプロジェクトに、VC++6標準のSTLを使ったライブラリ(*.libと*.hが利用可能)を
組み込もうとしたんだけど、上手くいかないんですよう。リリースビルド時に例外起こして逝きます。
デバッガで追いかけてみたらdelete時にメモリ破壊してました(debugビルド時は平気)。
ライブラリのヘッダの
#include <vector>
でSTLportの方のvectorがincludeされてしまい、おそらくそれが原因では無いかと思っておるのですが。
0245デフォルトの名無しさんNGNG
オプションのディレクトリのインクルードファイルのとこを見てみなさい。
STLportが一番下ならSTLportが試用されていない。
STLportが一番上ならSTLportが試用されている。

libと同じ設定でビルドしなさい。
0246デフォルトの名無しさんNGNG
>libと同じ設定でビルドしなさい。
すみません、それってlibと同じようにVCのSTL使えって事デスカ?

STLportのディレクトリ設定は、コンパイラに引数で渡してますので最優先で検索されてます。
0247デフォルトの名無しさんNGNG
>>244
STLport は確かマクロを定義すると、ネームスペース std:: ではなく stlport: に閉じ込められるはず。
そうした上で std::vector() と stlport::vector() を別モノとして区別して使うしかないと思われ。

vector なんかを include するときには、諦めてフルパスで 2 つ書くか、STLport の方にはパスを切
らずに、親ディレクトリにパスを切って

#include <vector>
#include <stlport/vector>

みたいに使うとか。(試したことないけど)
0248デフォルトの名無しさんNGNG
カスタムアロケータを実装する時に参考になる書籍とかウェブサイト
ありませんか?日本語だと嬉しいのですが
0249デフォルトの名無しさんNGNG
すみません、クラスのインスタンスの保存で質問なのですが・・・
class a{
proteted:
char b;
int c;
};
class d{
public:
vector<a> e;
};
int main(){
d* D=new d();
a A;
D->e.push_back(A);
int fh;
fh=_open(....,....,...);
//Dをwriteしたい
_close(fh);
return 0;
}
で、Dの内容を書き込みたいのですが、クラスのベクトルを含んだサイズを取得するにはどうすればよいのでしょう。
0250名無しさん@EmacsNGNG
>>249
for_each(D->e.begin(), D->e.end(), hoge());

って感じで hoge() で書き込む処理を書いとくんじゃだめかい?
# ビミョーに主旨と違う答えな気もするけど
0251デフォルトの名無しさんNGNG
「クラスのベクトルを含んだサイズ」が分かったとして、あとどうするの?
0252デフォルトの名無しさんNGNG
>251
write(fh,D,sizeof(D));だったら、ベクトルの中身まで保存されないのです。。。
0253デフォルトの名無しさんNGNG
>>248
http://www.josuttis.com/cppcode/allocator.html
0254248NGNG
>>253
ありがとうございます
なかなかシンプルですね(w もうちっと詳しいのどこかに無いかなあ

書籍なんかでもほとんど解説が無いのですがカスタムアロケータって
こういうものでしょうか?
0255デフォルトの名無しさんNGNG
>>254
Effective STL の Item 11.

4 page 弱だが、最低限必要なことは書いてあると思われ。
0256デフォルトの名無しさんNGNG
>>249 >>252
基本的にポインタが含まれるクラスや構造体をバイナリイメージのまま保存しても、ポインタ値が保存されるだけでその参照先は保存されないので、意味がないです。
必要な要素を1個ずつ地道に保存しましょー。
0257デフォルトの名無しさんNGNG
>>254
Modern C++ Design は?
0258デフォルトの名無しさんNGNG
STLはこっちで議論しろage
0259デフォルトの名無しさんNGNG
STL、すっごい便利なものだとは思うが
いざ使おうとなると、
???。
0260名無しさん@EmacsNGNG
Effective STL ってまだ日本語訳出ないの?
0261デフォルトの名無しさんNGNG
VCのSTLとSTLPortで、
string s1, s2="abc";
s1.assign(s2, 0, s2.size()+1);
if("abc" == s1)
cout << "success" << endl;
else
cout << "failure" << endl;
s1.assign(s2.c_str(), s2.size()+1);
if("abc" == s1)
cout << "success" << endl;
else
cout << "failure" << endl;
を実行した結果が
 success
 failure
になるんだけど、stringの仕様的にはこれってありなんですかねー?
なんでこうなっちゃうのかはわかるんだけど、
stringの仕様がいまいちわからん。
0262デフォルトの名無しさんNGNG
>>261
std::stringはヌル文字終端ではなく、サイズとデータの組で扱うものなので
(中にヌル文字を含められる)
後者が不一致なのは正しいよ。
0263261NGNG
すばやいレスどうもありがとうございます。
下が不一致なのは分かるのですが、
上が一致するのは正しいのでしょうか?
というか一致させなければならないのでしょうか?
最近stringクラスを自作していて疑問に思ったもので・・・
0264デフォルトの名無しさんNGNG
>>263
stringからassignした場合、size()より大きな長さ指定しても
size()で丸められるからだよ。
0265261NGNG
>>264
しかし、ポインタからでもchar_traits::length等で
長さを取得し、丸めることはできると思うのですが・・・
ここら辺は効率、ということなのでしょうか?
0266デフォルトの名無しさんNGNG
>>265
ポインタからでサイズ指定がある場合は
ヌル文字終端とみなさないでデータブロックとみなすからじゃないかな。
0267261NGNG
>>266
やっぱ、そうなんですかねー・・・
しかし、STLは奥が深いですねー
0268デフォルトの名無しさんNGNG
>>267
そうでないと「ヌル文字を含むことができる」という仕様なのに
それに適合するデータブロックを設定することができなくなるし。
0269261NGNG
>>268
個人的にはあそこの引数にはC文字列しか渡せないのかと思っていたので・・・
色々ありがとうございました。
0270デフォルトの名無しさんNGNG
>しかし、STLは奥が深いですねー
stringはSTLじゃないよ
0271261NGNG
>>270
よく見てますねー(汗
確かにちがいますね。失礼しました。
STLじゃないということで気がついたんですが、
complexクラスの詳しい使い方等知っていらしゃいませんかねー、となたか?
できれば日本語でプリーズ
0272デフォルトの名無しさんNGNG
basic_stringは今みるとsgi STLにも入ってるような。
それとはもかくcomplexもSTLだっけ?(笑)

でcomplexだが、VCあるならhelpみれば分からん?
0273261NGNG
>>272
半分くらいしかわからないのは、数学力が無いせいなのでしょうか・・・(汗
一から出直してきます・・・
0274std::stringNGNG
std::stringをメンバ変数に持ったクラスをdll(非MFC)にしたときに発生する
以下のWarningって防ぎようがないんでしょうか?

warning C4251: 'm_strName' : class 'std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' は __export キーワードを使って class 'Test' にエクスポートし
てください。

dllにできないばっかりにMFC(CString)は使いたくないんですが・・・
0275デフォルトの名無しさんNGNG
>>274 VC++6の標準ライブラリを使ってるのだよね?
DLL生成において -MD 指定してる?
0276デフォルトの名無しさんNGNG
_TCHARみたいに_UNICODEがdefineされてる場合は「wchar_t」されてない場合は「char」
みたく、stringが展開される標準のマクロってないんですか?
たとえば、_STRINGにしておけばUnicodeの切り替えが簡単にできるとか
0277std::stringNGNG
>>275 ありがとうございます。

/MDじゃなくて /MTDになってました。(デバッグ用ライブラリみたいです)。
/MDに変更したら、うまくいきました。

MSVCPRT.LIB マルチスレッド、ダイナミック リンク (MSVCRT.DLL 用インポート ライブラリ) /MD _MT, _DLL

Debug Multithreaded (MTd)
0278デフォルトの名無しさんNGNG
>>276
std::basic_string<_TCHAR>
0279デフォルトの名無しさんNGNG
stringの動的配列を作ろうと思って、
vector<string>
ってやったんですが、どうしてもWarningが消えないんです。
(warning C4786,VC++6.0)

皆さんはstringの動的配列を使いたいなぁってときはどうしてますか?

-----
#include <windows.h>

#include <vector>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
vector<string> vsNames;

return 0;
}
0280デフォルトの名無しさんNGNG
>>279
その Warning はまともなソース書いててもSTL使ってる限りどうやっても避けれん。
悪いのはプログラマじゃなくてVC++のほう。

#pragma 使って無理やり消すべし。

#pragma warning(disable:4786)

うろ覚えだから書き方間違ってるかも。
MSDNで #pragma の warning について調べてみろ。
0281デフォルトの名無しさんNGNG
#pragma warning(disable:4786)
VC++でSTL使うときの基本中の基本。つか検索しろよ。
0282デフォルトの名無しさんNGNG
被ったか。
0283280NGNG
うが!!消えました。
すみませんです。ありがとうございますです。
0284デフォルトの名無しさんNGNG
std::bind1st(std::mem_fun_ref(&std::vector::resize()), num)
ってできるようになってくれるといいと思わない?
(上のコードちょっと間違えてるかもしれない(特にmem_fun_refの引数)けど、
その辺は見逃して…
0285デフォルトの名無しさんNGNG
>>284
すでに何をしてるコードだかわかんないyo!
0286デフォルトの名無しさんNGNG
>>285
vector の参照 v を渡したときに、

 f(v) の実行 => v.resize(num) の実行

となるような関数オブジェクト f を作りたいんじゃないの。たとえばネストした 2 次元の vector があったときに、
内側の vector に対して、まとめて resize とか reserve したい場合に使える。こんな感じか。

vector<vector<int> > vv;
for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 1));
for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 1));

Borland C++ Compiler 5.5.1 と gcc 2.95.3 で試してみたけど、コンパイルが通ったり通らなかったりだなぁ。
VC6 は void 型のメソッドに対して関数オブジェクト作れないので論外だけど。
0287デフォルトの名無しさんNGNG
>>286
>VC6 は void 型のメソッドに対して関数オブジェクト作れないので論外だけど。
無駄にbool型にしたりして急をしのいだりした。
あと、VCのせいではないけどmem_fun系で参照の参照がどうたらこうたらというのも鬱陶しい。
0288デフォルトの名無しさんNGNG
>>273
std::complexなんて思いっきり直感そのままなんだから、
複素数を使いたいんだったら何も悩むこと無いと思うんだけど。
つーか、分からないのに使いたい、というシチュエーションがありえるのか...

#次のスレタイトルは標準C++ライブラリに変更したいね。
0289デフォルトの名無しさんNGNG
>>287
boost::bind() とか boost::ref() を使うと幸せになれる。

コレクション v に入ってる要素それぞれについて iter->exec(con); を実行したい、ただし con は参照渡し
という場合のサンプルコード。

for_each(v.begin(), v.end(), bind(&Foo::exec, _1, ref(con));
0290STL消防NGNG
vectorで指定インデックスの要素を削除して
配列を詰める方法どうやるん?

vector<int> ary;
ary.push_back(10);
ary.push_back(20);
ary.push_back(30);
ary.erase(1);

こんなんじゃダメでしょ?
0291デフォルトの名無しさんNGNG
>>290
vector<T>::erase() の引数は iterator だから、

ary.erase(ary.begin() + 1);

だろう。vector だと begin() で random access iterator を返してくるので、それに +n して n 番目
の要素を指すイテレータが得られる。
0292290NGNG
>>291
なるほど、begin()に足せばよかったんですね。
実際にやってみたら出来ました。ありがとございました。
0293STL勉強中NGNG
ptr_fun()をバインダとともに使用したいのですが、うまく働きません。
Borland C++ 5.5.1を使用しているのですが、以下のコードがコンパイ
ルエラーになってしまいます。

void foo(const int &i, const char *s)
{
 cout << s << i << endl;
}

int main()
{
 int d[] = {1, 2, 3, 4 };
 vector<int> v(d, d + sizeof(d) / sizeof(int));

 for_each(v.begin(), v.end(), bind2nd(ptr_fun(foo), "foo:%d"));
}

エラー E2350 C:\Program Files\Borland\CBuilder5\Include\function.h 327: 参照型へのポインタあるいは参照は定義できない(関数 main() )
エラー E2285 C:\Program Files\Borland\CBuilder5\Include\function.h 338: 'binder2nd<pointer_to_binary_function<const int &,const
char *,void> >::binder2nd(binder2nd<pointer_to_binary_function<const int &,const char *,void> >&)' に一致するものが見つからない
(関数 bind2nd<pointer_to_binary_function<const int &,const char*,void>,char *>(const pointer_to_binary_function<const int &,
const char *,void>&,char * const &) )

『プログラミング言語C++第3版』のP.601に似たようなコードが載っ
ているので、いけそうな気がしたんですが、書き方が悪いのかなあ。
0294名無しさん@EmacsNGNG
>293
何故ダメなのかはちょっと分からないんだけど, foo の引き数を
const int& から int に変えると g++ 2.95.3 ではコンパイル通るよ.
実際,int とかは参照よりも値渡しの方がパフォーマンスいいし,
参照の必要が無いんなら int にしてみては?
# 必要があるんだと・・・どーすりゃいいのかねぇ.
0295デフォルトの名無しさんNGNG
>>294
boost::bind(), boost::ref() でいけると思うが。

http://www.boost.org/
0296デフォルトの名無しさんNGNG
Rubyに移行せよ!
0297STL勉強中NGNG
>>294
> 何故ダメなのかはちょっと分からないんだけど, foo の引き数を
> const int& から int に変えると g++ 2.95.3 ではコンパイル通るよ.

おお。すばらしい。こちらでも通るようになりました。いろいろ試して
はいたんですが参照とは気がつきませんでした。ありがとうございます。

>>295
教科書にも載っている基本的な部分での問題だったので、気になってい
たのですよ。boostは先ほどダウンロードしましたので、余裕が出来た
ところで英語と格闘してみます。

>>296
いや、それはちょっと(^^;
0298デフォルトの名無しさんNGNG
std::istream_iteratorとostream_iteratorに
transform()を適用したいのですが、可能でしょうか?
0299デフォルトの名無しさんNGNG
transformの引数はinput iteratorとoutput iteratorだから、規格ではOK。
つうか、調べればすぐわかることだし、やってみればいいのに。
0300デフォルトの名無しさんNGNG
テンプレート使うと、デバッグしにくくなる気がするんだけど、
気のせいですか?
0301デフォルトの名無しさんNGNG
>>300
俺は VC6 メインだけど、デバッガ優秀なんで、それほど。

むしろコンパイルエラーが出たときに、エラーメッセージを解読するのが疲れる。
0302名無しさん@EmacsNGNG
うん,漏れもエラーメッセージがねぇ・・・
typedef した名前を表示してくれるとカナーリ違うと思うんだけど,それは
望み過ぎだよなぁ,やっぱ.
シンタックスエラーで間違った typedef とかが表示されたら尚更ワケワカンネーヨ
状態になっちまうもんなぁ.
0303302NGNG
sage 忘れた,スマソ
0304デフォルトの名無しさんNGNG
>>300
疲れる。このブレークポイントはどのテンプレート実体を対象にしたものですか?みたいなダイアログが出てきて少しとまどう。
0305デフォルトの名無しさんNGNG
デバッグ中、コンテナの中身を確認できないのでやりにくい。
一度、デバッグするために配列にコピしたこともあるけど、ほとんどは
想像でやってる。
0306デフォルトの名無しさんNGNG
確かに、一般的なコンパイラだと、templateつかうとデバッグしにくい。
templateの最大の欠点だと思う。

でも、しにくいのはコンパイラエラー潰しであって、
ロジックエラーは他と対して変わらないからそんなに気にならない。
コンテナの中身が見難いのはどうしようもないけど。

VC6は便利だけど、templateの実相が甘すぎてtemplate自体が使いにくい。
規格通りのコンパイラがあればいいんだけどねえ。
0307デフォルトの名無しさんNGNG
>>299
いや、書き方が悪かった。
transform()の第二引数が、istream_iteratorのケツなんだけど、
それを得る方法がない、の意です。

0308デフォルトの名無しさんNGNG
>>300
g++だと最低だね。慣れるまでとてもヨメネー。
0309デフォルトの名無しさんNGNG
小ネタを、
引数つきコンストラクタいろいろを犠牲にしていいなら、
typedef std::vector<MyClass> MyVector
↑より↓のが、シンボル短くていいぞ。
class MyVector : public std::vector<MyClass> {};
役に立つ?
0310299NGNG
>>307
ごめんなちゃ〜い。ちょっと考えて読めばわかりますね。勘違いでちた。
で、回答(試してないけど)ですが、istream_iteratorをデフォルトコンストラクタで作ると、
それがファイル終端になるはずです。記憶違いじゃなければ。
途中で止める方法は、しらない。
0311デフォルトの名無しさんNGNG
VC++6のツール->オプション->ディレクトリのインクルードファイルに
.../STLport4.5.1/stlportを指定して最上段に置いたんですが、
コンパイル時に

_site_config.h(51) : fatal error C1189: #error :
"Only multi-threaded runtime library may be linked with STLport!"
cl.exe の実行エラー

なるものが出ます。
STLportの導入って何か他にすべきことがあるんでしょうか・・・。
0312デフォルトの名無しさんNGNG
エラーよめよ。
C/C++ コード生成 使用するランタイムライブラリを
マルチスレッド系にしる!っていわれてんだよ。
0313311NGNG
>>312
ありがとう(TдT) ついでに聞かせておくれ。
使用するランタイムライブラリの変更ってどこでできるのですか・・・。
0314313NGNG
はうっ。判りました。ありがとう〜。
0315デフォルトの名無しさんNGNG
>313=314
せめてどうやったかぐらい書くのが礼儀だろ.
0316デフォルトの名無しさんNGNG
>>314
そんなんもわからん奴がSTLport使おうとすること自体なんか間違ってると思われ。
いや、STLport使うことで面倒が減るという点において良い効果があることは当然なんだけどね。
0317デフォルトの名無しさんNGNG
>>312
シングルスレッドで iostream も要らんのなら

#define _STLP_NO_OWN_IOSTREAMS 1
#define _STLP_NO_THREADS 1

とかもアリ。
0318311NGNG
失礼こきました。経過報告です。
『マルチスレッド系にしる』とのことでVC++6のヘルプで調べて
プロジェクト→設定→C/C++→カテゴリ→コード生成→マルチスレッド
にしてコンパイルしたところ上記のエラーは消えました。
# VC++6初心者でどこに何があるか判ってなくてすみません。
で今度はリンク時にstl_port_vc6_static.libがないと言われたので、
STLport4.5.1のsrcディレクトリを見るといろいろあったので
NMAKE -f vc6.makとかして出来上がったlibディレクトリを
ツール→オプション→ディレクトリ→ライブラリファイル
に追加しました。これで動きました。

>>317
ありがとございます。
0319デフォルトの名無しさんNGNG
なかなか素直でよろしいですな.

ところで Effective STL って訳本出る予定無いんかな?
0320ageNGNG
age
0321長いかもNGNG
ファイルからの読み出しに関して質問があります。

アスキーファイルから1行づつデータを取り出して、それをstd::stringに放り込みたいと
思ってます。

で、まず以下のようにしました。

std::ifstream fsHoge("hoge.txt");

while( !fsHoge.eof())
{
string strBuf;

fsHoge >> strBuf;

cout << strBuf.c_str() << std::endl;
}

ですが、これはhoge.txtの中身が
aaa bbb ccc
ddd eee fff 111 222 333

のような場合には意図したようになりません。

char szBuf[1024];
fsHoge.getline(szBuf, 1024);
cout << szBuf << std::endl;

とgetlineを使えば実現できるのですが、1行の長さが1024を超える可能性があるので
不安です。サイズを大きめにとっておけばいいのですが、せっかくstringを使ってるのに
ここでchar[]を使いたくないです。

希望としては、

fsHoge >> strBuf;

としたときに、スペースも文字列として認識する方法とかがあればいいなと思ってます。
何かいい方法ご存じないでしょうか?よろしくお願いします。
0322デフォルトの名無しさんNGNG
>>321
string::getlineはどうよ?
 template<class E, class T, class A>
 string::basic_istream<E, T>& getline(basic_istream <E, T>& is, basic_string<E, T, A>& str);
0323デフォルトの名無しさんNGNG
std::getline()じゃなかったか?
while (getline(fsHoge, strBuf)) {
 cout << strBuf << endl;
}
みたいな。
0324長いかもNGNG
getlineでできましたぁ。
ありがとうございました。>>322 >>323

while (getline(fsCurrentMail, strBuf)) {
cout << strBuf.c_str() << endl;
}

これでchar[]の呪縛から逃れられますです。
0325デフォルトの名無しさんNGNG
なぜに
cout << strBuf.c_str() << endl;
なの?
0326デフォルトの名無しさんNGNG
>325
漏れもそれは気になってた
0327長いかもNGNG
>>325
>なぜに
> cout << strBuf.c_str() << endl;
> なの?

あれ?昔stringをそのまま放り込んだらエラーになった経験が・・・
0328長いかもNGNG
自己レス

> あれ?昔stringをそのまま放り込んだらエラーになった経験が・・・

すみません。
#pragma warning(disable:4786)

を入れる前の話でした。
0329STL勉強中NGNG

boostを試してみました。コンパイラは以前に引き続き、Borland C++ 5.5.1
を使用しています。とりあえず以下のようなコードを書き、1)の部分を
いろいろいじくってテストしてみました。

  vector<vector<int> > vv;

  vv.resize(4);
1) for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::reserve, _1, 10));

  transform(vv.begin(), vv.end(), ostream_iterator<int>(cout, ","),
    boost::mem_fn(vector<int>::capacity));
  cout << endl;

この状態だと期待通りの動きをしています。次にboostを使わず

2) for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 11));

としてみると、コンパイルは通るのですが、reserve()は実行されてい
ないみたいで、結果が

0,0,0,0,

となります。まあ1)で動いているので問題はないのですが。これは
mem_fun_ref()に問題があるのかなと思い、代わりにboost::mem_fn()を
使用してみました。

3) for_each(vv.begin(), vv.end(), bind2nd(boost::mem_fn(&vector<int>::reserve), 12));

するとコンパイルも通らなくなります。std::bind2nd()の方の問題なの
かな?

最後にresize()も試してみました。

4) for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 10));

> 致命的エラー F1004 mem_fn.cpp 18: コンパイラ内部のエラー(関数 main() )

ぎゃふん。
0330デフォルトの名無しさんNGNG
Effective STL どうだった?
0331デフォルトの名無しさんNGNG
>329
g++ 3.0.3 だったら以下のコードでキチンと動いたよ
# g++ 2.95.3 はコンパイル通らず
vector<vector<int> > vv;
vv.resize(4);
for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 11));
transform(vv.begin(), vv.end(), ostream_iterator<int>(cout, "\n"),
     mem_fun_ref(&vector<int>::capacity));

>330
買い
■ このスレッドは過去ログ倉庫に格納されています