[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 04/24 09:47 / Filesize : 46 KB / Number-of Response : 180
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:13:44 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 10
pc11.2ch.net/test/read.cgi/tech/1219719677/

過去ログ・リンク・書籍紹介は >>2 以降

40 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:39:32 ]


41 名前:デフォルトの名無しさん [2009/01/23(金) 09:03:13 ]
>>38 >>40

範囲外の反復子に対しての参照外しができないから、何が起こっても文句は言えん

42 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:16:24 ]
>>41
なるほど要素を指してない無効な反復子を渡すのは、当然駄目ということですね。
ありがとうございます!

43 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:00:26 ]
>>42
insert() 以前に、デリファレンスできないイテレータを前に進めた時点で未定義だよ。

44 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:52:50 ]
insert(end,x) も未定義なの?

45 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:55:39 ]
>>44
end() より先に進めてなければ最後に追加されるだけ。

46 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:02:27 ]
>>41-42 読んでend()はデリファレンスできないから
許されていないのかと思った

47 名前:デフォルトの名無しさん [2009/01/23(金) 12:06:21 ]
>>45
アクセス違反になるが・・

48 名前:デフォルトの名無しさん [2009/01/23(金) 12:12:42 ]
>>45
gcc-4.3.2(mingw)
追加されないですよ。

std::vector<int> v;
std::vector<int>::iterator s;
std::vector<int>::iterator e;

v.push_back(0);
s = v.begin();
e = v.end();
std::cout << "before :";
while(s != e)
{
std::cout << *s << "\n";
s++;
}

v.insert(v.end() + 1, 10);
s = v.begin();
e = v.end();
std::cout << "after :";
while(s != e)
{
std::cout << *s << "\n";
s++;
}



49 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:18:45 ]
>>45
endはsize() < max_size()内の有効な反復子でなければならない

50 名前:45(=43) mailto:sage [2009/01/23(金) 12:20:09 ]
>>46-49
「end() より先に進めてなければ」と書いといたのに。
> v.insert(v.end() + 1, 10);

51 名前:デフォルトの名無しさん [2009/01/23(金) 12:21:38 ]
>>50
すまん

52 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:23:08 ]
流れ的に不安だから、念のためまとめとこう。

v.insert(v.end(), 10); // v の末尾に 10 を追加
v.insert(v.end() + 1, 10); // 未定義動作
v.end() + 1; // insert() 無しでこれだけでも未定義動作に突入

53 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:33:00 ]

end()まではOKなのか

54 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:28:52 ]
データをファイルに保存してその内容を読み込んでlistに入れてます
単純なintとかなら出来るのですが、クラスなどになった場合、どのようにデータを取得すればよいでしょうか?

// int の場合はこのようにしてデータを取得しています
using namespace std;
ifstream dataFile("test.dat");
if( !dataFile ) return -1;
istream_iterator iterBegin(dataFile);
istream_iterator iterEnd;
list<int> lstData(iterBegin,iterEnd);
dataFile.close();

55 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:40:05 ]
シリアライズでぐぐれ

56 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 18:15:39 ]
アリガトゴザイマース
Boostがすごすぎる

57 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 01:38:36 ]
endまで有効でend+1が無効なのは、配列変数へのポインタと一緒

char a[10];
char *p1=a+10; // OK
char *p2=a+11; // NG
char *p3=(a+11)-1; // NG (p1==p3は保証されない)

58 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 01:40:47 ]
このうそつきめ!



59 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 01:41:12 ]
p1 もデリファレンスした瞬間アウツなんだよな。

60 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 02:01:24 ]
ポインタの加算演算って型の大きさに合わせて保存してるアドレスの値増減するだけじゃないの?
デリファレンスしてなくてもだめなことあるの?

61 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 02:03:46 ]
>>60
ヌルポインタになるかもしれない

62 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 04:03:58 ]
>>57
p1==p3が保証されないのってマジ?
もしそうならポインタ演算とか怖くて出来なくなるな

63 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 06:06:06 ]
>>60
配列(非配列は要素数1の配列とみなして)の要素か終端までを指すように演算することは
できるけど、その範囲外を指すようにした場合は未定義動作になる。

