C++相談室 part37

このエントリーをはてなブックマークに追加
952951:04/11/26 10:09:52
-もしくはmakeContainerをchar (const) *について特殊化するか,かな.
+もしくはmakeContainerをchar const *についてオーバーロードするか,かな.
953デフォルトの名無しさん:04/11/26 10:27:00
> 追記.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が上手くいっていたのは偶然なのでしょうか?
955デフォルトの名無しさん:04/11/26 11:45:16
reserveってのはresize時の効率を上げるためにあらかじめ領域を予約するものであって、実際にresizeするまではその領域を使っては*いけない*。
領域自体は確保済みなので一般保護例外などはでないだろうが、vector内部の管理情報は壊れていても不思議ではない。
956954:04/11/26 11:48:03
>>955
ありがとうございます。コンテナ以外もたまたま動いていただけなんですね。
全力で全痴漢してきます。
957デフォルトの名無しさん:04/11/26 18:58:01
メンバのoperator==はメンバ関数ポインタに入れられないのですか?
958デフォルトの名無しさん:04/11/26 19:34:53

std::vector<boost::shared_ptr<Foo> >::iterator i
= std::find_if( hoge.begin(), hoge.end(),boost::bind( &Foo::operator==, _1, foo ) );
としたいのです
959デフォルトの名無しさん:04/11/26 20:01:53
std::equal_to
960デフォルトの名無しさん:04/11/26 20:18:59
>>958
問題なさそうに見えるが、Foo か operator== のどちらかがテンプレート引数を必要としたりオーバーロードで曖昧になってたりしないか?
961デフォルトの名無しさん:04/11/26 20:49:05
>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で良いんじゃ・・・.
962958:04/11/26 21:10:03
>>959
それだとshared_ptrの==が使われてしまい意図したものではありません。

>>960
おっしゃるとおりでコンパイラは”関数の引数があいまいなためテンプレート引数を減少できません。”といっていました。
Fooのoperator==をFooだけでなくstd::stringでも比較できるようにしていました。
オーバーロードしないようにすればコンパイルできましたが、引数からoperator==を選択してくれないのでしょうか?
bind<・・・>に型を指定してやれば解決するかと思いましたが私にはむりでした。
今はとりあえずforループを回しております。
963デフォルトの名無しさん:04/11/26 21:21:48
>>961
ええと、しょうしょう混乱しておりますが。

>それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
というのは>>959さん宛てですかね?
ちがったりして。

ndirect_iteratorは知りませんでした。調べてみます。
964デフォルトの名無しさん:04/11/26 21:22:10
>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);
965デフォルトの名無しさん:04/11/26 21:30:01
>963
おっと,ごめんなさい.961はboost::lambda::bindの話です.忘れてください.

#shared_ptrに対する挙動がboost::bindとboost::lambda::bindで違う・・・.
966デフォルトの名無しさん:04/11/26 21:35:12
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含む】
でいきましょう
967デフォルトの名無しさん:04/11/26 21:37:45
>>966
STLとかBoostとか関係なく、
ベストな方法を知りたい、みたいな質問をしたい時はどこ?
968デフォルトの名無しさん:04/11/26 21:39:44
>>964
ありごとうございます。
boost以前の問題でしたね。もっと勉強します。
lambdaはうちのコンパイラが使うな(えない)というもので。。。
969デフォルトの名無しさん:04/11/26 21:41:49
>>967
そういのはここ(と後継のスレ)でいいのではないでしょうか?
話長くなりそうだったら専門スレに誘導してそこで続けていただくといいと思います
970デフォルトの名無しさん:04/11/26 21:43:24
>>966
名前は短い方がいい
余計なものくっつけるな
971デフォルトの名無しさん:04/11/26 21:43:46
>>967
ここで聞くと解決するまえにスレ終りそうだから、
新スレ立ててそこで質問しちくり。
972デフォルトの名無しさん:04/11/26 21:44:27
>>970
くっつけないと重複スレが立つんだよ。
973デフォルトの名無しさん:04/11/26 21:45:33
エキスパートが回答してくれれば
どこに質問したっていいって気分。
974デフォルトの名無しさん:04/11/26 21:46:14
>968
>lambdaはうちのコンパイラが使うな(えない)というもので。。。
相手の環境を考慮してなかったです.本当に申し訳ない.
975デフォルトの名無しさん:04/11/26 21:47:17
>>966
ISO/IEC14882で定義される範囲は「C++」でしかねえよな
STLだのtemplateだのと断片だけのスレは重複もいいとこ

つーと、残れるのはboostくらいか
976デフォルトの名無しさん:04/11/26 21:57:43
977デフォルトの名無しさん:04/11/26 21:57:51
あ"ー
978v(^・^)v:04/11/26 22:18:09
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
979v(^・^)v:04/11/26 22:18:27
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
980デフォルトの名無しさん:04/11/26 22:19:16
>>978
#include "stdafx.h"
みたいにプリコンパイル済みヘッダーをインクルードするか、
ファイルの設定でプリコンパイル済みヘッダーを使わないように設定する。
981デフォルトの名無しさん:04/11/26 22:25:45
こっちにテンプレ貼ってどうする
982デフォルトの名無しさん:04/11/26 22:43:16
ここは人工無能のいるスレでつか?
983デフォルトの名無しさん:04/11/26 22:46:12
人工無能ってなに?
984デフォルトの名無しさん:04/11/26 22:46:27
スレってなに?
985デフォルトの名無しさん:04/11/26 22:46:42
でつかってなに?
986デフォルトの名無しさん:04/11/26 22:47:08
ここってなに?
987デフォルトの名無しさん:04/11/26 22:48:08
Ruby!!!!!!!!!!!!!!!!!!!!!!
988デフォルトの名無しさん:04/11/26 22:57:38
Rubyつかうと一気に○○○が10倍に?!

↑○○○を埋めて。
989デフォルトの名無しさん:04/11/26 22:58:14
リスク
990デフォルトの名無しさん:04/11/26 22:59:06
さて、お取り込み中の所大変申し訳ありませんが、カウントダウンの時間です。
991デフォルトの名無しさん:04/11/26 22:59:28
9
992デフォルトの名無しさん:04/11/26 23:00:35
除夜の鐘みたいだ。
993デフォルトの名無しさん:04/11/26 23:00:45
>>988
ヘタレ
994デフォルトの名無しさん:04/11/26 23:03:05
>>988
そくど
995デフォルトの名無しさん:04/11/26 23:04:03
>>988
おなか
996デフォルトの名無しさん:04/11/26 23:04:23
>>988
こしけ
997デフォルトの名無しさん:04/11/26 23:05:20
>>988
肥満度
99810000000!!!!!!!!!!:04/11/26 23:05:27
10000000!!!!!!!!!!
999デフォルトの名無しさん:04/11/26 23:05:37
1000(σ´Д`)σゲッツ!!
1000一億:04/11/26 23:05:50
一億
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。