-もしくはmakeContainerをchar (const) *について特殊化するか,かな.
+もしくはmakeContainerをchar const *についてオーバーロードするか,かな.
> 追記.char (const) * constはRangeのモデルにならないです.
> 動かせないポインタ渡されて'\0'探せって言われても困るでしょ.
ポインタをコピーすれば困らないよ。
range側の特殊化が抜けてるだけじゃないの?
954 :
デフォルトの名無しさん:04/11/26 11:29:43
#include <vector>
struct ClassV{
int val;
std::vector<int> vecInt;
};
int main(int argc, char* argv[]){
std::vector<ClassV> vecClassV;
vecClassV.reserve( 5 ); //resizeならBもerrorにならない
for( int i=0; i < 5; ++i ){
vecClassV[i].val = 4649; //errorが出ない …A
}
for( int c=0; c < 5; ++c ){
vecClassV[c].vecInt.reserve(10); //error …B
}
return 0;
}
お願いします、上記のコードなのですが、
恐ろしいことに今までreserveを使いAみたいな事をしていました。
しかしBのようにコンテナを使わない限り、今までの所、特に困ったこともありませんでした。
全て書き直す前にお尋ねしたいのですが、Aが上手くいっていたのは偶然なのでしょうか?
reserveってのはresize時の効率を上げるためにあらかじめ領域を予約するものであって、実際にresizeするまではその領域を使っては*いけない*。
領域自体は確保済みなので一般保護例外などはでないだろうが、vector内部の管理情報は壊れていても不思議ではない。
>>955 ありがとうございます。コンテナ以外もたまたま動いていただけなんですね。
全力で全痴漢してきます。
メンバのoperator==はメンバ関数ポインタに入れられないのですか?
↑
std::vector<boost::shared_ptr<Foo> >::iterator i
= std::find_if( hoge.begin(), hoge.end(),boost::bind( &Foo::operator==, _1, foo ) );
としたいのです
std::equal_to
960 :
デフォルトの名無しさん:04/11/26 20:18:59
>>958 問題なさそうに見えるが、Foo か operator== のどちらかがテンプレート引数を必要としたりオーバーロードで曖昧になってたりしないか?
>953
やっぱりそうなんですかねぇ.
>958
それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
indirect_iterator使って
vector<shared_ptr<Foo> >::iterator i
= find_if(make_indirect_iterator(hoge.begin()),
make_indirect_iterator(hoge.end()),
bind(&foo::operator==, _1, foo3) ).base();
とか,lambda使って
vector<shared_ptr<foo> >::iterator i
= find_if(hoge.begin(), hoge.end(), bind(&foo::operator==, *_1, foo3));
とか(このbindはlambdaのbind).というか普通にfindで良いんじゃ・・・.
>>959 それだとshared_ptrの==が使われてしまい意図したものではありません。
>>960 おっしゃるとおりでコンパイラは”関数の引数があいまいなためテンプレート引数を減少できません。”といっていました。
Fooのoperator==をFooだけでなくstd::stringでも比較できるようにしていました。
オーバーロードしないようにすればコンパイルできましたが、引数からoperator==を選択してくれないのでしょうか?
bind<・・・>に型を指定してやれば解決するかと思いましたが私にはむりでした。
今はとりあえずforループを回しております。
>>961 ええと、しょうしょう混乱しておりますが。
>それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
というのは
>>959さん宛てですかね?
ちがったりして。
ndirect_iteratorは知りませんでした。調べてみます。
>962
オーバーロードされた関数へのポインタを取る場合,
ポインタを取った瞬間にどのオーバーロードへのポインタなのかを
指定してやる必要があります.そのまま汎用関数の引数にすることは出来ません.
典型的にはキャストを使うか
static_cast<bool (Foo::*)(Foo const &) const>(&Foo::operator==)
一旦メンバポインタ変数に代入してから使います.
bool (Foo::*pmf)(Foo const &) const = &Foo::operator==
上のシグネチャはただの例なので実際のoperator==のシグネチャに読み替えて下さい.
・・・っていうか,lambdaが一番楽だと思いますよ.
vector<shared_ptr<foo> >::iterator i
= find_if(hoge.begin(), hoge.end(), *_1 == foo);
>963
おっと,ごめんなさい.961はboost::lambda::bindの話です.忘れてください.
#shared_ptrに対する挙動がboost::bindとboost::lambda::bindで違う・・・.
C++関連のスレが乱立して
閑散としているスレが増えて来ましたので
再編を提案します
http://pc5.2ch.net/test/read.cgi/tech/1101384692/ 現状でC++関連は
【C++】template 統合スレ
【C++】STL(Standard Template Library)相談室
BOOSTを語れゴラァ
C++相談室 part37
とありますがこれらは
標準C++相談室【STL含む】
C++テンプレート相談室【Boost/Loki】
の2本に統合でいいように思います
どうでしょうか? 異論がなければ
ここの次スレの名前は標準C++相談室【STL含む】
でいきましょう
>>966 STLとかBoostとか関係なく、
ベストな方法を知りたい、みたいな質問をしたい時はどこ?
>>964 ありごとうございます。
boost以前の問題でしたね。もっと勉強します。
lambdaはうちのコンパイラが使うな(えない)というもので。。。
>>967 そういのはここ(と後継のスレ)でいいのではないでしょうか?
話長くなりそうだったら専門スレに誘導してそこで続けていただくといいと思います
>>966 名前は短い方がいい
余計なものくっつけるな
>>967 ここで聞くと解決するまえにスレ終りそうだから、
新スレ立ててそこで質問しちくり。
エキスパートが回答してくれれば
どこに質問したっていいって気分。
>968
>lambdaはうちのコンパイラが使うな(えない)というもので。。。
相手の環境を考慮してなかったです.本当に申し訳ない.
975 :
デフォルトの名無しさん:04/11/26 21:47:17
>>966 ISO/IEC14882で定義される範囲は「C++」でしかねえよな
STLだのtemplateだのと断片だけのスレは重複もいいとこ
つーと、残れるのはboostくらいか
977 :
デフォルトの名無しさん:04/11/26 21:57:51
あ"ー
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>>978 #include "stdafx.h"
みたいにプリコンパイル済みヘッダーをインクルードするか、
ファイルの設定でプリコンパイル済みヘッダーを使わないように設定する。
こっちにテンプレ貼ってどうする
ここは人工無能のいるスレでつか?
983 :
デフォルトの名無しさん:04/11/26 22:46:12
人工無能ってなに?
984 :
デフォルトの名無しさん:04/11/26 22:46:27
スレってなに?
985 :
デフォルトの名無しさん:04/11/26 22:46:42
でつかってなに?
ここってなに?
Ruby!!!!!!!!!!!!!!!!!!!!!!
988 :
デフォルトの名無しさん:04/11/26 22:57:38
Rubyつかうと一気に○○○が10倍に?!
↑○○○を埋めて。
リスク
さて、お取り込み中の所大変申し訳ありませんが、カウントダウンの時間です。
9
992 :
デフォルトの名無しさん:04/11/26 23:00:35
除夜の鐘みたいだ。
993 :
デフォルトの名無しさん:04/11/26 23:00:45
996 :
デフォルトの名無しさん:04/11/26 23:04:23
997 :
デフォルトの名無しさん:04/11/26 23:05:20
10000000!!!!!!!!!!
1000(σ´Д`)σゲッツ!!
一億
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。