char a[10];
a - 1; // 未定義動作
a + 10; // 終端なのでまだ大丈夫
a + 11; // 未定義動作

64 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 06:10:58 ]
v.erase( v.end() );
v.erase( v.end(), v.end() );
同じようで違うとゆー

65 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 07:35:54 ]
>>63
ほんとだ。

5.7 Additive operators p5 より
> When an expression that has integral type is added to or subtracted from a pointer,
> the result has the type of the pointer operand. ...
> ... If both the pointer operand and the result point to elements of the same array object, or
> one past the last element of the array object, the evaluation shall not produce an overflow;
> otherwise, the behavior is undefined.

66 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 10:32:33 ]
>>57->>68
この中にウソを言っているものがいる。
このうそつきめ!

67 名前:67 mailto:sage [2009/01/24(土) 10:37:11 ]
   *      *
  *     +  うそです
     n ∧_∧ n
 + (ヨ(* ´∀`)E)
      Y     Y    *


68 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:05:25 ]
なんで皆騙されてんだよw
(a+11)-1 != a+10 が成立する訳ないだろ、そんなんじゃとてもコンパイラ作れねーよ。
もちろん *(a+10)とか*(a-1)とかを使ったら無効なアドレスの参照だから何が起こるかわかんないけど、
ポインタ演算の時点では問題ないっての。





69 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:25:08 ]
a+11がオーバーフロー起こす可能性があって、
その場合-1しても戻るとは限らないってことだろ
>>65によると

70 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:53:33 ]
ちょっと込み入った算式に入れてたりしたら、マズイ場合あるな。
もっとも、ポインタ値みたいなものへの計算値に基づいて
更に計算、みたいな恐いことはまずやらんけど。

71 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:07:29 ]
>>68
実装依存なことと規格で保証されていることの区別のつかないバカ

72 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:29:02 ]
>>71
バカと言えば勝った気になってるバカ

73 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:32:53 ]
実際の配置からすれば、ちょっと飛び出しても大丈夫ではあるよね

74 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:40:36 ]
>>68
オーバーフロー時に例外が発生するCPUでは
(a+11) を実行した時点で例外が発生して比較自体が行われない可能性がある。

75 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:26:42 ]
大人しくa+(11-1)しろってことだよ。

76 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 16:38:12 ]
もちろん、自分がコンパイラを作るときは、
(a + 11) - 1をa + 10と同じ結果にしても構わないんだよ。

77 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:50:11 ]
int *p=0; // nullpointrt;
p+=1;
assert(p!=0);

ヌルポインタをインクリメントした結果が、非ヌルになることも保証されないんだよね
やっぱり

78 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:55:00 ]
オプション次第で変なアドレスを指す際にエラーとするコンパイラがあってもいいんじゃね。



79 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:57:03 ]
その辺をどう扱ってもいいというのがすなわち未定義ということだ

80 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:59:19 ]
文句があるならCの親のBCPLに言いな。

81 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 00:12:29 ]
DSPなんかで、そういう問題が起こるケースがあったと思う

int *getptr(int x) {
static array[0x2000];
return array+(x*10);
}

offsetの計算を16ビットレジスタでやった方が高速化される環境だと
最適化によって x*10の結果の上位を捨てて下位16ビットしか使わないコードが生成されても文句が言えない

82 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 13:47:49 ]
VS2005で動いている既存のプロジェクトにSTLport5.1.0を導入しようとしているのですが
typeinfo.hのbad_castとbad_typeidがC2039・C2873エラーになります。
解決の方法がありましたら教えてください

個人の趣味で作ってるプログラムだし、例外捨ててコメントアウトかな…

83 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 14:02:31 ]
>>82
んー?
ml.tietew.jp/cppll/cppll/thread_articles/5592

84 名前:82 mailto:sage [2009/01/29(木) 15:10:00 ]
ありがとう、見てみました
boost使ってないので少しわからないとこもありますが

5.0〜ならいける的な事が書いてあったりしますが、その後のバージョンなんですよね…

自分はtypeinfo.h内の::bad_cast記述部分二対して 存在しないのでエラーになっているのですが
上記ページだとtypeinfo.hをインクルードしているとかで混乱します

85 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 20:13:48 ]
同じバージョンじゃないから確認とかしてないから話半分に

IOSTREAM(S)をどっちで使うか設定するとこあるから
それに似たbad_cast(exception)とかあるかも

86 名前:デフォルトの名無しさん [2009/01/30(金) 20:36:39 ]
123.writeboard.com/27c7a247acc07351e/login
pass:pgtwit

87 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 21:17:24 ]
ついったー(笑)でやれ

88 名前:デフォルトの名無しさん [2009/02/01(日) 11:42:50 ]
VC2005 Express Edition使っているんだけど
streambuf_iteratorってどのヘッダインクルードすればいいの?



89 名前:88 mailto:sage [2009/02/01(日) 12:09:33 ]
ごめん
istreambuf_iteratorにしてなかったから駄目だったんだ

90 名前:デフォルトの名無しさん [2009/02/02(月) 14:05:11 ]
>>88

#include <iterator>

91 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 16:24:38 ]
VC9+MFCのアンマネージでmapは使えないのでしょうか?
xtreeでアクセス違反が出るんですが・・・

92 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 16:54:44 ]
>>91
それは何か使い方が間違っている。そしてそれは恐らくは、STLに直接関係ない。

93 名前:デフォルトの名無しさん [2009/02/04(水) 18:31:55 ]
すみません、vectorで質問なのですが
//------------------------------------
#include <vector>
using namespace std;

int _tmain(int argc, char* argv[])
{
vector<bool> bool_vect(10);
bool& b = bool_vect[5];

vector<int> int_vect(10);
int& i = int_vect[5];

return 0;
}
//-------------------------------------

bool のほうで以下のコンパイルエラーが出てしまいます
error C2440: '初期化中' : 'std::_Vb_reference<_MycontTy>' から 'bool &' に変換できません。
with
[
_MycontTy=std::vector<bool,std::allocator<bool>>
]

回避する方法はないでしょうか?

94 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 18:36:51 ]
何が目的で参照をとろうとするの?必要性が感じられないのだけど。

95 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 18:40:22 ]
>>93
vector<bool>は使うなカス
詳しくはEffectiveSTL

96 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 18:44:02 ]
>>93
内部がビット操作だったはず

97 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 19:57:39 ]
なるほど、「std::vector<bool>はコンテナの要件を満たしていない。 」のですね。
ありがとうございます。

>>94
実際に必要性が出ているのは、もう少しややこしいコードで、
任意の型の参照を引数に取る関数に
その任意の型のvectorの要素をそのまま渡したかったのです。
とりあえずはboolだけ特殊化して回避することにします。
ただ、任意の型に対応するならvectorじゃなくて配列にした方がいいのかもしれないですね。

ともかくありがとうございました。

98 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 20:21:16 ]
>>97
vector<T>::reference使えばいけるはず。



99 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:23:37 ]
>>98
おぉ、STLっぽくなりました。
ありがとうございます。

100 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:42:37 ]
bool なら deque 使うだろjk

101 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:15:21 ]
deque<bool>とlist<bool>はコンテナだっけ

102 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:41:59 ]
コンテナだよ

103 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 10:45:12 ]
list<bool>・・・
使い道が思いつかないな

104 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 11:07:37 ]
つbitset


105 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:26:30 ]
vector<int>のインスタンスがa,b,cとあって、aとbの要素をつなぎ合わせたcを作るにはどう書くのが一番シンプルですか?
例えばaに1,2,3が、bに4,5,6が入っている時、cを1,2,3,4,5,6にしたいです。

106 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:33:22 ]
c=a; c.insert(c.end(),b.begin(),b.end());

107 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:36:52 ]
>>106
ありがとうございます。

108 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:38:18 ]
intのvectorならこっちの方が速いし自然だよ
>>106は中身がクラスの場合用

size_t a_n = a.size();
size_t b_n = b.size();
std::vector<int> c(a_n+b_n);
memcpy(c.begin(),a.begin(),a_n);
memcpy(c.begin()+a_n,b.begin(),b_n);



109 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:48:05 ]
>>108
なるほど、どうもです。

110 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:03:25 ]
std::vector<int> v = (v1|pstade::oven::jointed(v2))|pstade::oven::copied;

111 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:04:12 ]
>>108
memcpy使うのは最悪だろ

112 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:09:40 ]
>>111
vector と PODの組み合わせなんだから別にいいだろ

113 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:20:27 ]
ovenは相変わらず反則だな

114 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:26:51 ]
わざわざ型安全性を捨ててメモリ不正アクセスの危険を冒してまでmemcpyを使う必要はなかろう
コピーするにしても std::copy を使うべき

よっぽど速度が遅くて困らない限りは >>106 で十分

115 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:33:50 ]
>>108
さっそくバグってるなw
intが1byteの環境はあんまりないよね。

116 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:36:48 ]
自分の場合こんな関数作ってユーティリティに突っ込んである
template<typename T, typename Range>
inline void range_extend(T &t, const Range &r)
{
t.insert(t.end(), boost::begin(r), boost::end(r));
}
// c = a; range_extend(c, b);

117 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:37:59 ]
>>108
vectorのイテレータがポインタではないライブラリではコンパイルエラーだぞ
c.begin() は &c[0] に置き換えないとダメ

118 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:38:09 ]
というか >>108 は memcpy にイテレータを直接渡してるじゃねーか
こんなん論外だ



119 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:43:56 ]
!#include <iostream>
#include <vector>

#include <pstade/oven/jointed.hpp>
#include <pstade/oven/sugar.hpp>
#include <pstade/oven/copied.hpp>
#include <pstade/oven/io.hpp>
#include <pstade/oven/identities.hpp>
#include <pstade/oven/initial_values.hpp>

int main(int, char *[])
{
namespace ov = pstade::oven;
using namespace pstade::oven::sugar;
std::vector<int> a = ov::initial_values(1, 2, 3), b = ov::initial_values(4, 5, 6);

std::vector<int> v = (a >> b)|ov::copied;

std::cout << (v|ov::identities);
}

sugarで(問題部分だけは)さらに短くかけるらしいです

120 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 16:59:27 ]
>よからぬ場所に出入りしていると、当てにならない人物に出くわし、 &v[ 0 ] の代わりに
>v.begin() を使うことができると言われるかもしれない。
(中略)
>率直に言えば、 &v[ 0 ] の代わりに v.begin() を使うよう勧めるような人たちと付き合っているなら、
>交友関係を考え直す必要がある。

スコット・メイヤーズ著 ピアソンエデュケーション刊
Effective STL〜STLを効果的に使いこなす50の鉄則 p.73

121 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:03:40 ]
そもそも >105 の質問は「一番シンプル」な方法を求めているんだから >106 が正解。

再確保によるロスを防ぎたかったら c.reserve(a.size() + b.size()) で準備してから
実行すればいい。 >108 の resize() では無駄な初期化( int の場合は 0 フィル)が入る。

要素型に依存する必要はまったく無い。

122 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:08:49 ]
int の場合に memcpy() に最適化するというのも、ライブラリの実装やコンパイラが判別できる
範囲の話。

123 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:55:23 ]
>>119

pc11.2ch.net/test/read.cgi/tech/1231080841/36

identitiesになにするもの?

p-stade.sourceforge.net/oven/doc/html/oven/range_adaptors.html#oven.range_adaptors.identities

www.codeproject.com/KB/stl/oven.aspx
の9.22を見る限りでは、そのままのRangeが返ってくるみたいだけど・・・



124 名前:統合しました。。。: mailto:sage [2009/02/14(土) 18:06:57 ]

pc11.2ch.net/test/read.cgi/tech/1234420483/

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

125 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 17:21:23 ]
質問です。
STLはヘッダにその実装が書いてあるわけですが、
ということは「翻訳単位毎にコードが生成される」のでしょうか?

a,cpp
b.cpp
両方<vector>をincludeし、両方で vector<int> が使われていた場合、vector<int>のコードは2つ作られてしまうのでしょうか?
EXEファイルの容量がガンガン増えるような気がするのですが・・・

126 名前:統合しました。。。 mailto:sage [2009/02/16(月) 18:18:04 ]
>>125

pc11.2ch.net/test/read.cgi/tech/1234420483/

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

127 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 21:54:46 ]
>125
実装によるが、最終コードでは一つになっているのが普通。
C++ Templates The Complete Guide には 3 つのモデルが載ってる。概要は以下の通り。
1. Greedy Instantiation
翻訳単位ごとにインスタンス化するが、リンカで一つだけ残す。
2. Queried Instantiation
共有のデータベースを持ってそこに登録する。
3. Iterated Instantiation
リンク時に足りないものを検出してインスタンス化。

128 名前:停止しました。。。 mailto:sage [2009/02/17(火) 23:33:50 ]
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ



129 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 09:28:58 ]
アヌスストッパーじゃないのか。

130 名前:デフォルトの名無しさん [2009/02/23(月) 18:07:27 ]
関数オブジェクトの使い方として、以下のような記述は許されますか?

// generate アルゴリズムを使ってコンテナに公差1の等差数列を代入する
template < class T > class Gens {
public:
  Gens() : s_( 0 ) {}
  Gens( T i ) : s_( i ) {}
  T operator () (){ return s_++; }
private:
  T s_;
};

int main() {
  vector< int > vector1( 20 );
  Gens< int > gens( 10 );                // 問題はココと
  generate( vector1.begin(), vector1.end(), gens ); // ココ
}

普通は
generate( vector1.begin(), vector1.end(), Gens< int >() );
のように書きますが、
あらかじめオブジェクトを構築しておいて、
そのオブジェクトを引数として渡すというものです。
上記の例ではあらかじめオブジェクトを構築することで
ジェネレータが作り出す数列の初項を10に設定しています。

131 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 20:10:05 ]
>>130
全く問題ないよ

132 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 21:15:07 ]
>>130
>上記の例ではあらかじめオブジェクトを構築することで
>ジェネレータが作り出す数列の初項を10に設定しています。
なら
generate( vector1.begin(), vector1.end(), Gens< int >( 10 ) );
でもインジャネーノ?


133 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 21:28:02 ]
>>130
そもそも内部状態を持つ関数オブジェクトをアルゴリズムで使うのはよろしくない
www.kijineko.co.jp/tech/superstitions/functor-is-not-copied-in-algorithm.html

134 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 21:49:05 ]
コピー禁止すりゃいいんじゃね?

135 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:29:12 ]
誰にも突っ込んでもらえなかったけど、コピー禁止してどうやって渡すんだ orz

136 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:33:29 ]
>>133
たしかに規格上は保証がないかもしれないが、なんだか屁理屈に聞こえる。

137 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 23:43:39 ]
>>136
同感だな
内部状態を持つ関数オブジェクトって普通にありえるからな
なんか現実を無視して重箱のすみを突いているって感じだな

138 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 23:53:59 ]
いや、これははまるぞ
移植してバグったとき、大変そうだ



139 名前:デフォルトの名無しさん [2009/02/24(火) 00:01:50 ]
ん?
マッサーの STL 本では generate のサンプルで内部状態を保持しているし
メイヤーズの Effective STL でも、関数オブジェクトの利点は
「必要に応じていくつでも状態を格納できること」と書いてるぞ?(たとえば p.161 )

述語は純粋関数でないとだめだけど。
サッターの C++ Coding Standardsでは
「述語は関数オブジェクトの部分集合である」( p.172 )としていて
すなわち述語でない関数オブジェクトは純粋関数でなくても良いということになってるぞ?

どっちなんだ。

140 名前:デフォルトの名無しさん [2009/02/24(火) 00:05:52 ]
ちなみに、generate の第三パラメータは述語ではないので、
(マッサー、メイヤーズ、サッターの本にあるとおり)
純粋関数でなくても良いということになる。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<46KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef