【C++】STL(Standard Template Library)相談室 11
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2009/01/11(日) 11:13:44前スレ
【C++】STL(Standard Template Library)相談室 10
http://pc11.2ch.net/test/read.cgi/tech/1219719677/
過去ログ・リンク・書籍紹介は >>2 以降
0002デフォルトの名無しさん
2009/01/11(日) 11:15:02http://pc11.2ch.net/test/read.cgi/tech/1204045410/
【C++】STL(Standard Template Library)相談室 8
http://pc11.2ch.net/test/read.cgi/tech/1198435319/
【C++】STL(Standard Template Library)相談室 7
http://pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
http://pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0003デフォルトの名無しさん
2009/01/11(日) 11:16:43http://www.cplusplus.com/
・入門,一覧,使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/
0004デフォルトの名無しさん
2009/01/11(日) 11:17:18http://pc11.2ch.net/test/read.cgi/tech/1217008269/
Boost総合スレ part6
http://pc11.2ch.net/test/read.cgi/tech/1207749841/
C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/
0005デフォルトの名無しさん
2009/01/11(日) 13:09:240006デフォルトの名無しさん
2009/01/11(日) 14:26:00環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん
2009/01/11(日) 16:34:28set< set< int > > s;
set< set< int > >::iterator i( s.begin() );
i->insert( 12 );
をコンパイルすると、
error: passing 'const std::set<int, std::less<int>, std::allocator<int> >' as
'this' argument of 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, _Alloc>::const_iterator, bool>
std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>]' discards qualifiers
と言われる。
これは何が間違ってる?
0008デフォルトの名無しさん
2009/01/11(日) 16:42:58set< set<int> >の要素はset<int>だぞ? intじゃないぞ?
0009デフォルトの名無しさん
2009/01/11(日) 16:58:05↓こういうことしようとしてるのと同じ。結果がどうなってほしいのかわからん。
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
set<int>::iterator i(s.begin());
*i = 4;
0010デフォルトの名無しさん
2009/01/11(日) 18:05:33std::set<int> v;
std::set< std::set<int> > s;
v.insert(10);
s.insert(v);
0011デフォルトの名無しさん
2009/01/11(日) 18:06:460012デフォルトの名無しさん
2009/01/11(日) 19:04:480013デフォルトの名無しさん
2009/01/11(日) 19:11:15begin()が有効とは限らないというだけで
0014デフォルトの名無しさん
2009/01/12(月) 03:17:220015デフォルトの名無しさん
2009/01/12(月) 04:55:50>>7
0016デフォルトの名無しさん
2009/01/12(月) 11:14:16それであってる。イテレータ自体は有効だけど、デリファレンス(要素にアクセス)はできない。
0017デフォルトの名無しさん
2009/01/15(木) 00:25:09vectorとかdequeとかならat()でfor文回せばいいじゃん
一個変数増えるし、洗練された手法には見えない
だれか、熱く語ってくれないか
0018デフォルトの名無しさん
2009/01/15(木) 00:47:37・全てのコンテナにoperator []()が実装されているとは限らない。
・全てのコンテナにイテレータが実装されている。
・全てのコンテナに対応したアルゴリズムを組む時に使える。
・別に使いたくなければ使わなくても良いけど。
0019デフォルトの名無しさん
2009/01/15(木) 00:53:04君はそれを調べ上げて、めでたくその実体がvectorに過ぎないことを突き止め
中からatを引っ張り出してforループを書き各データに望みの処理を施した
ここまでは万々歳だ
ところがそのAPIのバージョンが上がって、TheContainerの実体はfantasticsetという
ベンダがオリジナルで作り上げた超高性能で複雑怪奇なコンテナに変わった
君は互換性を保つために、fantasticsetの構造を調べ上げて、
各データに順次アクセスするためのカオスな繰り返し文を書いて、
それが正しく全データを重複なく渡っているかどうかのテストもしなければならなくなった
最初からTheContainer::iteratorを使ってループしてれば、こんな苦労をせずに済んだんだ
どうだ素晴らしいだろう
0020デフォルトの名無しさん
2009/01/15(木) 01:22:20listはどうするんだね?
0021デフォルトの名無しさん
2009/01/15(木) 03:34:54>一個変数増える
ここkwsk
0022デフォルトの名無しさん
2009/01/15(木) 03:40:44俺も気になっている。
atや[]でもiが要るから互角だと思う。
0023デフォルトの名無しさん
2009/01/15(木) 03:54:50内部にさらにリストを使ったりして10000個とかジャンプさせればかなり安定すると
思うけどな。
ちょっと自分で作って比較検証してみるか……
0024デフォルトの名無しさん
2009/01/15(木) 04:23:020025デフォルトの名無しさん
2009/01/15(木) 07:18:45配列でもサイズが必要になるな。
0026デフォルトの名無しさん
2009/01/15(木) 12:10:37それはスキップリストっていうデータ構造
結構古典的なデータ構造だから検証しなくても大体O(log N)になるよ
002717
2009/01/15(木) 20:34:43抽象性が高い、と。速いとか、即役に立つというものでもないのね。
ちなみに、カウンタは変数に入りません、というイメージだった。
イテレータも宣言しだいでカウンタと同じように扱えるね。ちょっとforが長くなるけど。
なんとなく使ってみる気になった。
0028デフォルトの名無しさん
2009/01/16(金) 01:06:19……釣りだよね?
0029デフォルトの名無しさん
2009/01/16(金) 11:19:440030デフォルトの名無しさん
2009/01/18(日) 02:44:58イテレータがなくてもvectorやlistを使う。
0031デフォルトの名無しさん
2009/01/18(日) 02:53:09それ以外はほとんどvectorだけど
0032デフォルトの名無しさん
2009/01/18(日) 02:59:43これでBoost/TR1のarrayももう役目を終えた。
0033デフォルトの名無しさん
2009/01/18(日) 03:01:390034デフォルトの名無しさん
2009/01/18(日) 11:19:06どのように記述したらよろしいでしょうか?
template <typename T>
T get3rd(const T& container){
if( container.size > 3 )
return container.end();
typename T::iterator it = container.begin();
std::advance(it,2);
return it;
}
std::vector<int> ivec(10,255);
std::vector<int>::iterator it = get3rd(ivec);
こうすると
'std::vector<_Ty>' から 'std::_Vector_iterator<_Ty,_Alloc>' に変換できません
とエラーになってしまいます
0035デフォルトの名無しさん
2009/01/18(日) 11:22:460036デフォルトの名無しさん
2009/01/18(日) 11:26:56戻り値を typename T::const_iterator にして
iterator 部分を const_iterator にしたら解決しました。
関数の引数にconst T& としたので、普通のiterator は使えないのも見落としてました。
ありがとうございました。
0037デフォルトの名無しさん
2009/01/18(日) 12:09:50template< template<typename, typename = std::allocator> class T, class V, class A>
typename T<V,A>::const_iterator Get3rdValue(const T<V,A>& cont)
{
typename T<V,A>::const_iterator it = cont.begin();
std::advance(it, 2);
return it;
}
使い方
Get3rdValue<std::vector>(vi);
0038デフォルトの名無しさん
2009/01/23(金) 08:16:30越えた位置を指定して挿入した場合の動作は、未定義でしょうか?
解説サイトを数件見ているのですが、記述が見つからないものでして。
0039デフォルトの名無しさん
2009/01/23(金) 08:32:1223.2.4.3
Notes: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all
the iterators and references before the insertion point remain valid. If an exception is thrown other than
by the copy constructor or assignment operator of T there are no effects.
2 Complexity: If first and last are forward iterators, bidirectional iterators, or random access iterators,
the complexity is linear in the number of elements in the range [first, last) plus the distance to
the end of the vector. If they are input iterators, the complexity is proportional to the number of elements
in the range [first, last) times the distance to the end of the vector.
0040デフォルトの名無しさん
2009/01/23(金) 08:39:320042デフォルトの名無しさん
2009/01/23(金) 09:16:24なるほど要素を指してない無効な反復子を渡すのは、当然駄目ということですね。
ありがとうございます!
0043デフォルトの名無しさん
2009/01/23(金) 11:00:26insert() 以前に、デリファレンスできないイテレータを前に進めた時点で未定義だよ。
0044デフォルトの名無しさん
2009/01/23(金) 11:52:500045デフォルトの名無しさん
2009/01/23(金) 11:55:39end() より先に進めてなければ最後に追加されるだけ。
0046デフォルトの名無しさん
2009/01/23(金) 12:02:27許されていないのかと思った
0047デフォルトの名無しさん
2009/01/23(金) 12:06:21アクセス違反になるが・・
0048デフォルトの名無しさん
2009/01/23(金) 12:12:42gcc-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++;
}
0049デフォルトの名無しさん
2009/01/23(金) 12:18:45endはsize() < max_size()内の有効な反復子でなければならない
0051デフォルトの名無しさん
2009/01/23(金) 12:21:38すまん
0052デフォルトの名無しさん
2009/01/23(金) 12:23:08v.insert(v.end(), 10); // v の末尾に 10 を追加
v.insert(v.end() + 1, 10); // 未定義動作
v.end() + 1; // insert() 無しでこれだけでも未定義動作に突入
0053デフォルトの名無しさん
2009/01/23(金) 12:33:00end()まではOKなのか
0054デフォルトの名無しさん
2009/01/23(金) 17:28:52単純な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();
0055デフォルトの名無しさん
2009/01/23(金) 17:40:050056デフォルトの名無しさん
2009/01/23(金) 18:15:39Boostがすごすぎる
0057デフォルトの名無しさん
2009/01/24(土) 01:38:36char a[10];
char *p1=a+10; // OK
char *p2=a+11; // NG
char *p3=(a+11)-1; // NG (p1==p3は保証されない)
0058デフォルトの名無しさん
2009/01/24(土) 01:40:470059デフォルトの名無しさん
2009/01/24(土) 01:41:120060デフォルトの名無しさん
2009/01/24(土) 02:01:24デリファレンスしてなくてもだめなことあるの?
0061デフォルトの名無しさん
2009/01/24(土) 02:03:46ヌルポインタになるかもしれない
0062デフォルトの名無しさん
2009/01/24(土) 04:03:58p1==p3が保証されないのってマジ?
もしそうならポインタ演算とか怖くて出来なくなるな
0063デフォルトの名無しさん
2009/01/24(土) 06:06:06配列(非配列は要素数1の配列とみなして)の要素か終端までを指すように演算することは
できるけど、その範囲外を指すようにした場合は未定義動作になる。
char a[10];
a - 1; // 未定義動作
a + 10; // 終端なのでまだ大丈夫
a + 11; // 未定義動作
0064デフォルトの名無しさん
2009/01/24(土) 06:10:58v.erase( v.end(), v.end() );
同じようで違うとゆー
0065デフォルトの名無しさん
2009/01/24(土) 07:35:54ほんとだ。
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.
0066デフォルトの名無しさん
2009/01/24(土) 10:32:33この中にウソを言っているものがいる。
このうそつきめ!
006767
2009/01/24(土) 10:37:11* + うそです
n ∧_∧ n
+ (ヨ(* ´∀`)E)
Y Y *
0068デフォルトの名無しさん
2009/01/24(土) 11:05:25(a+11)-1 != a+10 が成立する訳ないだろ、そんなんじゃとてもコンパイラ作れねーよ。
もちろん *(a+10)とか*(a-1)とかを使ったら無効なアドレスの参照だから何が起こるかわかんないけど、
ポインタ演算の時点では問題ないっての。
0069デフォルトの名無しさん
2009/01/24(土) 11:25:08その場合-1しても戻るとは限らないってことだろ
>>65によると
0070デフォルトの名無しさん
2009/01/24(土) 11:53:33もっとも、ポインタ値みたいなものへの計算値に基づいて
更に計算、みたいな恐いことはまずやらんけど。
0071デフォルトの名無しさん
2009/01/24(土) 12:07:29実装依存なことと規格で保証されていることの区別のつかないバカ
0072デフォルトの名無しさん
2009/01/24(土) 12:29:02バカと言えば勝った気になってるバカ
0073デフォルトの名無しさん
2009/01/24(土) 12:32:530074デフォルトの名無しさん
2009/01/24(土) 12:40:36オーバーフロー時に例外が発生するCPUでは
(a+11) を実行した時点で例外が発生して比較自体が行われない可能性がある。
0075デフォルトの名無しさん
2009/01/24(土) 15:26:420076デフォルトの名無しさん
2009/01/24(土) 16:38:12(a + 11) - 1をa + 10と同じ結果にしても構わないんだよ。
0077デフォルトの名無しさん
2009/01/24(土) 23:50:11p+=1;
assert(p!=0);
ヌルポインタをインクリメントした結果が、非ヌルになることも保証されないんだよね
やっぱり
0078デフォルトの名無しさん
2009/01/24(土) 23:55:000079デフォルトの名無しさん
2009/01/24(土) 23:57:030080デフォルトの名無しさん
2009/01/24(土) 23:59:190081デフォルトの名無しさん
2009/01/25(日) 00:12:29int *getptr(int x) {
static array[0x2000];
return array+(x*10);
}
offsetの計算を16ビットレジスタでやった方が高速化される環境だと
最適化によって x*10の結果の上位を捨てて下位16ビットしか使わないコードが生成されても文句が言えない
0082デフォルトの名無しさん
2009/01/29(木) 13:47:49typeinfo.hのbad_castとbad_typeidがC2039・C2873エラーになります。
解決の方法がありましたら教えてください
個人の趣味で作ってるプログラムだし、例外捨ててコメントアウトかな…
0083デフォルトの名無しさん
2009/01/29(木) 14:02:31んー?
http://ml.tietew.jp/cppll/cppll/thread_articles/5592
008482
2009/01/29(木) 15:10:00boost使ってないので少しわからないとこもありますが
5.0〜ならいける的な事が書いてあったりしますが、その後のバージョンなんですよね…
自分はtypeinfo.h内の::bad_cast記述部分二対して 存在しないのでエラーになっているのですが
上記ページだとtypeinfo.hをインクルードしているとかで混乱します
0085デフォルトの名無しさん
2009/01/29(木) 20:13:48IOSTREAM(S)をどっちで使うか設定するとこあるから
それに似たbad_cast(exception)とかあるかも
0086デフォルトの名無しさん
2009/01/30(金) 20:36:39pass:pgtwit
0087デフォルトの名無しさん
2009/01/30(金) 21:17:240088デフォルトの名無しさん
2009/02/01(日) 11:42:50streambuf_iteratorってどのヘッダインクルードすればいいの?
008988
2009/02/01(日) 12:09:33istreambuf_iteratorにしてなかったから駄目だったんだ
0090デフォルトの名無しさん
2009/02/02(月) 14:05:11#include <iterator>
0091デフォルトの名無しさん
2009/02/04(水) 16:24:38xtreeでアクセス違反が出るんですが・・・
0092デフォルトの名無しさん
2009/02/04(水) 16:54:44それは何か使い方が間違っている。そしてそれは恐らくは、STLに直接関係ない。
0093デフォルトの名無しさん
2009/02/04(水) 18:31:55//------------------------------------
#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>>
]
回避する方法はないでしょうか?
0094デフォルトの名無しさん
2009/02/04(水) 18:36:510095デフォルトの名無しさん
2009/02/04(水) 18:40:22vector<bool>は使うなカス
詳しくはEffectiveSTL
0096デフォルトの名無しさん
2009/02/04(水) 18:44:02内部がビット操作だったはず
0097デフォルトの名無しさん
2009/02/04(水) 19:57:39ありがとうございます。
>>94
実際に必要性が出ているのは、もう少しややこしいコードで、
任意の型の参照を引数に取る関数に
その任意の型のvectorの要素をそのまま渡したかったのです。
とりあえずはboolだけ特殊化して回避することにします。
ただ、任意の型に対応するならvectorじゃなくて配列にした方がいいのかもしれないですね。
ともかくありがとうございました。
0098デフォルトの名無しさん
2009/02/04(水) 20:21:16vector<T>::reference使えばいけるはず。
0099デフォルトの名無しさん
2009/02/04(水) 21:23:37おぉ、STLっぽくなりました。
ありがとうございます。
0100デフォルトの名無しさん
2009/02/04(水) 21:42:370101デフォルトの名無しさん
2009/02/05(木) 02:15:210102デフォルトの名無しさん
2009/02/05(木) 02:41:590103デフォルトの名無しさん
2009/02/07(土) 10:45:12使い道が思いつかないな
0104デフォルトの名無しさん
2009/02/07(土) 11:07:370105デフォルトの名無しさん
2009/02/11(水) 15:26:30例えばaに1,2,3が、bに4,5,6が入っている時、cを1,2,3,4,5,6にしたいです。
0106デフォルトの名無しさん
2009/02/11(水) 15:33:220107デフォルトの名無しさん
2009/02/11(水) 15:36:52ありがとうございます。
0108デフォルトの名無しさん
2009/02/11(水) 15:38:18>>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);
0109デフォルトの名無しさん
2009/02/11(水) 15:48:05なるほど、どうもです。
0110デフォルトの名無しさん
2009/02/11(水) 16:03:250111デフォルトの名無しさん
2009/02/11(水) 16:04:12memcpy使うのは最悪だろ
0112デフォルトの名無しさん
2009/02/11(水) 16:09:40vector と PODの組み合わせなんだから別にいいだろ
0113デフォルトの名無しさん
2009/02/11(水) 16:20:270114デフォルトの名無しさん
2009/02/11(水) 16:26:51コピーするにしても std::copy を使うべき
よっぽど速度が遅くて困らない限りは >>106 で十分
0115デフォルトの名無しさん
2009/02/11(水) 16:33:50さっそくバグってるなw
intが1byteの環境はあんまりないよね。
0116デフォルトの名無しさん
2009/02/11(水) 16:36:48template<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);
0117デフォルトの名無しさん
2009/02/11(水) 16:37:59vectorのイテレータがポインタではないライブラリではコンパイルエラーだぞ
c.begin() は &c[0] に置き換えないとダメ
0118デフォルトの名無しさん
2009/02/11(水) 16:38:09こんなん論外だ
0119デフォルトの名無しさん
2009/02/11(水) 16:43:56#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で(問題部分だけは)さらに短くかけるらしいです
0120デフォルトの名無しさん
2009/02/11(水) 16:59:27>v.begin() を使うことができると言われるかもしれない。
(中略)
>率直に言えば、 &v[ 0 ] の代わりに v.begin() を使うよう勧めるような人たちと付き合っているなら、
>交友関係を考え直す必要がある。
スコット・メイヤーズ著 ピアソンエデュケーション刊
Effective STL〜STLを効果的に使いこなす50の鉄則 p.73
0121デフォルトの名無しさん
2009/02/11(水) 19:03:40再確保によるロスを防ぎたかったら c.reserve(a.size() + b.size()) で準備してから
実行すればいい。 >108 の resize() では無駄な初期化( int の場合は 0 フィル)が入る。
要素型に依存する必要はまったく無い。
0122デフォルトの名無しさん
2009/02/11(水) 19:08:49範囲の話。
0123デフォルトの名無しさん
2009/02/11(水) 19:55:23http://pc11.2ch.net/test/read.cgi/tech/1231080841/36
identitiesになにするもの?
http://p-stade.sourceforge.net/oven/doc/html/oven/range_adaptors.html#oven.range_adaptors.identities
や
http://www.codeproject.com/KB/stl/oven.aspx
の9.22を見る限りでは、そのままのRangeが返ってくるみたいだけど・・・
0124統合しました。。。:
2009/02/14(土) 18:06:57http://pc11.2ch.net/test/read.cgi/tech/1234420483/
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ
0125デフォルトの名無しさん
2009/02/16(月) 17:21:23STLはヘッダにその実装が書いてあるわけですが、
ということは「翻訳単位毎にコードが生成される」のでしょうか?
a,cpp
b.cpp
両方<vector>をincludeし、両方で vector<int> が使われていた場合、vector<int>のコードは2つ作られてしまうのでしょうか?
EXEファイルの容量がガンガン増えるような気がするのですが・・・
0126統合しました。。。
2009/02/16(月) 18:18:04http://pc11.2ch.net/test/read.cgi/tech/1234420483/
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ
0127デフォルトの名無しさん
2009/02/16(月) 21:54:46実装によるが、最終コードでは一つになっているのが普通。
C++ Templates The Complete Guide には 3 つのモデルが載ってる。概要は以下の通り。
1. Greedy Instantiation
翻訳単位ごとにインスタンス化するが、リンカで一つだけ残す。
2. Queried Instantiation
共有のデータベースを持ってそこに登録する。
3. Iterated Instantiation
リンク時に足りないものを検出してインスタンス化。
0128停止しました。。。
2009/02/17(火) 23:33:500129デフォルトの名無しさん
2009/02/18(水) 09:28:580130デフォルトの名無しさん
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に設定しています。
0131デフォルトの名無しさん
2009/02/23(月) 20:10:05全く問題ないよ
0132デフォルトの名無しさん
2009/02/23(月) 21:15:07>上記の例ではあらかじめオブジェクトを構築することで
>ジェネレータが作り出す数列の初項を10に設定しています。
なら
generate( vector1.begin(), vector1.end(), Gens< int >( 10 ) );
でもインジャネーノ?
0133デフォルトの名無しさん
2009/02/23(月) 21:28:02そもそも内部状態を持つ関数オブジェクトをアルゴリズムで使うのはよろしくない
http://www.kijineko.co.jp/tech/superstitions/functor-is-not-copied-in-algorithm.html
0134デフォルトの名無しさん
2009/02/23(月) 21:49:050135デフォルトの名無しさん
2009/02/23(月) 22:29:120136デフォルトの名無しさん
2009/02/23(月) 22:33:29たしかに規格上は保証がないかもしれないが、なんだか屁理屈に聞こえる。
0137デフォルトの名無しさん
2009/02/23(月) 23:43:39同感だな
内部状態を持つ関数オブジェクトって普通にありえるからな
なんか現実を無視して重箱のすみを突いているって感じだな
0138デフォルトの名無しさん
2009/02/23(月) 23:53:59移植してバグったとき、大変そうだ
0139デフォルトの名無しさん
2009/02/24(火) 00:01:50マッサーの STL 本では generate のサンプルで内部状態を保持しているし
メイヤーズの Effective STL でも、関数オブジェクトの利点は
「必要に応じていくつでも状態を格納できること」と書いてるぞ?(たとえば p.161 )
述語は純粋関数でないとだめだけど。
サッターの C++ Coding Standardsでは
「述語は関数オブジェクトの部分集合である」( p.172 )としていて
すなわち述語でない関数オブジェクトは純粋関数でなくても良いということになってるぞ?
どっちなんだ。
0140デフォルトの名無しさん
2009/02/24(火) 00:05:52(マッサー、メイヤーズ、サッターの本にあるとおり)
純粋関数でなくても良いということになる。
0141デフォルトの名無しさん
2009/02/24(火) 00:12:15「値を格納したり、追加機能を実装できる」( p.230 )と書いてるな。
0142デフォルトの名無しさん
2009/02/24(火) 00:12:480143デフォルトの名無しさん
2009/02/24(火) 00:44:58普通はコピーなんてしないし、規格作った方もそんなつもりじゃなかったけど
ちゃんと書いてないせいで信用できないし、コピーしちゃう実装を誰かが作っても責められない
そんな誰も得しない状態
0xで直るんかね
0144デフォルトの名無しさん
2009/02/24(火) 00:52:16まぁ、いまどきのコンパイラならもう必ず連続すると考えていいんじゃないの。
0145デフォルトの名無しさん
2009/02/24(火) 11:38:30v.reserve(10);
... // v に値を格納
std::copy(v.begin(),v.end(),std::ostream_itreator<int>(std::cout,","));
このコードの copy 内の ostream_iterator... の部分て何を行っているのですか?
コンテナの要素をループで書き出してるのは分かるのですが、内部でどのような処理をしているのでしょう?
0146デフォルトの名無しさん
2009/02/24(火) 12:43:55俺もはまった
boost::refして誤魔化した
0147デフォルトの名無しさん
2009/02/24(火) 12:53:460148デフォルトの名無しさん
2009/02/24(火) 16:00:320149デフォルトの名無しさん
2009/02/24(火) 16:14:34俺なら output_iterator を受け取る関数を作って back_inserter を渡す。
std::vector なら reserve してからね。
>>133
良くないのはそうだけど、総和とかには使うし、命名とかコーディングスタイルの話になるんじゃないか?
0150デフォルトの名無しさん
2009/02/24(火) 18:48:24それどこのSTLライブラリ?
で、どんなコードではまった?
0151デフォルトの名無しさん
2009/02/24(火) 20:48:17ライブラリの内部実装の話を命名やコーディングスタイルでどうするの?
0152デフォルトの名無しさん
2009/02/24(火) 23:49:33ttp://msdn.microsoft.com/ja-jp/library/0c6y7x31(VS.80).aspx
0153デフォルトの名無しさん
2009/02/25(水) 00:08:40総和系なら accumulate があるべ。
0154デフォルトの名無しさん
2009/02/25(水) 08:55:19なーんてね
0155デフォルトの名無しさん
2009/02/25(水) 09:03:23内部状態を持つ関数オブジェクトを使う話で、内部実装の話はしてないよ。
使わないほうがいいけど、使うなら注意を喚起するとか、専用の関数を作って封じ込めるとか、という話。
>>153
全くその通りでした。
0156デフォルトの名無しさん
2009/02/25(水) 19:52:40具体的には、mapを使って2枚の画像の対応点を記録しようとしています。
typedef struct point
{
int x;
int y;
}point;
map<point, point> correspond;
point p1, p2;
/*p1とp2の座標を入力*/
correspond.insert( pair<point, point>(p1, p2) );
としてコンパイルするとerror C2784が出ます。
環境はVS2008、XP SP3を使っています。
どうしたら解決できるでしょうか?
0157デフォルトの名無しさん
2009/02/25(水) 20:04:06方針としては、グローバルにpointの大小を判別するbool operator<(const point&, const point&)を定義するか、
correspondの宣言の歳にmap<point, point, compare_t> correspond(compare);とする
(ただしcompare_tは戻り値boolで引数に(const point&, const point&)を取ることができる関数オブジェクトまたは関数の型で
compareはそのインスタンス)
0158デフォルトの名無しさん
2009/02/25(水) 20:25:45素早い回答ありがとうございます。
pointのxとyどちらでソートすべきか比較関数を用意してやればよいということでしょうか?
0159デフォルトの名無しさん
2009/02/25(水) 20:32:21bool f(const point& lhs, const point& rhs){
return lhs.x < rhs.x && lhs.y < rhs.y;
}
のようなものを定義して
map<point, point, bool(*)(const point&, const point&)> correspond(f);
かな?
operator<を使う方法についてはeffective C++とか参考にすれば、
綺麗に実装する方法が載ってると思う
0160デフォルトの名無しさん
2009/02/25(水) 20:39:54具体例までありがとうございます。
map 比較関数 でググったらいくつか例も出てきたので出来そうです。
よく考えるとmapは2分木を利用してるんだから自前の比較関数を用意してやる必要があるのは当たり前ですね。
勉強になりました。
0161デフォルトの名無しさん
2009/02/27(金) 20:33:14http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8944.txt
今は上のようにやってます。
list vector mapやDataのようなクラスが増えていくにつれコードが増え、似たような処理が何回も出てきそうです
0162デフォルトの名無しさん
2009/02/27(金) 20:37:200163デフォルトの名無しさん
2009/02/27(金) 20:41:47template<typename T>
std::ostream &print(std::ostream &ost, const T &cont)
{
ost << "[";
std::copy(cont.begin(), cont.end(), std::ostreambuf_iterator<T::value_type>(ost, ","));
ost << "]";
return ost;
}
0164デフォルトの名無しさん
2009/02/27(金) 20:50:54template<typename Iterator>
std::string to_str2(Iterator first, Iterator last) {
std::ostringstream oss;
Iterator it = first;
oss << "[";
if (it != last) {
while (true) {
oss << (*it);
++it;
if (it == last)
break;
oss << ", ";
}
}
oss << "]";
return oss.str();
}
0165デフォルトの名無しさん
2009/02/27(金) 20:51:310166161
2009/02/27(金) 23:02:22ほんとですね、全部なおしました
std::ostream& operator<<(std::ostream & rhs, const <T>& lhs)はダメなんですね
当たり前なんでしょうけど
>>163
こういう書き方もできるのですね、、、
p to_str(dlist)かp 'to_str(std::list<Data, std::allocator<Data> > const&)' (dlist)でgdbから呼べるのですが、
ostreamかtemplate使うと消える?みたいなのでObject.to_string()とテンプレートではないto_str(x)は用意するので
ostreamやostringstreamを極力使わずにできればなと
>>164,165
Iteratorの中身がコンテナじゃなさそうな場所に使ってみます
0167デフォルトの名無しさん
2009/02/28(土) 00:04:03lhs << rhs って形にしようぜw
0168デフォルトの名無しさん
2009/03/02(月) 12:55:030169デフォルトの名無しさん
2009/03/03(火) 21:45:22それ、コードではどうやるの
0170デフォルトの名無しさん
2009/03/04(水) 01:25:00template <class T>
struct Out {
void operator()(T& i) const {
std::cout << i << ' ';
}
};
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::list<int> aa(a, a + sizeof(a) / sizeof(a[0]));
std::for_each(aa.begin(), aa.end(), Out<int>());
}
0171デフォルトの名無しさん
2009/03/04(水) 12:40:270172デフォルトの名無しさん
2009/03/04(水) 16:04:020173デフォルトの名無しさん
2009/03/04(水) 16:19:220174デフォルトの名無しさん
2009/03/05(木) 09:49:02#include <pstade/oven/make_range.hpp>
int main()
{
namespace oven = pstade::oven;
std::list<int> l = a|oven::copied;
std::cout << (oven::make_range(l)) << "\n";
}
0175デフォルトの名無しさん
2009/03/10(火) 23:08:36http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#92
今のドラフトでは以下の記述が追加されている。
> algorithms that take function objects as arguments are permitted to copy those function objects freely
アルゴリズム内でどうコピーされるかは基本的に実装任せってことになるらしい。
for_each() の戻り値はまったく使えないことになりそうだ。
0176デフォルトの名無しさん
2009/03/14(土) 16:56:46for_eachの戻りはコピーされた関数オブジェクトに内部状態が反映されてるんじゃなかった?
0177デフォルトの名無しさん
2009/03/14(土) 18:17:17関数オブジェクトに全要素を通して処理した結果の状態が保持されていることを期待するだろうが、
極端に言えば各要素の呼び出し毎に新しくコピーした関数オブジェクトを渡されたりすると、期待する
結果と異なる。
参照使うなりコピーされても大丈夫なようにはできるからまったく使えないは言い過ぎ。
とはいえ、そういう用途なら accumulate 使えばいいじゃん、とは思う。
0178デフォルトの名無しさん
2009/03/14(土) 18:22:460179デフォルトの名無しさん
2009/03/18(水) 22:23:420180デフォルトの名無しさん
2009/03/28(土) 19:02:38//(snip)
std::istream is(pointer_streambuf(buf, buf_size));
みたいな感じで、ポインタをバインドできるstreambufってある?
ないならつくるんだけど。
0181180
2009/03/28(土) 19:11:47あと、>>180の訂正:
x char *buf = new char[n];
o char *buf = new char[buf_size];
0182デフォルトの名無しさん
2009/03/28(土) 19:27:36廃止予定だけどw
0183デフォルトの名無しさん
2009/03/28(土) 20:12:25おk。でも廃止か。
strstreambufも廃止なんかな。
先にstringstream使ってて、basic_stringにしか対応してないから、
strstreamは無視してたわ。
0184デフォルトの名無しさん
2009/03/31(火) 19:15:50ちょうどstringのc_strのようなものはありますでしょうか。
allocatorのpointerやaddressがそうなのかと思ったのですが、
vector<int> v;
v.push_back(1);
v.push_back(2);
const int* p = v.get_allocator().const_pointer();
for(int i=0; i<v.size(); i++)
cout << p[i];
のように書いても大丈夫でしょうか。
0185デフォルトの名無しさん
2009/03/31(火) 19:24:59アロケータのconst_pointerはT const*のtypedefだし、addressは&演算子と同じこと。
事実上、死に設定。
0186デフォルトの名無しさん
2009/03/31(火) 19:36:310187デフォルトの名無しさん
2009/03/31(火) 20:48:40ありがとうございました。
>>186
C定義の関数に渡す必要があるためです。
0188デフォルトの名無しさん
2009/03/31(火) 20:49:580189デフォルトの名無しさん
2009/03/31(火) 20:53:17int buf[256];
if(v.size()<256) memcpy(buf, &v[0], v.size());
0190デフォルトの名無しさん
2009/04/01(水) 14:51:170191デフォルトの名無しさん
2009/04/02(木) 06:40:050192デフォルトの名無しさん
2009/04/02(木) 10:09:490193インドリ
2009/04/09(木) 10:03:38http://d.hatena.ne.jp/faith_and_brave/20090408
0194デフォルトの名無しさん
2009/04/09(木) 11:21:230195デフォルトの名無しさん
2009/04/09(木) 22:35:560196デフォルトの名無しさん
2009/04/09(木) 23:09:070197デフォルトの名無しさん
2009/04/10(金) 18:33:470198デフォルトの名無しさん
2009/04/22(水) 21:47:20どこかにいい解説はないでしょうか?
それとも皆 boost::iterator_facade を使ってるのかな?
0199デフォルトの名無しさん
2009/04/22(水) 23:50:36boost::iterator_facade で何か不満でも?
0200デフォルトの名無しさん
2009/04/22(水) 23:58:190201デフォルトの名無しさん
2009/04/23(木) 00:07:33"awk"が見つかりません のエラーが出るの?
STLport5.1.5までは何の問題もなくビルド出来ていたんだが
0202デフォルトの名無しさん
2009/04/23(木) 00:13:15じゃ、 boost::iterator_facade の実装を見るとか。
とりあえず作ってみたものと、その問題点をここで晒してみるといいかもしれない。
0203デフォルトの名無しさん
2009/04/23(木) 01:37:55std::iteratorのマニュアルを読んで、
std::istream_iteratorみたいな単純なやつを読む。
0204デフォルトの名無しさん
2009/04/23(木) 06:13:13そういうことではないんだろうが
0205デフォルトの名無しさん
2009/04/24(金) 16:56:09ttp://www.wakhok.ac.jp/~sumi/stl/manual/bsearch.html#lower_bound()
> valueと一致する値を持つ最後の次の要素。見つからない場合はlast。
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/algorithm.html#lower_bound
> ソートされたシーケンス[first,last)に対し、valueより大きいか等しい最初の要素の位置を返します。
書いてあることが違うのはどういう事なんでしょう?
手元の環境(VC2008EE)では後者のようですが・・・。
0206デフォルトの名無しさん
2009/04/24(金) 17:18:07その前者は、
>ある値と一致する範囲の一番最初を返す
と書いてある見出しとも矛盾している。
0207デフォルトの名無しさん
2009/04/24(金) 18:04:49もともと lower_bound と upper_bound は
value を挿入可能な半開区間 [ lower_bound, upper_bound ) を探すためのアルゴリズムだから。
これは equaLrange の結果に等しい。
って、マッサー本に書いてあった。確か。
0208デフォルトの名無しさん
2009/04/24(金) 18:22:490209デフォルトの名無しさん
2009/04/24(金) 18:27:28本当ですね。
>>207
なるほど。
>>208
逆としてみても、「見つからない場合はlast。」というのはおかしいですね。
あと、引数や戻り値のイテレータがランダムアクセスイテレータなのが気になります。
どうもありがとうございました。
0210デフォルトの名無しさん
2009/04/28(火) 05:52:59{
private:
int m_nTime;
public:
A( int nTime ) : m_nTime( nTime ) {}
int GetTime() { return m_nTime; }
}
typedef map< int, A * > AMap;
typedef AMap::value_type AMapValue;
typedef list< AMap * > AMapList;
例えば上記の様な定義をしていて、
メイン関数内で、AMapList内をイテレータを利用して、特定のAMapの「Key」部を検索し、
見つかったら、AMapの「Value」部を出力(クラスAのGetTime()を呼び出す)するような処理
をさせたいのですが、どうすれば実現できるでしょうか?
また、listコンテナの中にmapコンテナを突っ込むような利用は、一般的にあまりされないの
でしょうか?
0211デフォルトの名無しさん
2009/04/28(火) 09:08:28それ、mapじゃなくてpairじゃいかんの?
0212デフォルトの名無しさん
2009/04/28(火) 10:43:41とりあえず自分で書いたやつを見せてみろよ。何がわからんのかわからん。
0213デフォルトの名無しさん
2009/04/28(火) 15:15:051. AMapListから特定のAMapのイテレータを取得する。これをiとする
2. (*i->find(キー))->GetTime()
mapをlistに入れた構造が必要な場合はmapをlistに入れるよ
…としか答えられないな
0214デフォルトの名無しさん
2009/04/28(火) 15:28:560215デフォルトの名無しさん
2009/04/29(水) 15:45:05そうだわ
スマネ
0216デフォルトの名無しさん
2009/04/29(水) 20:13:42VC9のSTLはDefault Constructiveを要求してきやがるんだが……。
#include <vector>
class hoge {
hoge(int) {}
hoge(const hoge&) {}
hoge& operator=(const hoge&) { return *this; }
};
int main() {
std::vector<hoge> vec;
vec.resize(10);
}
0217デフォルトの名無しさん
2009/04/29(水) 20:30:07それ、 resize() のあとの要素が何で初期化されてることを期待してるの?
0218デフォルトの名無しさん
2009/04/29(水) 20:46:00resizeの第二引数にhogeの適当なインスタンス渡してもだめなんだよ。
0219デフォルトの名無しさん
2009/04/29(水) 20:48:130220デフォルトの名無しさん
2009/04/29(水) 21:14:50bcc 6.1.0でも次のようなエラーが出るよ
エラー E2285 vector 608: 'hoge::hoge()' に一致するものが見つからない(関数 vector<hoge,allocator<hoge> >::resize(unsigned int) )
エラー E2247 vector 1179: 'hoge::hoge(const hoge &)' はアクセスできない(関数 vector<hoge,allocator<hoge> >::_Insert_n(_Vector_iterator<hoge,allocator<hoge> >,unsigned int,const hoge &) )
エラー E2247 vector 1203: 'hoge::hoge(const hoge &)' はアクセスできない(関数 vector<hoge,allocator<hoge> >::_Insert_n(_Vector_iterator<hoge,allocator<hoge> >,unsigned int,const hoge &) )
エラー E2247 xutility 1681: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::void fill<hoge *,hoge>(hoge *,hoge *,const hoge &) )
エラー E2247 xutility 1551: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::hoge * _Copy_backward_opt<hoge *,hoge *>(hoge *,hoge *,hoge *,_Nonscalar_ptr_iterator_tag) )
エラー E2247 xutility 1515: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::hoge * _Copy_opt<hoge *,hoge *>(hoge *,hoge *,hoge *,_Nonscalar_ptr_iterator_tag) )
エラー E2247 28: 'hoge::hoge(const hoge &)' はアクセスできない(関数 std::void _Construct<hoge,hoge>(hoge *,const hoge &) )
*** コンパイル中に 7 個のエラーが発生しました ***
0221デフォルトの名無しさん
2009/04/29(水) 21:18:44ちなみにMinGW5.1.2(gcc3.4.5) + STLport5.1.7で同じソースをコンパイル
すると
vector1.cpp:11: error: no matching function for call to `hoge::hoge()'
vector1.cpp:5: note: candidates are: hoge::hoge(const hoge&)
vector1.cpp:4: note: hoge::hoge(int)
_algobase.h: In function `_OutputIter stlp_priv::__copy(_RandomAccessIter, _RandomAccessIter, _OutputIter, const stlp_std::random_access_iterator_tag&, _Distance*) [with _RandomAccessIter = hoge*, _OutputIter = hoge*, _Distance = ptrdiff_t]':
_algobase.h:250: instantiated from `_OutputIter stlp_priv::__copy_ptrs(_InputIter, _InputIter, _OutputIter, const stlp_std::__false_type&) [with _InputIter = hoge*, _OutputIter = hoge*]'
(...以降あまりにエラーが多いので省略)
で、やはりDefault Constructiveを要求してくるので、
Dinkumwareだけの問題ではない事がわかる。
0222デフォルトの名無しさん
2009/04/29(水) 21:24:02public:
hoge() {}
を入れると両者とも一発で通る。
0223デフォルトの名無しさん
2009/04/29(水) 21:28:54void resize(size_type sz, T c = T());
だからデフォルトコンストラクタがないと通らないこと自体は当然
0224デフォルトの名無しさん
2009/04/29(水) 21:50:24void resize(size_type, T)
void resize(size_type)
のように二つの関数に分けてるがな
0225デフォルトの名無しさん
2009/04/29(水) 21:55:27struct hoge {
hoge(int) {}
hoge(const hoge&) {}
hoge& operator=(const hoge&) { return *this; }
};
int main() {
std::vector<hoge> vec;
vec.resize(10, hoge(5));
return 0;
}
これで
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
gcc version 4.3.2 20080827 (beta) 2 (GCC) ※ on cygwin
VC7.1 cl (Version 13.10.6030 for 80x86)
VC8 cl (Version 14.00.50727.762 for 80x86)
VC9 cl (Version 15.00.21022.08 for 80x86)
bcc 6.10
Comeau 4.3.9b + VC7.1
Comeau 4.3.9b + VC8
Comeau 4.3.9b + VC9
Comeau 4.3.9b + bcc 6.10
全部通るよ?
0226デフォルトの名無しさん
2009/04/29(水) 21:57:11>>218
0227デフォルトの名無しさん
2009/04/29(水) 21:57:50むしろそれだけの環境を使いこなすお前は何者
0228デフォルトの名無しさん
2009/04/29(水) 22:04:53typename _Alloc::value_type _Val;
でもろにDefault Constructor要求された。
0229デフォルトの名無しさん
2009/04/29(水) 22:09:42privateじゃん
0230デフォルトの名無しさん
2009/04/29(水) 22:13:130231デフォルトの名無しさん
2009/04/29(水) 22:22:480232デフォルトの名無しさん
2009/04/29(水) 23:17:140233デフォルトの名無しさん
2009/04/30(木) 01:05:59記念パピコ(゚∀゚)
0234デフォルトの名無しさん
2009/04/30(木) 20:36:310235デフォルトの名無しさん
2009/04/30(木) 21:58:180236デフォルトの名無しさん
2009/05/01(金) 00:03:100237デフォルトの名無しさん
2009/05/01(金) 00:51:040238デフォルトの名無しさん
2009/05/01(金) 07:30:41スレ違い
0239デフォルトの名無しさん
2009/05/01(金) 10:48:210240デフォルトの名無しさん
2009/05/04(月) 16:40:11/...::::::::::::::.. ヽ
/ ..:::::::::::::::::::/\ ヽ
/..:::/::::/::::// ヽ l:. l.
l:::::!::::/●) (●)|:: |
. !:::l::::l/// ,, ///l:i:l いやぁぁぁん
ヽ:i::!、 r ― ァ ノノ'
` l\`ー './
ノヽ \_フ.ヽ
|_ 丶 ヽ
. | |' 初心者)
0241デフォルトの名無しさん
2009/06/07(日) 14:44:09http://124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU
0242デフォルトの名無しさん
2009/06/07(日) 15:06:24なぜここに?
0xスレに貼るのならともかく。
0243デフォルトの名無しさん
2009/06/07(日) 17:35:410244デフォルトの名無しさん
2009/06/18(木) 11:57:11vector<int> v;
v.resize(100);
とやった際に、確保されたv[0]〜v[99]は、0クリアされていることは保障されているのでしょうか?
自分で試しにやってみる限り0クリアされているのですが、なぜわざわざクリアされているのか疑問です。
(mallocとかで確保したメモリは、クリアされていないですよね。なのになぜvectorだとわざわざそんなことを?)
自分で試した環境は、VS2008C++Express です
0245デフォルトの名無しさん
2009/06/18(木) 12:03:35新たに確保された要素はデフォルトコンストラクタで初期化される
0246デフォルトの名無しさん
2009/06/18(木) 12:04:28なんで値で埋めるのかは…仕様決めた人に聞いてくれ。
領域確保だけならreserveがあるし。
0247デフォルトの名無しさん
2009/06/18(木) 13:00:56どうもありがとうございます
02482chとはいえマ的に
2009/06/18(木) 14:00:31○保証 約束されていること。プログラム的にいうとassert()を抜けるのが間違いない状態
0249デフォルトの名無しさん
2009/06/28(日) 22:37:51std::exceptionに標準であったりしない?
ヌルポ
0250デフォルトの名無しさん
2009/06/28(日) 22:47:35標準にはない。どういう場面で投げたい?
場合によっては標準の例外の方が意味が明確になるかもしれない。
0251デフォルトの名無しさん
2009/06/28(日) 22:54:58えっとね
データコンテナっぽいクラスを作ってて
->演算子とかで中のデータにアクセスさせてるんだけど
中のデータがnullの時は->演算子の処理中に例外で中断させたい
0252デフォルトの名無しさん
2009/06/28(日) 23:01:06なるほど。標準にマッチするのはなさそうかな。
0253デフォルトの名無しさん
2009/06/28(日) 23:04:08そっかthx
0254デフォルトの名無しさん
2009/06/28(日) 23:38:180255デフォルトの名無しさん
2009/06/28(日) 23:44:060256デフォルトの名無しさん
2009/06/29(月) 22:31:41コピーコンストラクタでコピーして、コピー元は delete するのって何故だっけ?
0257デフォルトの名無しさん
2009/06/29(月) 22:34:09swap技法か例外安全について聞きたいらしい
0258デフォルトの名無しさん
2009/06/30(火) 00:43:340259デフォルトの名無しさん
2009/06/30(火) 01:56:09メモリイメージをコピーで問題が発生しない保証は無いじゃないか
0260デフォルトの名無しさん
2009/06/30(火) 02:02:47仮にオブジェクトが自分のアドレスを使って何かしてるとしたら
0261デフォルトの名無しさん
2009/06/30(火) 07:47:16intなんかはメモリ領域のコピーでいいけど、
smart_ptrなどではオブジェクトのコピー処理を実行する必要があるから
0262261
2009/06/30(火) 07:50:46忘れてくれ
0263デフォルトの名無しさん
2009/07/02(木) 18:34:470264デフォルトの名無しさん
2009/07/10(金) 12:16:30smart_ptrはコピー時に参照回数を変更するひつようがあるんでメモリイメージコピーはできないからそうでもあるよ。
0265デフォルトの名無しさん
2009/07/10(金) 12:20:47そういう問題ではない
0266デフォルトの名無しさん
2009/07/17(金) 17:15:45std::vectorで100個(数は可変)のデータがあって
これの最初20個ぐらい(数は可変)のデータを削除して
前に詰めたいのですが、どうすればいいのでしょうか?
erase (remove( ではダメでした。
0267デフォルトの名無しさん
2009/07/17(金) 17:29:470268デフォルトの名無しさん
2009/07/17(金) 19:53:15ありがとうございました!
0269デフォルトの名無しさん
2009/07/24(金) 18:27:56unary_functionを継承した関数オブジェクトだけでなく
普通の関数も渡せるようにするにはどうすれば良いのでしょうか?
template<class InputIterator, class OutputIterator, class UnaryFunction>
InputIterator unique_transform(InputIterator first, InputIterator last,
OutputIterator result, UnaryFunction unary_func){
set<iterator_traits<InputIterator>::value_type> s;
while(first!=last){
if(count(s.begin(),s.end(),*first)>=1){++first;}
else{
s.insert(*first);
*result=unary_func(*first);
++first;++result;
}
}
return last;
}
struct i:public unary_function<int,int>{ int operator()(int a)const{return a;} };
//main側
string a="abcadbc";
string b;
unique_transform(a.begin(),a.end(),back_inserter(b),i());
cout << b << endl;
これを
int id(int n){return n;}を定義して
unique_transform(a.begin(),a.end(),back_inserter(b),id)
などと出来るようにしたい
後、STL実装ってVisualStudioのどっかのフォルダに入ってるんですかね?
0270デフォルトの名無しさん
2009/07/24(金) 18:51:41>>269は忘れてください
0271デフォルトの名無しさん
2009/07/24(金) 18:53:250272デフォルトの名無しさん
2009/07/29(水) 16:14:30をソートしたいのですが、どうすればいいのでしょうか?
Objectクラスにはbool operator< (const Object& lhs, const Object& rhs); が定義されています。
objs.sort (objs.begin(), objs.end());
とやると、上の<を使わずにポインターの値そのものを使ってソートしてくれやがります。
0273デフォルトの名無しさん
2009/07/29(水) 16:48:57第三引数にコンパレータを渡せ
0274デフォルトの名無しさん
2009/07/29(水) 17:42:22Object*& じゃないの
0275デフォルトの名無しさん
2009/07/29(水) 17:50:35ポインタ型同士の比較は272が言っているとおりコンパイラが組込で持っているから、
そんなのは定義できない。
というわけで>>273。
0276デフォルトの名無しさん
2009/07/29(水) 18:00:58ああ、すっかり忘れてた
0277デフォルトの名無しさん
2009/07/29(水) 18:23:21グローバル関数のオーバーロードで行けるかと思ったけど、
引数の片一方がクラスじゃねえぞ、とコンパイラにキレられた
0278デフォルトの名無しさん
2009/07/29(水) 18:54:190279272
2009/07/29(水) 19:03:15言っていることがさっぱりわからないので、勉強し直してきます。
0280デフォルトの名無しさん
2009/07/29(水) 19:40:45#include <boost/lambda/lambda.hpp>
using boost::lambda::_1;
using boost::lambda::_2;
std::sort(objs.begin(), objs.end(), *_1 < *_2);
0281デフォルトの名無しさん
2009/07/31(金) 11:00:250282デフォルトの名無しさん
2009/08/01(土) 11:48:54std::sort(objs.begin(), objs.end(), *boost::lambda::_1 < *boost::lambda::_2);
0283デフォルトの名無しさん
2009/08/01(土) 21:19:29SL の見間違いだった
0284デフォルトの名無しさん
2009/08/01(土) 22:07:16電車は飽きたので、slって打ったらSTLを宣伝するディストリを誰か作って
0285デフォルトの名無しさん
2009/08/01(土) 22:39:14走っているのは蒸気機関車であって電車ではない罠。
つーか、適当なSTL紹介文書を垂れ流すスクリプトを作って問題のslよりも上流に置けばいいだけじゃん。
0286デフォルトの名無しさん
2009/08/01(土) 22:47:120287デフォルトの名無しさん
2009/08/05(水) 23:59:28STLってlistとtreeを区別するもんだっけ?
0288デフォルトの名無しさん
2009/08/07(金) 10:25:05別に区別するともしないとも言ってないんでないの?
0289デフォルトの名無しさん
2009/08/07(金) 18:32:11listのノードは_Next, _Prevがあるだけだが
_Treeのノードは_Parent, _Left, _Rightがあるから
手が一本多い=構造に違いがある
っていうレスを求めてるのか?>>287
0290デフォルトの名無しさん
2009/08/07(金) 19:44:14treeはないし、あったとすればそれはベンダの独自拡張だから何とも言えない
0291デフォルトの名無しさん
2009/08/08(土) 02:49:210292デフォルトの名無しさん
2009/08/21(金) 00:36:35ハッシュマップだろjk
0293デフォルトの名無しさん
2009/08/21(金) 01:20:430294デフォルトの名無しさん
2009/08/21(金) 02:15:380295デフォルトの名無しさん
2009/08/21(金) 02:25:420296デフォルトの名無しさん
2009/08/21(金) 11:04:35男前だなあんた
0297デフォルトの名無しさん
2009/08/21(金) 12:08:50std::stringはstd::stringstreamと関係してる?別物?
0298デフォルトの名無しさん
2009/08/21(金) 12:18:47当然関係してる。
で、当然別物。
0299デフォルトの名無しさん
2009/08/21(金) 12:34:25嘘乙
stringstreamはiostreamを継承している
0300デフォルトの名無しさん
2009/08/26(水) 21:02:08std::generate(a, a+10, rand);
で乱数を入れられますが、rand()%100を入れたい場合、bindとか使ってどう書けばいいですか?
lambdaならできそうな気はしますが。
0301デフォルトの名無しさん
2009/08/26(水) 22:33:27generate(a, a+10, bind(modulus<int>(), bind(rand), 100));
TR1(bind)無しだと関数オブジェクト作らないと無理かな。
bindが使える環境ならTR1のrandomを使った方が良いような気がする。
0302300
2009/08/26(水) 23:08:17なるほど、bind(rand)ならば、評価のたびにrandが呼び出されるというわけですね。
この点がわかっていませんでした。
ありがとうございました。
0303名無しさん@そうだ選挙に行こう
2009/08/30(日) 19:50:15文字列のソートができる、コンテナを教えてください。
と聞いたら、どんな順番に並びかえるんだと突っ込みを受けることは甘受します
0304名無しさん@そうだ選挙に行こう
2009/08/30(日) 19:52:130305名無しさん@そうだ選挙に行こう
2009/08/30(日) 19:54:45map もソートできる?
0306デフォルトの名無しさん
2009/08/30(日) 20:26:20mapは常にkeyでソートされている。
0307デフォルトの名無しさん
2009/08/30(日) 20:50:57Sequence コンテナである vector, deque, list, basic_string であればすべて可能。
0308デフォルトの名無しさん
2009/08/30(日) 22:19:49そして、マンバ関数でいいならリストでもソートできる。すごい。
0309デフォルトの名無しさん
2009/08/30(日) 22:26:16それどこの踊り?
0310デフォルトの名無しさん
2009/08/30(日) 23:45:21マン坊
天気予報
0311デフォルトの名無しさん
2009/08/31(月) 08:07:080312デフォルトの名無しさん
2009/08/31(月) 20:03:20危うくスルーするとこだったwww
0313デフォルトの名無しさん
2009/09/01(火) 05:31:26途中にスペースを含むファイル名が出現すると、バラバラに読み込んでしまいます。
wsはタブと改行のみで、半角スペースは除外するような指定はできないのでしょうか?
0314デフォルトの名無しさん
2009/09/01(火) 08:56:230315デフォルトの名無しさん
2009/09/01(火) 08:58:470316デフォルトの名無しさん
2009/09/01(火) 09:19:310317デフォルトの名無しさん
2009/09/01(火) 09:37:030318デフォルトの名無しさん
2009/09/01(火) 11:57:430319デフォルトの名無しさん
2009/09/01(火) 12:22:360320デフォルトの名無しさん
2009/09/10(木) 21:29:350321デフォルトの名無しさん
2009/09/14(月) 19:26:320322デフォルトの名無しさん
2009/09/19(土) 19:32:57ポインタ演算にしか見えないんですが、何が良いんですか?
普通に書くよりイテレータに代入してから回す利点を教えてください
0323デフォルトの名無しさん
2009/09/19(土) 19:34:570324デフォルトの名無しさん
2009/09/19(土) 19:37:26もうちょっと抽象的なので、 vector のイテレータでも list のイテレータでも、
ある程度おなじように操作できる。
0325デフォルトの名無しさん
2009/09/19(土) 19:44:27わざとそうなっている。
線形リストや2分木など、配列以外のデータ構造でも
配列と同じように要素を辿れるのがイテレータの存在意義。
0326デフォルトの名無しさん
2009/09/19(土) 19:48:39ありがとうございます。
0327デフォルトの名無しさん
2009/09/21(月) 17:05:38↓みたいな関数も、aは意味的にはconstなのに、引数にconstをつけないか、中でconst外ししないと使えない。
void hoge(const std::valarray<double> &a)
{
memcpy(dest, &a[0], sizeof(double) * a.size());
}
0328デフォルトの名無しさん
2009/09/21(月) 18:55:080329デフォルトの名無しさん
2009/09/21(月) 22:17:070330デフォルトの名無しさん
2009/09/21(月) 23:39:23> 14882:2003 26.3.2.3/4
> Likewise, the expression &a[i] != &b[j] evaluates as true for
> any two non-constant arrays a and b and for any size_t i and
> size_t j such that i is less than the length of a and j is less
> than the length of b. This property indicates an absence of aliasing
> and may be used to advantage by optimizing compilers.
エイリアス(同じアドレスを持つオブジェクト)を排除することで、最適化に寄与する
ことを意図しているから。つまり >328
>329
> 14882:2003 26.3.2.3/3
> The expression &a[i+j] == &a[i] + j evaluates as true for all
> size_t i and size_t j such that i+j is less than the length of
> the non-constant array a.
だから連続性は保証されているはず。
0331デフォルトの名無しさん
2009/09/21(月) 23:46:31されてる
0332デフォルトの名無しさん
2009/09/22(火) 17:13:46いや、数値計算なんで。
>>330
thx.
vectorと比べてみたら、速度が変わったし、確かに最適化が効いてるみたい。
0333デフォルトの名無しさん
2009/09/22(火) 20:50:090334デフォルトの名無しさん
2009/09/22(火) 21:00:170335デフォルトの名無しさん
2009/09/22(火) 21:04:00知ったか乙
どこがどう無理なのか説明してみろよ
0336334
2009/09/22(火) 21:14:020337デフォルトの名無しさん
2009/09/22(火) 21:46:35ううん、そんなことないよ
0338デフォルトの名無しさん
2009/09/30(水) 02:22:46いちいちポインタ用のComparatorを自前で用意するのが面倒なんだけど。
0339デフォルトの名無しさん
2009/09/30(水) 04:44:00どっちがお望みかわからないからだろ。jk
0340デフォルトの名無しさん
2009/09/30(水) 05:15:100342デフォルトの名無しさん
2009/09/30(水) 21:58:49#include <boost/type_traits/remove_pointer.hpp>
template <typename T, template <typename Y> class Pred>
struct deref : public Pred<typename boost::remove_pointer<T>::type> {
bool operator()(const T& lhs, const T& rhs) const {
return Pred<typename boost::remove_pointer<T>::type>::operator()(*lhs, *rhs);
}
};
//std::set<int*, deref<int*, std::less> > container;
0343デフォルトの名無しさん
2009/09/30(水) 22:16:190344デフォルトの名無しさん
2009/10/01(木) 01:22:40std::set<int*, decltype(pcomp)> container(pcomp);
0345デフォルトの名無しさん
2009/10/05(月) 23:33:49最低限どんな仕様が要求されるのかを知りたいんですが
こういう仕様書のようなものはいったいどこで仕入れてるんでしょうか?
0346デフォルトの名無しさん
2009/10/06(火) 00:19:49どこにあるんでしょうね
言語の仕様じゃなくてあくまでもライブラリ内のお約束
という説明にずっと出会わなかったせいでSTLの勉強は大変だった
0347デフォルトの名無しさん
2009/10/06(火) 00:24:44ここのConceptsに書いてある
0348デフォルトの名無しさん
2009/10/06(火) 03:20:370349デフォルトの名無しさん
2009/10/06(火) 13:04:00コンテナを使っているうちに、いつのまにか
forward_iteratorとかreverse_iterator
とかに詳しくなっていくもんだろ。
0350デフォルトの名無しさん
2009/10/06(火) 16:05:200351デフォルトの名無しさん
2009/10/06(火) 19:17:42そりゃ勉強も大変だっただろうな
0352デフォルトの名無しさん
2009/10/09(金) 08:50:22何のことを言ってるの?
0353デフォルトの名無しさん
2009/10/09(金) 10:04:460354デフォルトの名無しさん
2009/10/10(土) 15:28:24組み込み型とかと違って、コンパイラが直接サポートしてくれるわけじゃないので、
そういう意味では「お約束」なのも事実だけど。
0355デフォルトの名無しさん
2009/10/22(木) 20:01:12変数が3個あり(点数、平均点、標準偏差)どのアルゴリズムを使えばよいのか分かりません、
どうしたら幸せになれますか?それともアルゴリズムの適用はあきらめるべきでしょうか?
適用したい関数 偏差値 = (点数 - 平均点) × 10.0 ÷ 標準偏差 + 50
0356デフォルトの名無しさん
2009/10/22(木) 20:21:210357デフォルトの名無しさん
2009/10/22(木) 20:31:340358デフォルトの名無しさん
2009/10/22(木) 20:36:340359デフォルトの名無しさん
2009/10/22(木) 20:53:36次に適当なアルゴリズムを使って標準偏差をを求めろ。
最後に適当なアルゴリズムを使って偏差値を求めろ。
0360デフォルトの名無しさん
2009/10/22(木) 21:05:51問題は最後の偏差値を求めるのに、transform や、for_each が使えなくて
他に良い方法が無いかと思案してるところです要するに、下記のコードを、STL 風に書くにはどうしたらいいですか?
// 偏差値 = (点数 - 平均点) × 10.0 ÷ 標準偏差 + 50
// DeviationValue(偏差値)、*iter(点数)、AVE(平均点) 、SD(標準偏差)
vector<double>::iterator iter = rhs.begin();
for(iter; iter < rhs.end(); ++iter)
{
DeviationValue = (*iter - AVE) * 10.0 / SD + 50.0;
rhs.push_back(DeviationValue);
}
0361デフォルトの名無しさん
2009/10/22(木) 21:32:25【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/39
↑でクソコード書いてた人ね。
あんなコードを平気で書くようならSTLなんか
使うの辞めたほうがいいよ。
もしくは入門書から や り な お せ 。
0362デフォルトの名無しさん
2009/10/22(木) 21:33:590363デフォルトの名無しさん
2009/10/22(木) 21:56:470364デフォルトの名無しさん
2009/10/22(木) 21:58:190365デフォルトの名無しさん
2009/10/22(木) 21:59:49boost::bindでぐぐるか、(std::tr1::bindがほぼ同じように使える)
関数オブジェクトでぐぐるか。
後者推奨だが。
0366デフォルトの名無しさん
2009/10/22(木) 22:00:23えっ?
0367デフォルトの名無しさん
2009/10/22(木) 22:01:220368デフォルトの名無しさん
2009/10/22(木) 22:11:32要するに3パラメータを持つ関数を取るようなアルゴリズムを教えろと書いてるわけだ。
で、そんなものはないし、標準のbindは2つまでなので正解は>>365。
華麗なる回答をいともたやすく繰り出す>>365はIT社長かイケメン大学生のどちらか。
0369デフォルトの名無しさん
2009/10/22(木) 23:24:16> 点数、平均点、標準偏差は既に適当なアルゴリズムで求まってます
と後出しされた時点でハァ?と思ったわけだが。
0370デフォルトの名無しさん
2009/10/22(木) 23:46:07おまえは>>360が例示しているコードも読めないのか。
というよりも読まないのか。
0371デフォルトの名無しさん
2009/10/22(木) 23:47:53>変数が3個あり(点数、平均点、標準偏差)
とずばり書いてあるじゃないか。
点数、平均点、標準偏差を算出しろとはどこにも書いていない。
文章読まない人には永遠に何も作れない。
0372デフォルトの名無しさん
2009/10/23(金) 03:37:49struct F {
F(double ave, double sd) : ave(ave), sd(sd) {}
double operator()(double n) const {
return (n - ave) * 10.0 / sd + 50.0;
}
double ave, sd;
};
〜〜〜
std::vector<double> result;
std::transform(src.begin(), src.end(), std::back_inserter(result), F(AVE, SD));
0373デフォルトの名無しさん
2009/10/25(日) 10:34:48stl::for_each アルゴリズムですが、イテレータを利用したfor 構文にしか見えないのですが
for 構文と比較してoperator() をオーバーロードできるという優位性は認めますが
それ以上のメリットはあるのでしょうか?
0374デフォルトの名無しさん
2009/10/25(日) 10:44:02・関数オブジェクトをインライン展開してくれるかもしれない
0375デフォルトの名無しさん
2009/10/25(日) 10:58:49・タイプ量が減る場合もあるでしょうか、少し複雑な関数オブジェクトなど定義した場合
トータルでは、必ずしも減るというわけではないと、理解しました。
・インライン展開される場合があるとのことですね、それはコンパイラの種類によっても違うのでしょうが
一般的にはどのような条件で、インライン展開されるのでしょうか?
0376デフォルトの名無しさん
2009/10/25(日) 11:12:40単純(シンプルだったりプリミティブだったり)とされている。
C++のfor文とforeach関数も同様の捉え方をしたらいいと思う。
タイプ量が多いのは今度、その場で関数オブジェクトを書けるようになるラムダ式が入るから、改善される。
(もっとも、そのときにはforeach構文も導入されるけど)
0377デフォルトの名無しさん
2009/10/25(日) 11:28:41少なくとも自分で作るより、安全/安心
0378デフォルトの名無しさん
2009/10/25(日) 11:32:45VC8 のfor_each を見ていますが、確かに言われる通りですね、ループカウンタの代わりに、
ポインタをインクリメントしているように見えます(反復子とポインタの正確な違いを理解していないのでごめんなさい)
時々専用template 関数も書いたりしますが、ラムダ式の場合は、やはり私も
for_each 関数、もしくはtransform 関数を使うことが多いですね。
0379デフォルトの名無しさん
2009/10/25(日) 23:02:03for(it = container.begin(); it != container.end(); ++it) { /* something to do */ }
ってなったりして end() を毎回呼び出すのかよ!というのを気にしなくて済む。
0380デフォルトの名無しさん
2009/11/01(日) 09:01:120381デフォルトの名無しさん
2009/11/01(日) 13:49:35いちおう普段から、forループではend()呼び出しは一回、必ず前置でインクリメント、
という書き癖を付けてるけど、まぁ「そのお陰で助かった」ということはまだ無いな。
0382デフォルトの名無しさん
2009/11/01(日) 14:22:29そういうちょっとした積み重ねが、気づかないうちにパフォーマンスの改善に寄与してるかもしれんし。
0383デフォルトの名無しさん
2009/11/01(日) 16:13:25良くこういうことを言う奴がいるが、実際にそういうケースはあったの?
0384デフォルトの名無しさん
2009/11/01(日) 16:29:25「はい、これがそうです」と提示できる形にはなっていないものだと思うよ。
プログラミングに限らず。
言うなれば、その人の行うすべての事が、少しずつそのスタンスの影響下にあるわけで、
その一部を切り出して「この範囲内が、私の積み重ねの成果です」とは見せられないと思う。
0385デフォルトの名無しさん
2009/11/01(日) 17:05:460386デフォルトの名無しさん
2009/11/01(日) 17:42:04その格言出すだろうと思ったw
0387デフォルトの名無しさん
2009/11/01(日) 17:47:56お前が一番勘違いしてるw
0388デフォルトの名無しさん
2009/11/01(日) 20:19:040389デフォルトの名無しさん
2009/11/01(日) 20:24:450390デフォルトの名無しさん
2009/11/01(日) 21:04:430391デフォルトの名無しさん
2009/11/01(日) 21:14:18100万回回せば16分速くなる
0392デフォルトの名無しさん
2009/11/01(日) 21:38:58それは、速くするためにコードの読みやすさだの自然さだのを犠牲にする、
「いわゆる最適化」の話。
クヌース先生が、それをあまり初期にやるのは諸悪の根源だと言ってる行為ね>>385
でも今やってるのは、どっちが読みやすいわけでもないスタイルのうち、
もしかしたら少し速いこともあり得るから私はこっちのほう選んでます、という話。
それはもっとささやかな話で、自己満も何も関係してこない。
0393デフォルトの名無しさん
2009/11/01(日) 22:44:350394デフォルトの名無しさん
2009/11/01(日) 22:52:170396デフォルトの名無しさん
2009/11/01(日) 23:05:370397デフォルトの名無しさん
2009/11/02(月) 01:36:47endが何度も呼ばれることもないし、1度変数に代入する手間も要らない。
ファンクタ作るの面倒?C++0xまでしばしお待ちを……。
0398デフォルトの名無しさん
2009/11/02(月) 06:32:21間違いにも程がある。お前はKnuthの論文読んでないな。
We should forget about small efficiencies, say about 97% of the time:
premature optimization is the root of all evil. Yet we should not pass up our
opportunities in that critical 3%. A good programmer will not be lulled into
complacency by such reasoning, he will be wise to look carefully at the
critical code; but only after that code has been identified.
It is often a mistake to make a priori judgments about what part of a program
are really critical, since the universal experience of programmers who have
been using measurement tools has been that their intuitive guesses fail.
とあるように、プロファイラも使わずに単なる推測でこっちの方が速かろう
というコードを書くことがpremature optimizationだ。end()のコストを気に
することも同様で、まさに最後の一文に書いてあることの典型例。
0399デフォルトの名無しさん
2009/11/03(火) 01:25:12だけど、operator++|--の前置後置や、ループ条件チェックにend()を直接書くか変数に入れるかというのは、
どちらがより良い結果を生みやすいかは自明で「最適化されたら同じになるかもしれない」というだけのこと
に過ぎないはずだ。
もちろん、特別な理由で前置が後置よりコストがかかるとか、end()の戻り値を変数に格納するには何か
別のクラスに変換する必要があって、イテレータとそのクラスの比較はend()を直接書くよりコストがかかる、
みたいなのが頻出するようなコードなら話は別だが、これをもって「前置の++/--やend()を変数に入れる
のは時期尚早な最適化だ」というのは苦しいし、それこそ「まず計測する」べきことだと思うのだが。
0400デフォルトの名無しさん
2009/11/03(火) 01:57:36読みやすさも書きやすさも同等のコードで意味もなく遅いかもしれない方を選ぶ理由はない
0401デフォルトの名無しさん
2009/11/03(火) 02:24:48それ以上は、大カッコ{}をどこに書くか に匹敵するぐらい不毛。
0402デフォルトの名無しさん
2009/11/03(火) 03:43:24原文も読まずに的外れなこと言ってるw
0403デフォルトの名無しさん
2009/11/03(火) 06:25:48なんて言ってないだろ。最初から。
それなのに何をそんなに食い下がるの?
「ごめん、勘違いしてた」って言いたくないとかいう小学生みたいな理由じゃないの?
0404デフォルトの名無しさん
2009/11/03(火) 06:44:27We should forget about small efficiencies, say about 97% of the time:
すら読めないのか?馬鹿にも程があるぞ
0405デフォルトの名無しさん
2009/11/03(火) 07:01:40> だれもパフォーマンスのボトルネックになるから end() を変数に入れなきゃ、
> なんて言ってないだろ。最初から。
お前は日本語も読めんのか?
0406デフォルトの名無しさん
2009/11/03(火) 07:12:44small efficiencies を読めない程の馬鹿か?
ボトルネックの話なんてしていない
0407デフォルトの名無しさん
2009/11/03(火) 07:17:15申し訳ありませんが「パフォーマンスのボトルネックになるから」の部分を
「効率のために」に置き換えて読んでもらえませんでしょうか?
あと、下記の質問について、どのようにお考えでしょうか?
> それなのに何をそんなに食い下がるの?
> 「ごめん、勘違いしてた」って言いたくないとかいう小学生みたいな理由じゃないの?
0408デフォルトの名無しさん
2009/11/03(火) 07:28:57自分が勝手に誤解しておいて罵倒とは笑わせるな
> あと、下記の質問について、どのようにお考えでしょうか?
食い下がっているのはお前だw
0409デフォルトの名無しさん
2009/11/03(火) 07:32:100410デフォルトの名無しさん
2009/11/03(火) 07:32:580411デフォルトの名無しさん
2009/11/03(火) 07:35:560412デフォルトの名無しさん
2009/11/03(火) 08:55:430413デフォルトの名無しさん
2009/11/03(火) 13:49:47変に絡んでるように見える。
0414デフォルトの名無しさん
2009/11/03(火) 17:22:09end()云々にそんなに熱くならなくて良い。
0415デフォルトの名無しさん
2009/11/03(火) 17:39:17参照してる事が多いんじゃないか?
ヘッダーファイルを見て見ろよ
0416デフォルトの名無しさん
2009/11/03(火) 17:48:59for_each() の中から end() は呼び出せません。
0417デフォルトの名無しさん
2009/11/03(火) 17:49:48意味違うって
for_eachをどうやって実現してるかの話をしてるの
0418デフォルトの名無しさん
2009/11/03(火) 17:53:55だれもそんな話はしてないが、まぁ話がしたいなら止めはしないでおこう。
0419デフォルトの名無しさん
2009/11/03(火) 17:55:16最近はそういう遊びでも流行ってんのか?
0420デフォルトの名無しさん
2009/11/03(火) 17:57:56for_eachは引数でend()を渡すので、end()を呼ぶ回数は1回だけ。
つまり、効率面ではforループの前にend()を変数に代入するほうと同じ。
0421デフォルトの名無しさん
2009/11/03(火) 18:01:12馬鹿発見
>>419
そうだね>>418は馬鹿です
>>420
なるほど
0422デフォルトの名無しさん
2009/11/03(火) 18:34:04end()ごときの呼び出しコストを気にする意味は全然ない
0423デフォルトの名無しさん
2009/11/03(火) 18:42:140424デフォルトの名無しさん
2009/11/03(火) 19:17:18オーバーヘッドの塊?
例えば何のオーバーヘッドのこと?
0425デフォルトの名無しさん
2009/11/03(火) 20:02:43何もわかってない人
0426デフォルトの名無しさん
2009/11/03(火) 20:46:15end()呼び出しにはオーバーヘッドあるけど。
0427デフォルトの名無しさん
2009/11/03(火) 21:14:12実装依存でしょうが
0428デフォルトの名無しさん
2009/11/03(火) 21:15:340429デフォルトの名無しさん
2009/11/03(火) 21:17:32「ポインタで実装できるから」に置き換えて読んでもらえませんでしょうか?
あと、下記の質問について、どのようにお考えでしょうか?
> 例えば何のオーバーヘッドのこと?
0430デフォルトの名無しさん
2009/11/03(火) 21:19:14STLは速度と効率を犠牲にして僅かなバカ避けと書きやすさを得るための物であって
速度を気にすること自体が間違い
0431デフォルトの名無しさん
2009/11/03(火) 21:20:12だから
>普通イテレータは唯のポインタだから
は間違い。
普通ってなに?
ポインタが普通って初めて聞いたよww
たしか、vcがポインタだから、そう言ってるとしか・・・
0432デフォルトの名無しさん
2009/11/03(火) 21:21:42ふむふむ。
> 速度を気にすること自体が間違い
、ミ川川川彡 ,ィr彡'";;;;;;;;;;;;;;;
ミ 彡 ,.ィi彡',.=从i、;;;;;;;;;;;;
三 ギ そ 三 ,ィ/イ,r'" .i!li,il i、ミ',:;;;;
三. ャ れ 三 ,. -‐==- 、, /!li/'/ l'' l', ',ヾ,ヽ;
三 グ は 三 ,,__-=ニ三三ニヾヽl!/,_ ,_i 、,,.ィ'=-、_ヾヾ
三 で 三,. ‐ニ三=,==‐ ''' `‐゛j,ェツ''''ー=5r‐ォ、, ヽ
三. 言 ひ 三 .,,__/ . ,' ン′  ̄
三 っ ょ 三 / i l,
三. て っ 三 ノ ..::.:... ,_ i ! `´' J
三 る と 三 iェァメ`'7rェ、,ー' i }エ=、
三 の し 三 ノ "'  ̄ ! '';;;;;;;
三 か て 三. iヽ,_ン J l
三 !? 三 !し=、 ヽ i ,.
彡 ミ ! "'' `'′ ヽ、,,__,,..,_ィ,..r,',",
彡川川川ミ. l _, , | ` ー、≡=,ン _,,,
ヽ、 _,,,,,ィニ三"'" ,,.'ヘ rー‐ ''''''"
`, i'''ニ'" ,. -‐'" `/
ヽ ! i´ /
ノレ'ー'! / O
0433デフォルトの名無しさん
2009/11/03(火) 21:22:06は?根拠も無いこと言うな。
0434デフォルトの名無しさん
2009/11/03(火) 21:22:25> 少なくとも生の配列をfor文で回すよりは絶対に遅い
ねーよ
0435デフォルトの名無しさん
2009/11/03(火) 21:23:520436デフォルトの名無しさん
2009/11/03(火) 21:35:10うわー時代錯誤のジジイが現れたよw
0437デフォルトの名無しさん
2009/11/03(火) 21:41:07アイタタタ
0438デフォルトの名無しさん
2009/11/03(火) 21:47:24「ポインタで実装できる」けど「ポインタで実装してない」場合は?
>あと、下記の質問について、どのようにお考えでしょうか?
>>422 は俺じゃないから関係ない。
0439デフォルトの名無しさん
2009/11/03(火) 21:53:10std::for_eachの実現方法はループ一回ごとに毎回lastとイテレータを
比較していた
Dinkumwareだから多分VC9も同じだろう
安易な推測は禁物だが
かと言ってSTLportは既に時代の遺物になっちまったしなあ
速い事は速いんだが
0440デフォルトの名無しさん
2009/11/03(火) 21:56:05やっぱり安易な推測は禁物だった
VC9は同じDinkumwareなのにちゃんとLastの値をコピーして
それとイテレータを比較している
どんなんやねん
Dinkumwareへのお布施の金額が違うのか?
0441デフォルトの名無しさん
2009/11/03(火) 21:58:06> 「ポインタで実装できる」けど「ポインタで実装してない」場合は?
普通じゃないな。
0442デフォルトの名無しさん
2009/11/03(火) 21:59:24> std::for_eachの実現方法はループ一回ごとに毎回lastとイテレータを
> 比較していた
・・・当たり前だろ?
> VC9は同じDinkumwareなのにちゃんとLastの値をコピーして
> それとイテレータを比較している
・・・それで何が違うと思ってるの?
0443デフォルトの名無しさん
2009/11/03(火) 22:13:39Lastが遅いと微々たる差だが速度に影響するだろ?
0444デフォルトの名無しさん
2009/11/03(火) 22:17:30はぁ?
おまえ C++ 使い始めて何分だよ?
0445デフォルトの名無しさん
2009/11/03(火) 22:22:17おっしゃる意味がよくわかりませんが
Cでも同じでしょ
終端条件がもし関数呼び出しになっていて
その関数が大変遅いとどうなる?
0446デフォルトの名無しさん
2009/11/03(火) 22:25:18Lastは関数じゃないから
0447デフォルトの名無しさん
2009/11/03(火) 22:25:27for (初期設定; 大変遅い終了条件判定; イテレータ変化) {}
となってたらどうなるかって話だよ
0448デフォルトの名無しさん
2009/11/03(火) 22:26:27end()とかでしょ
この()って要するに関数呼び出しか関数オブジェクトのどちらかじゃねーの?
速ければいいが遅かったらどうなるよ?って聞いてるの
0449デフォルトの名無しさん
2009/11/03(火) 22:27:46大抵な
0450デフォルトの名無しさん
2009/11/03(火) 22:28:56ちゃんと読めよ。
関数じゃない。
0451デフォルトの名無しさん
2009/11/03(火) 22:30:50std::for_each() に渡した時点でただのイテレータ型の値だよ。
0452デフォルトの名無しさん
2009/11/03(火) 22:30:52メンバ関数だろがカス
0453デフォルトの名無しさん
2009/11/03(火) 22:32:36なっとくしますた
0454デフォルトの名無しさん
2009/11/03(火) 22:34:450455デフォルトの名無しさん
2009/11/03(火) 22:44:530456デフォルトの名無しさん
2009/11/03(火) 22:49:24意味の違いが微妙なんでそうなってるんではないかと
たとえばstd::for_eachがインライン関数になってたら毎回
end()を呼び出す可能性もある
0457デフォルトの名無しさん
2009/11/03(火) 22:50:25インライン展開されないんだがな
多分>>456のようにかえってデメリットがあるからだろう
0458デフォルトの名無しさん
2009/11/03(火) 22:52:40ねーよ。
たのむからデタラメを偉そうに書き込むのやめてくれ。
0459デフォルトの名無しさん
2009/11/03(火) 22:53:491回だけしか評価されないだろ
0460デフォルトの名無しさん
2009/11/03(火) 22:59:41C言語で終了条件に関数を含むプログラム書いてコンパイルして
吐いたコード見てみる
0461デフォルトの名無しさん
2009/11/03(火) 23:02:28何をする関数だと思ってるんだ
0462デフォルトの名無しさん
2009/11/03(火) 23:03:43文中に直接終了条件中に関数呼び出しを書いた場合は
毎回関数呼び出しして比較してるな
コンパイラによるんだろうけど俺の場合は毎回呼び出していた
for_each()は検証できない
俺のコンパイラではfor文を含む関数はインライン展開されないからだ
0463デフォルトの名無しさん
2009/11/03(火) 23:12:28コメントが入っているfor文の終了判定は毎回関数呼び出しされる
int func(void)
{
int i;
for (i = 0; i < 1000000; i++);
return 1;
}
int main(void)
{
int i;
for (i = 0; i != func(); i++); // funcはループ毎に呼び出しされる
return 0;
}
0464デフォルトの名無しさん
2009/11/03(火) 23:13:47当たり前
0465デフォルトの名無しさん
2009/11/03(火) 23:14:47は、何がしたいんだ?
0466デフォルトの名無しさん
2009/11/03(火) 23:17:20だからfor_eachのループがもしインライン展開されたらLastも
毎回評価されるでしょって話
0467デフォルトの名無しさん
2009/11/03(火) 23:19:50毎回評価されない
お前仮引数を何だと思ってるんだ?
0468デフォルトの名無しさん
2009/11/03(火) 23:20:11lastの型がint*とかだったらどうなると思っているわけ?
int nums[] = {1,2,3,4};
for_each(nums, nums+4, 何か関数オブジェクト);
0469デフォルトの名無しさん
2009/11/03(火) 23:22:39あ、ちょっと訂正
×毎回評価されない
○毎回評価されるが関数呼び出しは伴わない
0470デフォルトの名無しさん
2009/11/03(火) 23:25:16for( ; iter != last ; ){}
とするか
for( ; iter != end() ; ){}
かだけの違い。
end()が仮に遅い処理だったら、前者の方が良いよねってそれだけ話だと思うが・・・
0471デフォルトの名無しさん
2009/11/03(火) 23:27:200472デフォルトの名無しさん
2009/11/03(火) 23:27:20お前さんの話がそもそも今回話がこじれるようになった発端だぞ
std::for_each()アルゴリズム中で例えfor文が使われていようと、
仮引数で書かれている以上毎回関数呼び出しを伴う事はない
std::for_eachを呼び出す時に一回だけ評価される
後はfor文中のループで毎回その *仮引数* と比較される
0473デフォルトの名無しさん
2009/11/03(火) 23:44:26そして俺も
0474デフォルトの名無しさん
2009/11/03(火) 23:47:250475デフォルトの名無しさん
2009/11/03(火) 23:50:26for_eachは関数だろうが
0476デフォルトの名無しさん
2009/11/03(火) 23:50:29for_each(v.begin(), v.end(), func_obj);
を呼び出したとき、for_each の引数のLastにはv.end()の戻り値が入るので
for_each の中end()が呼ばれることはなくなるはずってところだろ。
インライン展開は関係ない。
0477デフォルトの名無しさん
2009/11/03(火) 23:55:06そういう事
>>470みたいな書きこみが話をややこしくする
文中に書く場合と関数呼び出しで仮引数に書く場合を
はっきり区別しろ
0478デフォルトの名無しさん
2009/11/04(水) 00:00:37すまん。てっきり、forの終了条件のところの話しかと思ってた。
for_eachの時の話しだったのか。まじ、すまん。
0479デフォルトの名無しさん
2009/11/04(水) 00:02:180480デフォルトの名無しさん
2009/11/04(水) 00:07:48void for_each(Iter b, Iter e, Func f)
{
for(Iter tmp=b; tmp != e; tmp++){f(*tmp);}
}
と
void for_each(Iter b, Iter e, Func f)
{
Iter tmp_end=e;
for(Iter tmp=b; tmp != tmp_end; tmp++){f(*tmp);}
}
のどっちになってるかという実装依存の問題
(細かい作りは本質的じゃないからツッコミ禁止)
前者ならインライン展開されるとend()が毎回呼ばれる
ライブラリベンダが気を利かせて後者にしてくれてることを望むしかないわけだが
そうしなければならないと強制してくれる物は何もない
0481デフォルトの名無しさん
2009/11/04(水) 00:12:590482デフォルトの名無しさん
2009/11/04(水) 00:13:120483デフォルトの名無しさん
2009/11/04(水) 00:14:18> 前者ならインライン展開されるとend()が毎回呼ばれる
ねーよ。
0484デフォルトの名無しさん
2009/11/04(水) 00:15:12おねがいですから、もうやめてください。
0485デフォルトの名無しさん
2009/11/04(水) 00:16:07>前者ならインライン展開されるとend()が毎回呼ばれる
また馬鹿が現れた
これ関数よ?end()は既に仮引数に化けてるの!
0486デフォルトの名無しさん
2009/11/04(水) 00:16:54じゃあ、どうなると思うの?
前者で書いてもコンパイラが最適化で勝手に後者に変えてくれると思ってるなら
ちょっと期待しすぎだと思う
0487デフォルトの名無しさん
2009/11/04(水) 00:16:57今時こんなのが1日に何人も現れるわけがない。
0488デフォルトの名無しさん
2009/11/04(水) 00:18:05>>480
#defineではあるまいし、前者をインライン展開した結果endが複数回呼ばれるコードが吐かれるわけがない。
もし、そんなコードを吐くコンパイラがあったら、それは規格に反している。
(endの中に副作用がないなら話は別だが)
0489デフォルトの名無しさん
2009/11/04(水) 00:18:47「インライン展開されると」を見落とさないでくれ
普通の関数ならもちろん呼び出しは1回だよ
eという名前でスタックにend()のコピーが積まれるからね
0490デフォルトの名無しさん
2009/11/04(水) 00:18:52いい加減に関数について基本から勉強しなおしてください
お願いです
0491デフォルトの名無しさん
2009/11/04(水) 00:19:32int f();
void g(int x);
int main() { g(f()); }
お前はこのプログラムで f() が何回実行されるか g() の中身がわからないと定まらない、と、
そう言うのかね?
0492デフォルトの名無しさん
2009/11/04(水) 00:20:03インライン展開は無視する事ができる
という事は、インライン展開されようとされまいと全く同じ
動作をするコードをコンパイラは吐かなければならないわけ
わかる?
0493デフォルトの名無しさん
2009/11/04(水) 00:20:13アウトライン関数とインライン関数の違いについて勉強してください……
0494デフォルトの名無しさん
2009/11/04(水) 00:21:55gが
inline void g(int x);
だったら当然gの中身を見ないと何回呼ばれるかはわからない
でも中身はヘッダにあるはずだから書いたときに判断付くでしょう
0495デフォルトの名無しさん
2009/11/04(水) 00:22:22今度は「アウトライン関数」という造語ですか?
0496デフォルトの名無しさん
2009/11/04(水) 00:22:50> だったら当然gの中身を見ないと何回呼ばれるかはわからない
さんざん違うっていわれてるのに、なんで当然なの?何が根拠なの?
0497デフォルトの名無しさん
2009/11/04(水) 00:23:01だから、インライン関数の引数に代入文やインクリメントを入れるのがまずいんだよ
意味変わっちゃうから
0498デフォルトの名無しさん
2009/11/04(水) 00:24:05誰も今そんな話はしてないだろ
話を逸らすなカス
0499デフォルトの名無しさん
2009/11/04(水) 00:24:57気に食わないなら非インライン関数でも逆インライン関数でもなんでもいいよ
問題はそこじゃない
0500デフォルトの名無しさん
2009/11/04(水) 00:25:05インライン関数はプリプロセッサマクロとは違い、そのような注意事項は無用です。
0501デフォルトの名無しさん
2009/11/04(水) 00:26:35あのね、>>492でも書いたけど、インライン展開の指令を
コンパイラは無視していいわけ
だからインライン展開すると意味が変わってしまうようなコードを
コンパイラは吐いちゃいけないんだよ
0502デフォルトの名無しさん
2009/11/04(水) 00:27:58その通り
だからプログラマもインライン展開すると意味が変わってしまうようなコードを書いてはいけないんだよ
0503デフォルトの名無しさん
2009/11/04(水) 00:29:54(゚Д゚ )ハァ?これ以上付き合いきれんわ
馬鹿過ぎ
お前もう寝ろ
0504デフォルトの名無しさん
2009/11/04(水) 00:30:51そうだから、意味が変わらないようにインライン展開してくれるのが、
インライン関数の優れているところだとinlineができた当初から言われ続けている。
0505デフォルトの名無しさん
2009/11/04(水) 00:31:25あなたにそのように教えた本や人やサイトを教えてもらえませんか?
潰しにいくから。
0506デフォルトの名無しさん
2009/11/04(水) 00:33:37インラインの細かい実装は今はどうでもいいよ
話を元に戻そうぜ
実装が>>480の前者だったら
for_each(v.begin(),v.end(),f);
のインライン展開はこうなるだろ?
(最適化で追い出してくれるかもしれないという話は考えないとして)
for(Iter tmp=v.begin(); tmp != v.end(); tmp++){f(*tmp);}
条件節にv.end()が現れてるのが見える?
0507デフォルトの名無しさん
2009/11/04(水) 00:34:40> のインライン展開はこうなるだろ?
なりません。
0508デフォルトの名無しさん
2009/11/04(水) 00:36:09釣りだと言ってくれ
0510デフォルトの名無しさん
2009/11/04(水) 00:38:35じゃあどうなるっていうんだ
書いて見せろよ
当然だが、最適化でv.end()の戻り値を保存する変数を追加してくれるかどうかは
コンパイラの質次第だから当てにしないという前提でな
0511デフォルトの名無しさん
2009/11/04(水) 00:39:11だ か ら
インライン展開してそのようなコードを吐くなら
インライン展開する場合としない場合で意味が変わってしまうでしょ?
だからそういう展開はしない事になってるの
0512デフォルトの名無しさん
2009/11/04(水) 00:39:14/: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ ___
/;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、 / ヽ
/ヽヽ: ://: :!:,X~::|: /;,,;,/: :/ リ!: ::/ノ l`ヽl !: : |: : : :l: :l: リ / そ そ お \
/: : ヽヾ/: : l/::l |/|||llllヾ,、 / |: :/ , -==、 l\:::|: : : :|i: | / う う 前 |
. /: : : //ヾ ; :|!: イ、||ll|||||::|| ノノ イ|||||||ヾ、 |: ::|!: : イ: ::|/ な 思 が
/: : ://: : :ヽソ::ヽl |{ i||ll"ン ´ i| l|||l"l `|: /|: : /'!/l ん う
∠: : : ~: : : : : : : :丶ゝ-―- , ー=z_ソ |/ ハメ;, :: ::|. だ ん
i|::ハ: : : : : : : : : : : 、ヘヘヘヘ 、 ヘヘヘヘヘ /: : : : : \,|. ろ な
|!l |: : : : : : : : :、: ::\ 、-―-, / : : :丶;,,;,:ミヽ う ら
丶: :ハ、lヽ: :ヽ: : ::\__ `~ " /: : ト; lヽ) ゝ
レ `| `、l`、>=ニ´ , _´ : :} ` /
,,、r"^~´"''''"t-`r、 _ -、 ´ヽノ \ノ / お ・
,;'~ _r-- 、__ ~f、_>'、_ | で 前 ・
f~ ,;" ~"t___ ミ、 ^'t | は ん ・
," ,~ ヾ~'-、__ ミ_ξ丶 | な 中 ・
;' ,イ .. ヽ_ ヾ、0ヽ丶 l /
( ;":: |: :: .. .`, ヾ 丶 ! \____/
;;;; :: 入:: :: :: l`ー-、 )l ヾ 丶
"~、ソ:: :い:: : \_ ノ , ヾ 丶
0513デフォルトの名無しさん
2009/11/04(水) 00:40:34>当然だが、最適化でv.end()の戻り値を保存する変数を追加してくれるかどうかは
>コンパイラの質次第だから当てにしないという前提でな
精神科逝け
0514デフォルトの名無しさん
2009/11/04(水) 00:41:27だからさ
インライン展開するしないで意味が変わったら困る、それはその通りだ
だがプログラマがそうならないように気をつけることと、
賢いコンパイラがそうならないように気を遣う事は別の話だ
君はそれがごっちゃになってる
0515デフォルトの名無しさん
2009/11/04(水) 00:41:55お前のほうこそ、引数にある関数呼び出しを関数の中で繰り返し行うような関数をひとつでも
書いて見せろ。あ、報告はもちろん手元でアセンブリ見て確認してからな。
0516デフォルトの名無しさん
2009/11/04(水) 00:42:09お前こそマクロとインライン展開をごっちゃにしてるじゃないか
0517デフォルトの名無しさん
2009/11/04(水) 00:43:070518デフォルトの名無しさん
2009/11/04(水) 00:44:32マクロとインライン関数は全然別物だよ
インライン関数は型チェックが働くしオーバーロードも出来る
だが今の話には関係ない
0519デフォルトの名無しさん
2009/11/04(水) 00:46:14何言ってるんだ
今の話に関係おおありだよバカ
0520デフォルトの名無しさん
2009/11/04(水) 00:47:12> 当然だが、最適化でv.end()の戻り値を保存する変数を追加してくれるかどうかは
すでにコード中に e (>>480) という変数があるんだが。
約一名だけが、この変数が(なぜか)除去されると主張している。
0521デフォルトの名無しさん
2009/11/04(水) 00:47:270522デフォルトの名無しさん
2009/11/04(水) 00:47:50506のインライン展開がどうなると主張したいのか、書いて見せてくれよ
最適化抜きでな
何が言いたいのかさっぱりわからない
0523デフォルトの名無しさん
2009/11/04(水) 00:48:14インライン関数を完全に誤解している
0524デフォルトの名無しさん
2009/11/04(水) 00:48:26> コンパイラの質次第
一応、可能性としては主に次の2つが考えられる。
1. v.end()の戻り値を保存する変数を追加する
2. インライン展開しない
だがしかし、
3. v.end()を毎回呼ぶように展開する(for(Iter tmp=v.begin(); tmp != v.end(); tmp++){f(*tmp);}のように)
これはない。
0525デフォルトの名無しさん
2009/11/04(水) 00:49:09eは(bもfもだけど)アウトライン関数ではスタック変数になるけど
インライン関数では展開時に置き換わって消えちゃうでしょ
わかる?
0526デフォルトの名無しさん
2009/11/04(水) 00:50:41// for_each(v.begin(),v.end(),f);
{
Iter b(v.begin());
Iter e(v.end());
Func f(/*outer*/f);
for(Iter tmp=b; tmp != e; tmp++){f(*tmp);}
}
0527デフォルトの名無しさん
2009/11/04(水) 00:51:19だから消えるか消えないかはコンパイラ次第だが
スタック変数と全く同じ動作をするコードを吐く
毎回end()を呼ぶようなコードは絶対に吐かない
0528デフォルトの名無しさん
2009/11/04(水) 00:51:320529デフォルトの名無しさん
2009/11/04(水) 00:56:20「お前らコンパイラの最適化に期待しすぎ」
forを検知したら条件節で使われる関数呼び出しを自動でキャッシュしてくれたら
まあ便利だろうけど全てのコンパイラにそれを望むのは酷だ
そんなことしてくれなくても効率良く正しく動くように書くのが正しい
0530デフォルトの名無しさん
2009/11/04(水) 00:57:180531デフォルトの名無しさん
2009/11/04(水) 00:58:47ぜってー釣りだなこれ
0532デフォルトの名無しさん
2009/11/04(水) 01:03:07変数を除去してくれちゃう最適化(だかなんだかわからん困った変形)は前提にしていいのかw
0533デフォルトの名無しさん
2009/11/04(水) 01:03:48>>529
それができないコンパイラはインライン展開しないという選択肢を取る。
0534デフォルトの名無しさん
2009/11/04(水) 01:05:53挙動が変わるのはコンパイラの最適化とは言わない。
int f(){
cout << "Hello world" << endl;
return 1;
}
void g(int i);
int main(){
g(f());
}
関数gの実装によってHello worldが表示される回数が変わる仕様なわけがない。
0535デフォルトの名無しさん
2009/11/04(水) 01:13:41inlineを付けた関数で副作用を何回も起こさないように気をつけるのはプログラマの責任
付けてない関数を副作用が繰り返されないと判断してインラインにするのは
賢いコンパイラのアグレッシブな最適化の一つ
やっぱりごっちゃになってる
0536デフォルトの名無しさん
2009/11/04(水) 01:14:080537デフォルトの名無しさん
2009/11/04(水) 01:52:45念のため、inline void g(int i) {/* 〜 */}となどと書いておくべきだったと思う。
もちろん、標準規格に合致した普通のコンパイラなら結果は変わらないけどさ。
0538デフォルトの名無しさん
2009/11/04(水) 02:46:060539デフォルトの名無しさん
2009/11/04(水) 02:51:53完全に文法を誤解しているのか知っててわざと釣りをしているのか
知らないけど、とにかく相手をいらだたせるような話の方向に持って
行こうとする
まるで「私がC++コンパイラです」みたいな間違い方
最悪だ
0540デフォルトの名無しさん
2009/11/04(水) 02:56:02どうにも話が噛み合わないね
0541デフォルトの名無しさん
2009/11/04(水) 02:57:460542デフォルトの名無しさん
2009/11/04(水) 03:26:45NULLはまだしも使い道があるが・・・(ガッしたりとか)
0543デフォルトの名無しさん
2009/11/04(水) 04:26:23このスレだけえらい伸びてると思ったんだが
一人で引っ張ってるアホがいるのか
0544デフォルトの名無しさん
2009/11/04(水) 05:48:17間もなく目お開きになられ、そしてそのありがたいお言葉を とうとうと述べられるのです
0545デフォルトの名無しさん
2009/11/04(水) 08:24:02謙虚に冷静に聞いて欲しい.
いいかい?
あるアプリケーションのすべての関数にinlineを明示しても,
そのアプリケーションの意味論は変化しない.
コンパイラが生成するバイナリは変化する可能性がある.
もう一度言うよ.
バイナリが変化して実行速度が変化することはあるが,意味論は変化しない.
意味論は変化しないんだ.
で,だ.
この話はアセンブリまで見る必要ないよ.
実際にinlineの有無で挙動が変化する例をコンパイラとコードを明示して僕らに教えてよ.
僕らはそんなコンパイラは存在しないと主張しているので動く証拠を見せられるのは君だけだ.
0546デフォルトの名無しさん
2009/11/04(水) 08:46:51int g() { return puts("Hello"); }
int main() { f(g()); return 0; }
f() の中身をどうにかするだけで "Hello" を2回表示させることができるというわけだな。
さぁやってみせてもらおうか。
0547デフォルトの名無しさん
2009/11/04(水) 08:54:190548デフォルトの名無しさん
2009/11/04(水) 11:32:41自分はfriend 関数を、止むおえず使わないといけないような(friend を使うことによって可読性や構成がすっきりするという意味合いです)、
限定的なクラスデザイン以外に、継承を使うメリットは無いように思うのですが・・・・
使用するにあたっても、書式がコンパイラ依存する部分も多々あり、使いにくい印象もあります
いかがなものでしょうか?
0549デフォルトの名無しさん
2009/11/04(水) 11:37:32普通の継承と同じようにメリット・デメリット(や妥当性)を考えればいいんじゃないの?
なんでテンプレート限定で考えてるの?
friend との関係もわからないし。(日本語的な問題も含めて)
0550デフォルトの名無しさん
2009/11/04(水) 11:51:56thx です、なるほど解りました。
friend関数については、忘れてください混乱してました。
0551デフォルトの名無しさん
2009/11/04(水) 13:15:01完全に釣られてる側の負けだろこれ
0552デフォルトの名無しさん
2009/11/04(水) 17:09:54どっちにしろ反応してもいい事はないけどね。
0553デフォルトの名無しさん
2009/11/04(水) 18:24:41意味論は変化しなくても、副作用は変化するかもしれない
例えばコピーコンストラクタに何かの処理を入れたクラスは
それを返す関数でRVOが働くかどうかによって挙動が変わるよな
値戻しという意味論は変わらなくても、実際の処理は最適化によっていくらでも変わりうる
>>546
簡単なのはこれ
inline void f(int x) { x;x; }
ただし最適化によって一時変数が追加されるかもしれないし、丸ごと消されるかもしれない
(intの評価に副作用がないのは明らかだから)
VCとGCCで最適化切って試してみたらどっちも1回だったな
今時の立派なコンパイラはこれくらいデフォでやっちゃうのかもしれない
しかし全てのコンパイラがそうしてくれる保証はない
0554デフォルトの名無しさん
2009/11/04(水) 18:32:540555デフォルトの名無しさん
2009/11/04(水) 18:45:02あなたのオレオレ規格はわかりました。
あなたがそれをどこで知ったのか、
その根拠を教えてください。
あるいは、
>しかし全てのコンパイラがそうしてくれる保証はない
そうしてくれないコンパイラをたった
ひとつ教えてくれるだけでもいいです。
0556デフォルトの名無しさん
2009/11/04(水) 18:57:23for_each の存在自体に疑問を感じて質問した次第です、その流れでこの度の最適化の議論にいたっているわけですが
実はそこが、知りたかった部分でもあります
最近この言語の深淵を感じるに、皆様方には周知の通りかと思うのですが
C/C++ の長所として、変数という定義において、即値と参照という二つのパラダイムがあるわけです、
しかしこれが逆に、この言語を難解にし、時代の変化を全て受け入れるがごとく、仕様とあいまって複雑にしているのではないかと感じている次第です。
0557デフォルトの名無しさん
2009/11/04(水) 19:03:12じゃあこう書いたら、g()は一度も呼ばれないわけか?
inline void f(int x) { }
0558デフォルトの名無しさん
2009/11/04(水) 19:11:23普通のC++98ですけど……
インラインの意味は7.1.2に書いてるな
で、当たり前だけど出来る限りアグレッシブに最適化しろだの何だのとは書いてない
そっちこそどの辺が根拠なの?
>>557
インライン展開されればそうだよ
0559デフォルトの名無しさん
2009/11/04(水) 19:20:06for_eachは気に入るか気に入らないかで使うかどうか判断していいレベルの物だと思う。
個人的には関数オブジェクト書くのが面倒なだけで使いたいと思わない。
forかboost::foreachを使う。
0560デフォルトの名無しさん
2009/11/04(水) 19:30:46色々と小細工しているから釣りにしか見えないんだけど。
釣りじゃないなら、>553や>557をちゃんと検証してご覧よ。
0561デフォルトの名無しさん
2009/11/04(水) 19:39:41どっちも最適化かかっちゃうらしくて1回になったけど
こいつらが賢すぎるだけだと思う
>>557も試してないけど多分1回だ
というか、そんなことはどうでもいいけど
どうしてそんなに、されるかどうかもわからない最適化に依存しきった話を
自信満々にそうなるはずだと言い切っちゃえるのかね?
コンパイラを常に完璧な最適化をする神様か何かと勘違いしてない?
0562デフォルトの名無しさん
2009/11/04(水) 19:40:32誰か試して
0563デフォルトの名無しさん
2009/11/04(水) 19:42:26最適化でさえないからだよ〜
0564デフォルトの名無しさん
2009/11/04(水) 19:44:45おかしいだろう
最適化かかるんなら >>557 は 0 回のはずだよね?
最適化かからないんなら >>553 は 2 回のはずだよね?
0566デフォルトの名無しさん
2009/11/04(水) 19:59:20fにgの実装がそのまま渡されるとするなら、fの仮引数の型とgの戻り値の型は一体なんなんだ?
型安全のある言語でそんな仕様考えられない。
0567デフォルトの名無しさん
2009/11/04(水) 20:19:34# 精度的な問題を除く。
インライン展開を何だと思っているんだろう……
0568デフォルトの名無しさん
2009/11/04(水) 20:19:38いい加減にスルーしろよw
0569デフォルトの名無しさん
2009/11/04(水) 20:24:030570デフォルトの名無しさん
2009/11/04(水) 20:45:07>When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of
>all function arguments (if any) which takes place before execution of any expressions or statements in the
>function body. There is also a sequence point after the copying of a returned value and before the execution of
>any expressions outside the function.
とあるので、関数がインラインかどうかに関わらず、実引数の評価は関数本体の式または
文の実行に先行する。つまり、関数の内側がどうなっていようと評価回数は変わらない。
1.9には他にも、実行結果は抽象機械の実行結果と等しくなければならない、と定めてあ
るから、この点でも、最適化によってインライン関数の挙動が異なりうる、という主張は正
しくない。
0571デフォルトの名無しさん
2009/11/04(水) 20:48:08でかした
後は妄想野郎が難癖を付けてきてもスルーな
0572デフォルトの名無しさん
2009/11/04(水) 21:04:00でそんなところの挙動が変わったら、それは
コンパイラのバグだから。
0573デフォルトの名無しさん
2009/11/04(水) 21:38:510574デフォルトの名無しさん
2009/11/04(水) 21:42:070575デフォルトの名無しさん
2009/11/04(水) 23:07:40min maxマクロの危険性と、<algorithm>内にあるmin max関数の件で
さっさと通り過ぎるものだよね。
一人で頑張ってる人は、min max関数にも、min maxマクロのあの
min(f(), g());
とかの危険があり得るという考えなわけだ。
そうならないのは、コンパイラが機転を利かせているからに過ぎないと。
0576デフォルトの名無しさん
2009/11/04(水) 23:28:040577デフォルトの名無しさん
2009/11/04(水) 23:47:45規格で必須の最適化だったとは知らなんだ
でも、これってつまりどんなに単純なC++コンパイラでも、インライン関数では必ずforを探して
使われてれば引数をキャッシュする最適化をやれと言ってるわけだよな
なんだかなぁ
0578デフォルトの名無しさん
2009/11/04(水) 23:50:540579デフォルトの名無しさん
2009/11/05(木) 02:41:01極論だがシンタックスシュガーのほうが近い。
わざわざ
Iter b(v.begin());
Iter e(v.end());
for_each(b, e, f);
と書かなくてもいいことを規格で保証しているだけ。
0580デフォルトの名無しさん
2009/11/05(木) 02:51:56ループを含む関数のような処理時間のかかる関数はインライン展開しても効果が薄いってのもあるけどな。
0581デフォルトの名無しさん
2009/11/05(木) 03:43:14579 も言ってるが >>526 のような展開は最適化の結果でもなんでもなく、
最も素直なインライン展開の実装。
わざわざ >>506 のような奇妙な式の移動を行う必要はまったく無い。
for があることでインライン展開されなくなることはあるだろうが、それはまったく別の理由。
0582デフォルトの名無しさん
2009/11/05(木) 04:34:17インライン展開とは、関数を実行したのと同じ「意味」になる処理を呼び出し側に埋め込んで
関数呼び出しのコストを無くすことであって、
「意味」を変えないためには>>526のようなことが必要になる。
これは最低限の自分の存在理由を満たしているだけであって、「最適化」などではない。
一方、彼の考えるインライン展開は、引数として渡した「記述」を切り貼りして
コードの姿を組み立てて、それを呼び出し元に貼り付ける、というような物らしい。
でも、それはマクロがやってることだ。
マクロといえば、簡易的なLisp処理系を作って、強力と名高いLispのマクロを実装してみると、
このへん勉強になるかもね。
Lispの言葉でいうなら、C++の関数は「引数はすべて評価してから関数に渡される」。
つまり f(g(), h());の時、fが受け取る(そして扱う)のは「g()の戻り値」と「h()の戻り値」。
だからインライン展開するにあたって、>>526のようにすることでそれを実現する。
それに対して、Lispのマクロは「引数を評価せずに渡し、戻り値で呼び出し側を置き換える」。
こっちが彼の考えるインライン展開に近い。
0583デフォルトの名無しさん
2009/11/05(木) 05:05:250584デフォルトの名無しさん
2009/11/05(木) 05:34:260585デフォルトの名無しさん
2009/11/05(木) 08:39:09> でも、これってつまりどんなに単純なC++コンパイラでも、インライン関数では必ずforを探して
> 使われてれば引数をキャッシュする最適化をやれと言ってるわけだよな
インラインであろうと無かろうと、関数内にforがあろうとなかろうと、引数は全てキャッシュ(というか一時変数への保存?が)される。
それがC言語からの関数呼び出し構文の意味。
わざわざforを探す必要はない。常にそういうコードを生成すればいい。
>>570 によれば引数の評価は関数の実行より先にしなければならないのだから、
評価した結果を(実際に使われるまでの間)どこかに取っておかなければならないことは必然。
ループの中で毎回評価するようなことは以ての外。
0586デフォルトの名無しさん
2009/11/05(木) 08:47:57Lispの話は蛇足。
自分が言いたいだけだろ…。
0587デフォルトの名無しさん
2009/11/07(土) 02:35:29・値渡しと名前渡しをごっちゃにしちゃいかんよ。
C++に名前渡しは無い。インラインだろうが値渡しとして処理される。
・仮引数と実引数をごっちゃにするな。
関数呼び出しに関係するのは実引数の方。
・値渡しは関数を呼び出す前に一度だけ評価される。
0588デフォルトの名無しさん
2009/11/07(土) 09:52:05名前渡しってなんだよ!?
0589デフォルトの名無しさん
2009/11/07(土) 09:59:49知ったかは何か書くことで満足を得ている人種なんだから・・・
0590デフォルトの名無しさん
2009/11/07(土) 10:04:52知らないなら調べればいいじゃん。恥ずかしい子達だな。っていうか一人かな。
0591デフォルトの名無しさん
2009/11/07(土) 10:36:300592デフォルトの名無しさん
2009/11/07(土) 11:07:04そこまで知っていろというのも酷かと^^
しらべりゃいーじゃんというのには同意だがw
0593デフォルトの名無しさん
2009/11/07(土) 11:10:34ここはSTLのスレだからC++の話でしょうに
0594デフォルトの名無しさん
2009/11/07(土) 11:37:29f(1+1)
でfに1+1がわたるか2がわたるかだよね
1+1がわたるのは遅延評価/非正格とかの場合、Haskellが有名
C++は多くの言語と同じように、正格で遅延評価を行わない言語
つまり実引数は関数呼び出しの前に評価され、関数fには2が渡る
これはインライン関数でも同じ
でもこれってインライン関数を習うときにまっさきに知るようなことでないの
インライン関数はふつうの関数と同じようにつかえて、マクロみたいに実引数が
意図せず複数回評価されたりする危険性がないのがウリですってさ
0595デフォルトの名無しさん
2009/11/07(土) 11:43:25ひつようがなければそもそも実引数を評価しないし
同じ引数はmemoizeして何度も不要な評価をしないようにしているのだと思った
>>587がALGOLのcall by nameを持ち出しているのは、1+1を渡して
かつ非効率なものの例なんだとおもう
Haskellのはcall by needとかいうんだよね
まあよくしらんけどw
0596デフォルトの名無しさん
2009/11/07(土) 13:08:45調べる努力ぐらいしようぜ。昔みたいに本読まなきゃ情報得られない時代でもないんだからよ。
ゆとり教育はそういった努力を教える仕組みだったはずなんだがなぁ……
細かいところは>594-595の言う通りですな。
インライン関数だとしても呼び出し元からすれば普通の関数と同じように見える。
0597デフォルトの名無しさん
2009/11/07(土) 13:20:55だからなんでスレ違いの話をするのかって聞いてるの
0598587
2009/11/07(土) 13:46:35上のぐだぐだのコメントも理解力の足らない間抜けが引っ掻きまわしているだけだし、
最近のコメントは全部スレ違いなんだろうね。
0599デフォルトの名無しさん
2009/11/07(土) 13:58:06罪悪感ゼロかよ
終わってるな
0600デフォルトの名無しさん
2009/11/07(土) 14:01:02このやりとりは終わるんだよボケが
0601587
2009/11/07(土) 14:23:28>506で C++では ありえない インライン てんかいを しているんだけど、 これは なまえわたしという
とくしゅな ひきすうわたしに なるんだ。
マクロなんかは じっしってきに なまえわたしと おなじような きょどうに なることが あるけれど、
かんすうよびだしは あたいわたしか さんしょうわたししかできないんだ。
インラインかんすうであっても あたいわたしか さんしょうわたしになるから、
>506のかいしゃくは ありえないんだよね。
くわしくは えいごだけど、>570を よんでみよう!!
にほんごばんも あるよ。
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1
他の人がさんざん説明している内容なんだけどなあ。
一向に理解しようとしないウスラボケが戯言を繰り返しているんだろうね。
0602デフォルトの名無しさん
2009/11/07(土) 16:03:300603デフォルトの名無しさん
2009/11/07(土) 16:09:36派遣切りにあったITドカタと
最初から働く気のないニートがせめぎあっているからですね?^^
0604デフォルトの名無しさん
2009/11/07(土) 17:57:310605デフォルトの名無しさん
2009/11/07(土) 18:05:24ここはSTLのスレだぜ
0606デフォルトの名無しさん
2009/11/07(土) 20:18:17ムカついたから厳格になって閉め出してやれ、って感じ?
まず、言語の話ですらない感情論全開の自分のレスに厳格になれよ。
0607デフォルトの名無しさん
2009/11/07(土) 20:39:14その文を読んで誰が得するのか
>506が読むとなんか変わるのか
もう一度考えてから氏ね
0608デフォルトの名無しさん
2009/11/07(土) 20:56:14お前のそのレスでしょ? 誰も得しないし何も変わらないのは。
なんで明後日の方向にズレてるばかりか、自分にだけ寛大なの?
0609デフォルトの名無しさん
2009/11/07(土) 21:16:470610デフォルトの名無しさん
2009/11/07(土) 21:46:370611デフォルトの名無しさん
2009/11/16(月) 00:07:230612デフォルトの名無しさん
2009/11/17(火) 22:07:30STLというかC++ってどうやって関数の仕様調べるんだろ?
Cだとprintf調べたいとき、man printfってやれば
すぐに出るけど、C++でcoutとか調べたいとき
手元に本かネットがないとつらい。
みんなどうしてるんだ?ヘッダー見てるの?
ちなみにLinuxなのでMSDNはなしです。
0613デフォルトの名無しさん
2009/11/17(火) 23:38:040614デフォルトの名無しさん
2009/11/17(火) 23:55:08ISO/IEC 14882/2003 または JISCX3014
0615デフォルトの名無しさん
2009/11/18(水) 01:09:28perlと格闘してようやくインストールできた。
こんなのが欲しかったんよ
ていうか、perlってこんなことが簡単にできることに驚いた。
>>614
JISはダウンロードして閲覧できないんだな。。。
言語仕様とか調べるときはよさそう。
0616デフォルトの名無しさん
2009/11/18(水) 15:17:39昔は出来たんだがなごにょごにょすれば
でもどちらにしろ漢字コードではなくて単なるビットマップなので
検索が出来なくて非常に不便
0617デフォルトの名無しさん
2009/11/18(水) 17:30:54検索できるはずだよ
ただしひらがなカタカナ漢字のみ。英数字はダメ
0618デフォルトの名無しさん
2009/11/18(水) 19:23:26Dinkumware サイトのマニュアル(ttp://www.dinkumware.com/manuals/default.aspx) を
必死に読んでたりしたが cppref 便利過ぎる
>>613 ありがとう
0619デフォルトの名無しさん
2009/11/18(水) 22:32:16MSDNオンライン
0620デフォルトの名無しさん
2009/11/19(木) 02:53:42もうsgi accumulateとかしなくて済むのか
0621デフォルトの名無しさん
2009/11/24(火) 12:55:39初期化するとiteratorの中にiteratorのある構造になってしまうとおもうんですが。
それでいいんですか?
0622デフォルトの名無しさん
2009/11/24(火) 13:50:08もう少し日本語でおk
0623デフォルトの名無しさん
2009/11/24(火) 14:02:050624デフォルトの名無しさん
2009/11/24(火) 14:12:52>vectorのiteratorのコピーコンストラクター
「イテレータを引数にとる vector のコンストラクタ」
ではなさそうだな。何だろう…
0625デフォルトの名無しさん
2009/11/24(火) 14:14:44vector::iterator=vector.begin();
0626デフォルトの名無しさん
2009/11/24(火) 14:38:09iの中にイテレータそのものが入るのではなくiの各メンバ変数にv.begin()のメンバ変数がコピーされるだけだが。
0627デフォルトの名無しさん
2009/11/24(火) 14:40:16ポインターの場合はメンバー変数が無い場合もあるからね。
0628デフォルトの名無しさん
2009/11/24(火) 16:37:38そういう意味でなら
> iteratorの中にiteratorのある構造
も当たり前のことをいってるだけだな。
0629デフォルトの名無しさん
2009/11/24(火) 16:40:100630デフォルトの名無しさん
2009/11/24(火) 16:46:44ポインターじゃなかった。いつから変わったんだろうか。
0631デフォルトの名無しさん
2009/11/24(火) 16:58:100632デフォルトの名無しさん
2009/11/24(火) 17:11:04その本はいますぐ燃やしてください。^^
規格票にはvectorのイテレータがポインタでなければならないとは書いてないし
Effective C++にもそうじゃないケースがあるよって書いてます。
0633デフォルトの名無しさん
2009/11/24(火) 17:12:08あと、本を燃やす前に本の名前と著者をさらしてくれると
二度と一生その人の著書を読まなくてすむので助かります^^
0634デフォルトの名無しさん
2009/11/24(火) 17:14:47この本です。インチキが書いてあるなんて知りませんでした。
速くこの本を燃やして他の本に乗り換えたいです。
0635デフォルトの名無しさん
2009/11/24(火) 17:23:030636デフォルトの名無しさん
2009/11/24(火) 17:37:010637デフォルトの名無しさん
2009/11/24(火) 17:38:52日本語版にはそんなアホな記述ないもの。
つまり、君が英語読めてないだけ。
0638デフォルトの名無しさん
2009/11/24(火) 17:52:02ポインタ扱いにして高速化する指令方法があったような気もするが
0639デフォルトの名無しさん
2009/11/24(火) 18:01:34ストリングとベクトルはポインターを返すから一時変数に++は使えないと書いてある。
0640デフォルトの名無しさん
2009/11/24(火) 18:17:530641デフォルトの名無しさん
2009/11/24(火) 18:18:550642デフォルトの名無しさん
2009/11/24(火) 18:54:28ホントにそんな断定なのか?
0643デフォルトの名無しさん
2009/11/24(火) 18:55:47もしかして、俺が英語を読み取れてないのかも。
該当箇所を引用してもらってよいですか?
0644デフォルトの名無しさん
2009/11/24(火) 18:59:34C++ Builderだと6まではポインタだった。2006になってポインタじゃなくなった。
6まではSTLがSTLPortだったのが,2006からdinkumware製になって実装が変わったから。
いずれにしろポインタであることを期待してコーディングするのはまずいと思う。
0645デフォルトの名無しさん
2009/11/24(火) 19:34:370646デフォルトの名無しさん
2009/11/24(火) 19:51:47非常に困ることになるんじゃないでしょうか。
0647デフォルトの名無しさん
2009/11/24(火) 20:01:02なぜなら、vectorのイテレータはランダムアクセスイテレータとして扱わなければならず
そう扱っている限り、それがクラスでもポインタでも同じだから。
0648デフォルトの名無しさん
2009/11/24(火) 20:04:160649デフォルトの名無しさん
2009/11/24(火) 23:08:160650デフォルトの名無しさん
2009/11/25(水) 05:02:110651デフォルトの名無しさん
2009/11/25(水) 20:52:470652デフォルトの名無しさん
2009/11/25(水) 21:07:340653デフォルトの名無しさん
2009/12/01(火) 16:03:09・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
このページもう無いの?どこかに移動しただけ?
サンプルがあって好きだったんだが…(´・ω・`)
0654デフォルトの名無しさん
2009/12/01(火) 16:33:390655デフォルトの名無しさん
2009/12/01(火) 17:01:16やめたそうだ
ttp://d.hatena.ne.jp/sumi_wakhok/20090903/p4
0656デフォルトの名無しさん
2009/12/01(火) 19:51:53日本語でそこそこわかりやすかったのに残念。
0657デフォルトの名無しさん
2009/12/02(水) 17:27:570658デフォルトの名無しさん
2009/12/03(木) 11:37:19このホームページで配列のサイズを+1個多く作っているけど
必要なんですか?
その配列にアクセスしなければ問題なくないですか?
0659デフォルトの名無しさん
2009/12/03(木) 11:45:550660デフォルトの名無しさん
2009/12/03(木) 11:47:25http://www5c.biglobe.ne.jp/~ecb/cpp/07_20.html
こっちを見てください。
0661デフォルトの名無しさん
2009/12/03(木) 11:57:58リンク先は見てないけど
規格上、長さnの配列aに対してa[n]へのポインタ値(a+n)を扱うのは問題ないです
ただし、そのポインタの参照はがし(*(a+n)とかa[n])はできません
0662デフォルトの名無しさん
2009/12/03(木) 12:10:46見たけど、必要ない
0663デフォルトの名無しさん
2009/12/03(木) 12:15:130664デフォルトの名無しさん
2009/12/03(木) 14:16:000665デフォルトの名無しさん
2009/12/03(木) 19:59:07aがoverload されてない組み込み型だったときでも
エラーになるか &a[n] !=(a+n)となる可能性は規格的に起こりうる?
0666デフォルトの名無しさん
2009/12/03(木) 20:22:28その場合&a[n]は&*(a + n)と同一視されて、このような式は(a+n)に置き換えられることが規定されてる
0667デフォルトの名無しさん
2009/12/04(金) 01:09:09「規定されてる」っていうと、 C++ 標準規格で?
該当箇所を挙げてもらえますか?
0668デフォルトの名無しさん
2009/12/08(火) 11:00:02普通の配列を渡すような場面で使っても問題はないのでしょうか?
たとえば以下のような例です
Point pt = { 0, 0 }; //struct Point { int x, y; }
std::vector<Point> v;
v.push_back(pt);
memcpy(buffer, &v[0], v.size()*sizeof(Point));
0669デフォルトの名無しさん
2009/12/08(火) 11:03:440670デフォルトの名無しさん
2009/12/08(火) 11:04:35その理解で問題ない。
ただ、注意点としてvのsizeが0のとき
&v[0]は不正だからそのチェックだけ忘れずに
0671デフォルトの名無しさん
2009/12/08(火) 11:12:01ありがとうございます
0672デフォルトの名無しさん
2009/12/08(火) 14:47:34ランダムアクセスが不要な場合は list を使えばいいとして
vector と deque の使いわけがよく分かりません
色々なソースを見ると、vector の使用頻度が高いように思えるのですが
要素の追加で再配置しなくていい分 deque の方がいいんじゃないですか?
0673デフォルトの名無しさん
2009/12/08(火) 14:51:210674デフォルトの名無しさん
2009/12/08(火) 14:53:18deque には vector には無い空間オーバーヘッドと速度オーバーヘッドがある。
vector で済むところに使えば無駄になることもある。
どちらが大きな問題になりやすいかと言えば vector の再配置だろうから、
ランダムアクセスコンテナとして deque を優先的に使うという話には一理ある。
0675デフォルトの名無しさん
2009/12/08(火) 15:01:49大きさを指定し、あまり拡張のない場合は vector の方がパフォーマンスがいいということですか
ありがとうございます、1つの基準にします
0676デフォルトの名無しさん
2009/12/08(火) 15:22:10・・・上級者にも多いとは言わないよね
0677デフォルトの名無しさん
2009/12/08(火) 15:37:07要素の追加も大抵上限や要素数わかってたりするからreserveで十分だし。
0678デフォルトの名無しさん
2009/12/08(火) 15:43:47でもコンテナの使用頻度的にはvector>deque>listかな。listが要る場合ってほとんどない。
0679デフォルトの名無しさん
2009/12/08(火) 15:46:02list > vector > deque
ランダムアクセス:
vector > deque
追加:
list > vector > deque
追加(サイズ変):
list > deque > vector
この認識であってる?
0680デフォルトの名無しさん
2009/12/08(火) 15:50:57vector > list
なのでは?
0681デフォルトの名無しさん
2009/12/08(火) 15:56:34シーケンシャルアクセル:
vector > deque >> list
ランダムアクセス:
vector > deque
追加:先頭:キャパシティ変更なし
list > deque >>> vector
追加:先頭:キャパシティ変更
list > deque >>> vector
追加(サイズ変):
list > deque > vector
>
> この認識であってる?
0682デフォルトの名無しさん
2009/12/08(火) 15:57:400683デフォルトの名無しさん
2009/12/08(火) 16:03:210684デフォルトの名無しさん
2009/12/08(火) 16:06:36こうじゃない?
シーケンシャルアクセス:
vector > deque >> list
ランダムアクセス:
vector > deque >>> list
挿入:先頭:キャパシティ変更なし
deque > list >>>> vector
挿入:先頭:キャパシティ変更あり
list >> deque >>>> vector
挿入:中間:キャパシティ変更なし
list >>> vector > deque
挿入:中間:キャパシティ変更あり
list >>>> vector > deque
挿入:末尾:キャパシティ変更なし
vector > deque > list
挿入:末尾:キャパシティ変更あり
list >> deque >>>> vector
0685デフォルトの名無しさん
2009/12/08(火) 16:14:360686デフォルトの名無しさん
2009/12/08(火) 16:21:33メモリ効率を度外視し、vector をほぼ固定配列として使える場合、
vector でなく deque にしかできないこと、使う理由ってありますか?
0687デフォルトの名無しさん
2009/12/08(火) 16:29:010688デフォルトの名無しさん
2009/12/08(火) 16:40:30いろいろ間違ってるだろ。
dequeはオブジェクトのメモリ領域がエレメント複数個をまとめてアロケートされるからvectorのキャパシティ変更に関わらず
挿入:先頭
list > deque >>>> vector
挿入:末尾
vector > deque >= list
挿入:末尾:キャパシティ変更あり
list >= deque >>>> vector
だしdequeは全てのエレメントが連続しているわけじゃないから実際には
挿入:中間
list > deque > vecto
しかも「キャパシティ変更」の有無でvector以外のクラスの順位が変わるのも変。
知ったかぶりはやめろ。
0689デフォルトの名無しさん
2009/12/08(火) 16:46:39既存の要素のコピーが発生せず、参照やポインタも無効化されない。
これは大きな利点だと思う。
0690デフォルトの名無しさん
2009/12/08(火) 16:49:35vector<bool>は満たさないという問題も。
速度に関しては実測せよとアレに書いてあったじゃろ?
そして、自信を持ってvectorを選択せよ、とも。
アレが何かわからない人には教えてあげません^^
0691デフォルトの名無しさん
2009/12/08(火) 16:52:39[ ][ deque ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] list
こういうことですか
deque はリストと同じような構造だと思ってました
0692デフォルトの名無しさん
2009/12/08(火) 16:58:06他の処理系は知らん。
0693デフォルトの名無しさん
2009/12/08(火) 17:08:340694デフォルトの名無しさん
2009/12/08(火) 17:54:17listの挿入はメモリ確保が生じるからキャパシティに余裕があるvector,dequeに対しては
挿入:先頭:キャパシティ変更なし
deque > list >>>> vector
挿入:末尾:キャパシティ変更なし
vector = deque > list
でいいだろ。
0695デフォルトの名無しさん
2009/12/08(火) 17:54:41極論言えば、むしろvectorがいらんぐらいだ。 vectorの利点はmemcpy()が使えるぐらいのもんだ
0696デフォルトの名無しさん
2009/12/08(火) 17:57:18ちゃんとソースを出すのだ。
ここは文系のカスプログラマが思い込みでクソ垂れる場所じゃないんで。
0697デフォルトの名無しさん
2009/12/08(火) 17:59:440698デフォルトの名無しさん
2009/12/08(火) 18:00:23特に(dequeやlistを使う)理由がないときはvector
先頭末尾への挿入削除が多い場合はdeque
中間への挿入削除が多い場合はlist
だった気がする
0699デフォルトの名無しさん
2009/12/08(火) 18:00:270700デフォルトの名無しさん
2009/12/08(火) 18:01:390701デフォルトの名無しさん
2009/12/08(火) 18:04:03実行時間の80%はこれらをソートしたりナメたり入れたり出したりしてんの?
0702デフォルトの名無しさん
2009/12/08(火) 18:07:56http://www.gotw.ca/gotw/054.htm
0703デフォルトの名無しさん
2009/12/08(火) 18:09:30vectorからdeque へのtypedef書き加えるだけでも、多くのケースで体感スピード上がるという話
0704デフォルトの名無しさん
2009/12/08(火) 18:11:33英語は読めないのでエスペラント語でお願いします。
0705デフォルトの名無しさん
2009/12/08(火) 18:20:580706デフォルトの名無しさん
2009/12/08(火) 18:21:190707デフォルトの名無しさん
2009/12/08(火) 18:34:10計測値で1.7倍程度速くなった。
アルゴリズム以前にアロケータでのメモリ確保処理の速度も考えたほうがよさげ
(vectorではこうはいかない)
0708デフォルトの名無しさん
2009/12/08(火) 18:35:2110000件近いデータを、数百〜数千件単位で頻繁に挿入・削除してるという使い方。
0709デフォルトの名無しさん
2009/12/08(火) 19:16:17それはとくにdequeが適する
場合なのでは?
万能コンテナなんか存在しない、
使い分けが大切、でFA。
0710デフォルトの名無しさん
2009/12/08(火) 19:18:01日本語なんて極東の小さな島国でしか使われていませんよ?
それのせいでコンピュータ関連の書籍が
日本語になるのは世界から1,2年遅れていて、
プログラマになったばかりの小学6年生が学習書にも困る有様です。
まったく持ってIT後進国です。
0711デフォルトの名無しさん
2009/12/08(火) 19:18:570712デフォルトの名無しさん
2009/12/08(火) 19:22:23>1バイトでもメモリ使用量を減らしたい
フラグメを考えると、使用量は逆に
意外と増えがち。
vectorのオススメは
○reserve()できるとき。
○挿入が少なく、参照が多いとき。
だろう。
0713デフォルトの名無しさん
2009/12/08(火) 19:23:42vector<CLS*>かdeque<CLS*>かlist<CLS*>の方がよさげ
構造体をまるまる挿入するのが負荷が掛かるから。
0714デフォルトの名無しさん
2009/12/08(火) 19:25:13状況が許すならそれも高速、安価で便利^^
0715デフォルトの名無しさん
2009/12/08(火) 19:25:16垂直方向は参照回数少ないからそんなに遅くならないと思ったのに。
0716デフォルトの名無しさん
2009/12/08(火) 19:26:12どれだけ巨大でも4バイトの挿入だけ。
0717デフォルトの名無しさん
2009/12/08(火) 19:26:360718デフォルトの名無しさん
2009/12/08(火) 19:29:40Googleメモリ確保使うと良いよ。
ソースコードの変更無しで最適化出来る。
しかし、メモリ確保でボトルネックになっているのは
ほとんど処理してないって事。
もともとのソースがへぼってこと。
0719デフォルトの名無しさん
2009/12/08(火) 20:36:40,, -──- 、._
.-"´ \.
:/ _ノ ヽ、_ ヽ.:
:/ o゚((●)) ((●))゚oヽ:
:| (__人__) |:
:l ) ( l:
:` 、 `ー' /:
:, -‐ (_). /
:l_j_j_j と)丶─‐┬.''´
:ヽ :i |:
:/ :⊂ノ|:
0720デフォルトの名無しさん
2009/12/08(火) 21:50:33「定量化できないものは評価できない」
0721デフォルトの名無しさん
2009/12/09(水) 01:23:060722デフォルトの名無しさん
2009/12/09(水) 01:32:23無能なドカタが、実生活では絶対不可能な上から目線を楽しみに来てる時とかは
まじめな議論にはならんが、いつもそうと決まったわけでもない。
0723デフォルトの名無しさん
2009/12/09(水) 05:12:040724デフォルトの名無しさん
2009/12/09(水) 05:19:59速度は気にしないならいつでも使える。
dequeもそう。
基本はvectorとstringだな。
これでも使い方次第でパフォーマンスが落ちるが。
0725デフォルトの名無しさん
2009/12/09(水) 05:22:03これがかなりくせ者。
自前で確保したなら50Mで済むところが
自動だと100M確保したりする。
0726デフォルトの名無しさん
2009/12/09(水) 05:24:16fileをHDDに記録するように分断しつつvectorの機能も使えるやつ
0727デフォルトの名無しさん
2009/12/09(水) 05:32:260728デフォルトの名無しさん
2009/12/09(水) 05:43:020729デフォルトの名無しさん
2009/12/09(水) 06:14:07構造的にFATと似てるので、HDDと同じような
索引テーブル上の再配置しかしないのじゃないかと思う。
0730729
2009/12/09(水) 06:31:550731デフォルトの名無しさん
2009/12/09(水) 08:24:56mapの使いどころは簡単。
キー検索を多用するときだろ。
0732デフォルトの名無しさん
2009/12/09(水) 08:32:18それは実装によるんだろうが、じゃあ
どんなアルゴリズムがいいのか、
というと、難しいだろう。
アロケータみたいに、テンプレート
型引数で、容量拡張方法を設定
できてもいいのにね。
0733デフォルトの名無しさん
2009/12/09(水) 18:48:250734デフォルトの名無しさん
2009/12/09(水) 23:11:45要素追加: O(n)
要素削除: O(n)
ランダムアクセス: O(1)
list
要素追加: O(1)
要素削除: O(1)
deque
末端要素追加: O(1)
末端要素削除: O(1)
中間要素追加: O(n)
中間要素削除: O(n)
ランダムアクセス: O(1)
0735デフォルトの名無しさん
2009/12/09(水) 23:25:50毎回1マイクロ秒でも定数だし
毎回100000000000時間でも定数には違いない。
0736デフォルトの名無しさん
2009/12/09(水) 23:30:12vectorの存在価値ないな
0737デフォルトの名無しさん
2009/12/10(木) 00:41:02> vectorの存在価値ないな
>>735がいってるようにランダムアクセスO(1)でもvectorとdequeでは実際に要する時間は違う。
0738デフォルトの名無しさん
2009/12/10(木) 01:13:020739デフォルトの名無しさん
2009/12/10(木) 01:40:21要するにstackとqueue用
でも遅すぎるので誰も使わない
0740デフォルトの名無しさん
2009/12/10(木) 01:41:570741デフォルトの名無しさん
2009/12/10(木) 02:04:09何でだろう?
0742デフォルトの名無しさん
2009/12/10(木) 03:00:53これって仕様に明記されてたっけ?
0743デフォルトの名無しさん
2009/12/10(木) 03:06:09というかO(n)はデタラメで本当は別の定義がなされているからな
たまにとんでもなくコストが掛かるぜ
0744デフォルトの名無しさん
2009/12/10(木) 21:16:190745デフォルトの名無しさん
2009/12/10(木) 21:28:370746デフォルトの名無しさん
2009/12/10(木) 22:29:340747デフォルトの名無しさん
2009/12/10(木) 22:40:58意味不明というほどではないが
0748デフォルトの名無しさん
2009/12/10(木) 22:53:10戻り値も正しくは返却値って言うんだってね。
知らんかった。
0749デフォルトの名無しさん
2009/12/11(金) 01:23:57「償却定数〜」じゃないと意味わかんないってば。
0750デフォルトの名無しさん
2009/12/11(金) 01:24:01償却でも別にいいと思うけどね
「戻り値」や「フレンド関数」と同じくらい何を指してるか明白だと思う
こないだC++相談室で見た「テンプレートクラス」は謎杉だと思った
誰だよ考えたやつ
0751デフォルトの名無しさん
2009/12/11(金) 03:08:11なにが謎なの?
0752デフォルトの名無しさん
2009/12/11(金) 10:09:310753デフォルトの名無しさん
2009/12/11(金) 12:11:26テンプレートクラス:Hoge<int>
?
0754デフォルトの名無しさん
2009/12/11(金) 13:18:05それに沿えば>>753のどこに謎があるんだ?。
0755デフォルトの名無しさん
2009/12/11(金) 21:18:23言葉のうえで
戻り値が returns を指し、フレンドが friend を指すってのは理解できるが
テンプレートクラスが instantiated class を指すってのはちょっと理解できないな
JISにもそんな言葉はない(実は1箇所あるんだけどねw)
もちろん、>>752-754のような想像をすることはまったく難しいことではないし、
JISの具現されたクラスの代替が欲しい気持ちも分かる
謎なのは instantiated class からどうやってテンプレートクラスっていう言葉を生み出したのかってこと
たとえば、禿が「instantiated classよりもtemplate classのほうがよくね?」って言ったなら謎はそれで解決
そもそも>>751-754はどこでその言葉を覚えたのかが気になる。できれば教えて欲しい
0756デフォルトの名無しさん
2009/12/11(金) 21:23:00class ...
テンプレートクラスって読みたくなるだろ?
0757デフォルトの名無しさん
2009/12/11(金) 21:33:22それはクラステンプレートだろww
0758デフォルトの名無しさん
2009/12/11(金) 21:35:01関数テンプレート
メンバ関数テンプレート
0759デフォルトの名無しさん
2009/12/12(土) 01:39:56> そもそも>>751-754はどこでその言葉を覚えたのかが気になる。できれば教えて欲しい
なんで>>751-754がその言葉を以前にどこかで覚えていたということが確定事項なんだ?
>>752は推測を書いてるだけだし>>754は単語の意味論で素直に推測をした場合には>>753が書いた具体例に問題は見つからないと書いてるだけのようだが。
そんなことはたった今知ったばかりの言葉についても書けるだろ。
0760デフォルトの名無しさん
2009/12/12(土) 02:15:40確かにそうだな
0761デフォルトの名無しさん
2009/12/12(土) 02:31:45Stroustrupだって、template classという言い回しは使うし。
ttp://www2.research.att.com/~bs/glossary.html
Stroustrupが間違ってるというなら、俺は何も言えない。
0762デフォルトの名無しさん
2009/12/12(土) 04:10:590763デフォルトの名無しさん
2009/12/12(土) 04:50:48俺はC++3rdでそう学習したけど。
っていうか今の今まで、他に呼び方が存在するなんて思ったこともなかった。
0764デフォルトの名無しさん
2009/12/12(土) 10:17:03template function とかもあるね
そりゃ日本人も外人も適当に名詞化するわなあ
0765デフォルトの名無しさん
2009/12/12(土) 11:07:33規格にない俗語でもより本質に近い言葉があればそっちのほうを使いたくなるわな。
0766デフォルトの名無しさん
2009/12/12(土) 17:18:150767デフォルトの名無しさん
2009/12/12(土) 18:28:16beginとendが一緒になってしまって
STLコンテナには成れなかったでござる
0769デフォルトの名無しさん
2010/01/09(土) 13:09:42*begin == *end かつ begin != end なイテレータにすれば?
余計なフラグを持つことになってオーバーヘッドになりそうだけど
循環参照リストにするからには
circular<int> c;
// 10個くらいpush_back
std::vector<int> v(c.begin() + 5, c.begin() + 5);
みたいな使い方もしたくて、
begin != end にしても無理だと思う。
0771デフォルトの名無しさん
2010/01/09(土) 14:04:25例えば、inc/decされていない同士の比較は常にfalseを返すとか。
要素数0のときはちょっと考えないといけないが。
0772デフォルトの名無しさん
2010/01/09(土) 14:13:01おいといて、begin,endをオフセットさせるメンバとか、内容でなく移動距離で比較するイテレータとか用意すれば?
circular<int> c;
// 10個くらいpush_back
c.setiteroffset(5);
std::vector<int> v(c.begin(), c.end());
std::vector<int> v((c.begin()+5).resetmove(), c.distanceiter(c.size()));
考えてもらって大変申し訳ないんだが、
STLコンテナに成れなかっただけで
独自仕様のコンテナとしては完成してるんだ。
具体的な実装は
http://www.cgal.org/Manual/3.3/doc_html/Developers_manual/Developers_manual/Chapter_iterators_and_circulators.html
これに似た感じになってる。
0774デフォルトの名無しさん
2010/01/17(日) 18:51:42{
C(char*psz){};
C(int n){};
};
とすると、
C c[]={"hogehoge",0xaf0};
と設定できますが、
std::vetor<C> vc={"hogehoge",0xaf0};
と設定出来ないのは何故でしょうか?
設定する方法などがあればご教授願いたいのですが。
0775774
2010/01/17(日) 18:53:46×>vetor
○>vector
0776デフォルトの名無しさん
2010/01/17(日) 18:55:46現行の規格では = {...} によるクラス型の初期化を定義する方法が無いから。
次の規格改訂で可能になる。
0777デフォルトの名無しさん
2010/01/25(月) 22:26:420778デフォルトの名無しさん
2010/01/25(月) 22:39:47typename void add_range(Dest& dst, Iterator first, Iterator last) {
for(; first != last; first++) dst += *first;
};
0779デフォルトの名無しさん
2010/01/25(月) 22:40:28#include <numeric>
std::accumulate()
0780デフォルトの名無しさん
2010/01/25(月) 22:46:350781デフォルトの名無しさん
2010/01/31(日) 00:31:44{
for( Particles::iterator pj = ps->begin(); pj != ps->end(); ++pj)
{
・・・
}
}
このようにイテレータを作っているのですが、このままでは範囲がΣi(0〜N)Σj(0〜N)というふうに計算されるのですが
Σi(0〜N-1)Σj(i+1〜N)というふうに計算するにはどうおけばよいのかわからないので質問させていただきます。
0782デフォルトの名無しさん
2010/01/31(日) 00:46:54{
for( Particles::iterator pj = pi; pj != ps->end(); ++pj)
{
・・・
}
}
0783デフォルトの名無しさん
2010/01/31(日) 00:57:05ありがとうございます。
試してみます
0784デフォルトの名無しさん
2010/01/31(日) 01:06:50pj = pi + 1 じゃなくていいの?
0785デフォルトの名無しさん
2010/01/31(日) 07:45:33ランダムアクセス不可ならstd::advance必須
0786デフォルトの名無しさん
2010/01/31(日) 08:53:370787デフォルトの名無しさん
2010/01/31(日) 08:59:280789デフォルトの名無しさん
2010/02/01(月) 00:57:400790デフォルトの名無しさん
2010/02/01(月) 13:37:47{
for( Particles::iterator pj = ps->begin(); pj != ps->end(); ++pj)
{
if(pi >= pj) continue;
・・・
}
}
で解決しました
0791デフォルトの名無しさん
2010/02/01(月) 22:04:100792デフォルトの名無しさん
2010/02/01(月) 22:59:55> 14882:2003 24.3.4p1
> Since only random access iterators provide + and - operators, the library provides two function templates
> advance and distance. These function templates use + and - for random access iterators (and are,
> therefore, constant time for them); (後略)
ってことでちゃんと別処理だね。
0793デフォルトの名無しさん
2010/02/02(火) 14:12:46関数テンプレートに前進と間隔を提供する。
それらの関数テンプレートは+と-をランダムアクセスイテレーターのために使う。
その結果それらの為にそれらの関数テンプレートは定数時間です。
0794デフォルトの名無しさん
2010/02/02(火) 14:18:220795デフォルトの名無しさん
2010/02/02(火) 14:19:590796デフォルトの名無しさん
2010/02/02(火) 14:31:210797デフォルトの名無しさん
2010/02/02(火) 14:57:02もう一つはどこでしょうか。
0798デフォルトの名無しさん
2010/02/02(火) 21:21:300799デフォルトの名無しさん
2010/02/03(水) 04:01:060800デフォルトの名無しさん
2010/02/04(木) 05:11:30VC9は
template<class _Iter> inline
typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&)
{
typename iterator_traits<_Iter>::iterator_category _Cat;
return (_Cat);
}
template<class _InIt, class _Diff> inline
void advance(_InIt& _Where, _Diff _Off)
{
_Advance(_Where, _Off, _Iter_cat(_Where));
}
template<class _FI, class _Diff> inline
void _Advance(_FI& _Where, _Diff _Off, forward_iterator_tag);
以下input,bidirectional,random_access
だった。
0801デフォルトの名無しさん
2010/02/04(木) 05:43:36やっぱりiterator_categoryをタグにして特殊化してるんだね。
自作イテレーターの場合に気をつけよう。
0802デフォルトの名無しさん
2010/02/04(木) 20:00:22Javaで言うところのこういうやつ。
ttp://java.sun.com/j2se/1.5.0/ja/docs/ja/api/
0803デフォルトの名無しさん
2010/02/04(木) 20:06:21色々と間違ってるが
0804デフォルトの名無しさん
2010/02/04(木) 23:57:40一番正確なのは規格書。
日本語がいいなら、まだ不完全だけど、今ならここかな?
http://www.cppreference.com/wiki/jp/
0805デフォルトの名無しさん
2010/02/05(金) 09:11:00両者ありがとう!!!
感謝感激!!!
0806デフォルトの名無しさん
2010/02/05(金) 19:00:53簡単にかけるようなアルゴリズムってある?
(forallみたいなの)
0807デフォルトの名無しさん
2010/02/05(金) 19:03:090808デフォルトの名無しさん
2010/02/05(金) 19:03:560809デフォルトの名無しさん
2010/02/05(金) 19:05:42そういうんじゃなくて
struct NEG{
bool operator()(int n){return n<0;}
};
こういう関数オブジェクトがあれば
forall(v.begin(),v.end(),NEG());
こんな感じで呼び出せばtrueがかえる、みたいな感じの
0810デフォルトの名無しさん
2010/02/05(金) 19:31:540811デフォルトの名無しさん
2010/02/05(金) 19:51:460812デフォルトの名無しさん
2010/02/06(土) 03:51:150813デフォルトの名無しさん
2010/02/06(土) 08:12:31とりあえず全データANDしておいて
最後にMSBだけチェックした方が
全体のコストが減るのでは?
0814デフォルトの名無しさん
2010/02/06(土) 08:26:150815デフォルトの名無しさん
2010/02/06(土) 08:37:450816デフォルトの名無しさん
2010/02/06(土) 08:46:10処理系やデータによるとしか。
例えば、できるだけ早く探索を打ち切ったほうが、キャッシュミスが減って速くなるかもしれない。
例えば、処理するデータの正数出現率に片寄りがあるかもしれない。
0817デフォルトの名無しさん
2010/02/09(火) 18:54:180818デフォルトの名無しさん
2010/02/09(火) 19:19:090819デフォルトの名無しさん
2010/02/09(火) 19:33:300820デフォルトの名無しさん
2010/02/13(土) 03:44:410821デフォルトの名無しさん
2010/02/14(日) 15:28:11bind3rdってないんですよね
struct sorter:binary_function<T,T,bool>{
bool operator()(const T&lhs,const T&rhs)const{
return distance(lhs,x)<distance(rhs,x); //このxを第3のパラメータにしたい
}
};
//こんな感じで使いたかった
sort(v.begin(),v.end(),bind3rd(sorter(),v[0]));
こういう場合いい方法ってありますか?
0822デフォルトの名無しさん
2010/02/14(日) 15:34:380823デフォルトの名無しさん
2010/02/14(日) 16:45:07struct sorter:binary_function<T,T,bool>{
const T &t_;
sorter( const T &t ) : t_(t){}
bool operator()(const T &lhs, const T &rhs) const{
return distance( lhs, t_ ) < distance( rhs, t_ );
}
};
sort( v.begin(), v.end(), sorter(v[0]) );
0824デフォルトの名無しさん
2010/02/14(日) 20:19:340825デフォルトの名無しさん
2010/02/15(月) 00:37:58ファンクター内で凝った副作用をさせないようにね。
0826デフォルトの名無しさん
2010/02/15(月) 23:23:160827デフォルトの名無しさん
2010/02/15(月) 23:38:190828デフォルトの名無しさん
2010/02/16(火) 01:16:290829デフォルトの名無しさん
2010/02/16(火) 01:26:390830デフォルトの名無しさん
2010/02/18(木) 00:34:47なんとかしろや
0831デフォルトの名無しさん
2010/02/18(木) 01:42:19速度クリティカルなところでsprintfなんて使うな
0832デフォルトの名無しさん
2010/02/18(木) 02:14:090833デフォルトの名無しさん
2010/02/18(木) 03:33:02そもそも速度が要求される所で、文字列をこねくり回すのが間違い?
0834デフォルトの名無しさん
2010/02/18(木) 06:37:16デバッグや速度必要なところでは使うなよ
0835デフォルトの名無しさん
2010/02/18(木) 06:44:420836デフォルトの名無しさん
2010/02/18(木) 06:47:100837デフォルトの名無しさん
2010/02/25(木) 20:38:11T::container_categoryでできますが、イテレータ型を受け取る場合は同じことって不可能でしょうか?
0838デフォルトの名無しさん
2010/02/25(木) 23:40:360839デフォルトの名無しさん
2010/02/26(金) 09:53:120840デフォルトの名無しさん
2010/02/26(金) 10:24:560841デフォルトの名無しさん
2010/02/26(金) 17:43:17例えばイテレータの実装が単にポインタだったらコンテナは?
0842デフォルトの名無しさん
2010/02/26(金) 19:49:020843デフォルトの名無しさん
2010/02/27(土) 02:10:41ってのがあんまり意味が呑み込めないというか
iterator_categoryみたいにタグディスパッチでオーバーロードするって話なのか?
ってかcontainer_categoryってSTLにあったっけ?
boostのcontainer_traitsでそんなようなのものを見た記憶があるけど
0844デフォルトの名無しさん
2010/03/04(木) 10:42:40std::set<std::string>を使おうとすると、どうしてもエラーになってしまいます。
std::set<std::string> s;
s.insert("1");
setとstringは組み合わせられないのでしょうか?
set<int>などは普通に使えているのですが…。
環境はVS2008です。
0845デフォルトの名無しさん
2010/03/04(木) 10:45:150846デフォルトの名無しさん
2010/03/04(木) 10:47:42STLのエラーメッセージはわかりづらいよ…(自分が悪い)
0847デフォルトの名無しさん
2010/03/06(土) 12:32:45tを入力しなくてもよいように出来たりしますか?
#define SHOW(v,t,sep) copy((v).begin(),(v).end(),ostream_iterator<t>(cout,sep));cout << endl
0848デフォルトの名無しさん
2010/03/06(土) 13:03:46void Show(const T &v, const std::string &sep)
{
std::copy(v.begin(), v.end(), std::ostream_iterator<typename T::value_type>(std::cout, sep.c_str()));
std::cout << std::endl;
}
0849デフォルトの名無しさん
2010/03/06(土) 13:36:09セミコロンをカンマに変えないと下のように書いたとき
意図しない動作になるよ
if(〜) SHOW(〜);
0850デフォルトの名無しさん
2010/03/06(土) 20:01:230851デフォルトの名無しさん
2010/03/06(土) 22:10:19とても参考になりました、ありがとうございますAll
0852デフォルトの名無しさん
2010/03/07(日) 16:12:09前方と後方に自由に進めるならランダムアクセスできると思います。
0853デフォルトの名無しさん
2010/03/07(日) 16:13:390854デフォルトの名無しさん
2010/03/07(日) 16:19:39あえて出来ないようにして何か得があるんですか?
0855デフォルトの名無しさん
2010/03/07(日) 16:24:03単に[]演算子を提供してないだけで、
それはわざとそういう設計になってる
0856デフォルトの名無しさん
2010/03/07(日) 16:27:21特定の利用ケースでそのほうが便利なのであれば、ランダムアクセスできるかのような
インターフェースをかぶせることはプログラマの自由。
一般的には、計算量を無視することは不適切。
0857デフォルトの名無しさん
2010/03/07(日) 16:34:12ランダムアクセスと双方向イテレーターを分ける
計算量ってどれくらいですか?
0858デフォルトの名無しさん
2010/03/07(日) 16:55:220859デフォルトの名無しさん
2010/03/07(日) 16:56:030860デフォルトの名無しさん
2010/03/07(日) 17:08:050861デフォルトの名無しさん
2010/03/07(日) 17:13:430862デフォルトの名無しさん
2010/03/07(日) 17:49:260863デフォルトの名無しさん
2010/03/07(日) 17:51:110864デフォルトの名無しさん
2010/03/07(日) 17:56:470865デフォルトの名無しさん
2010/03/07(日) 18:10:280866デフォルトの名無しさん
2010/03/07(日) 18:13:290867デフォルトの名無しさん
2010/03/07(日) 18:18:190868デフォルトの名無しさん
2010/03/07(日) 21:03:34君が その遅いランダムアクセス子を知らずに使ってしまうからだよ
0869デフォルトの名無しさん
2010/03/08(月) 12:28:130870デフォルトの名無しさん
2010/03/08(月) 12:52:28>ランダムアクセス子
イテレータにもキャラ化の波が。w
0871デフォルトの名無しさん
2010/03/08(月) 12:55:05O(N/2)=O(N)
これがわからなければでなおせ。
0872デフォルトの名無しさん
2010/03/08(月) 13:09:14N>M ならば f(N) < C g(N)
となるような M と C が存在すること?
0873デフォルトの名無しさん
2010/03/08(月) 13:12:08分数指数関数のところみてみろよ
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%82%A6%E3%81%AE%E8%A8%98%E5%8F%B7
0874デフォルトの名無しさん
2010/03/08(月) 13:14:03なんかよくわかんないんだけど、計算量の話じゃなさそうだから、たぶんちがう。
0875デフォルトの名無しさん
2010/03/08(月) 13:14:540876デフォルトの名無しさん
2010/03/08(月) 13:16:230877デフォルトの名無しさん
2010/03/08(月) 13:18:010878デフォルトの名無しさん
2010/03/08(月) 13:22:171とNの間の話ね
lognとかもそうだな
0879デフォルトの名無しさん
2010/03/08(月) 13:28:40> 1とNの間はどっちにしたらいいですか?
「どっち」かじゃないとダメなんじゃね?
0880デフォルトの名無しさん
2010/03/08(月) 14:56:30ツリー構造みたいなのだとlogじゃね?
0881デフォルトの名無しさん
2010/03/08(月) 16:40:13「最後の要素を指すiteratorを取得する」方法はありますでしょうか?
現在のところ…。
list<int> m;
m.push_back(1);
list<int>::iterator it;
it = m.end();
--it;
// これで、iteratorが最後の要素を指すようになったぞ
とやっているのですが…。
push_backは返り値を返しませんし、backは参照を返されるので、末尾のiteratorを得るにはこれしかないのかなと
0882デフォルトの名無しさん
2010/03/08(月) 17:05:100883デフォルトの名無しさん
2010/03/08(月) 18:00:34ありがとうございます
0884デフォルトの名無しさん
2010/03/09(火) 05:18:44ポインタもイテレータさ!って感じで使ってもSTL的には困らないし
0885デフォルトの名無しさん
2010/03/09(火) 05:47:52int const *it = &m.back();
while(++it != m.end());
こうですかわかりません
0886デフォルトの名無しさん
2010/03/09(火) 08:18:31違わくね?w
0887デフォルトの名無しさん
2010/03/09(火) 09:55:09間違いだらけじゃねーか
0888デフォルトの名無しさん
2010/03/09(火) 10:36:490889デフォルトの名無しさん
2010/03/09(火) 13:01:280890デフォルトの名無しさん
2010/03/09(火) 13:08:52iteratorがポインタで実装されているという保証は一切ない
0891デフォルトの名無しさん
2010/03/09(火) 13:24:36それは884の内容じゃん
0892デフォルトの名無しさん
2010/03/09(火) 13:47:140893デフォルトの名無しさん
2010/03/09(火) 14:19:46それはちょっと自身の読解力に不安を持ったほうがいいレベル
0894デフォルトの名無しさん
2010/03/09(火) 14:21:28選ぶとすればbidirectional_iteratorかなぁ
たとえばinorderならrootから左右にすすめるコンテナとみなせるわけだし
tree<int,sorter=less<int>,order=inorder<int> > t;
木もSTLにあったら良いのに
0895デフォルトの名無しさん
2010/03/09(火) 14:23:25881 を見て、一行で書くとこうなるのかなと思ったのですが
これだと RVO は効かなくなるのでしょうか?
0896デフォルトの名無しさん
2010/03/09(火) 15:32:57それ以外は双方向イテレーターでいいですか?
コンテナのインデックスがIとしてO( I )とかO( I^2 )は
双方向かランダムどっちですか?
0897デフォルトの名無しさん
2010/03/09(火) 15:40:05そんなオーダーはない。
平均するか最悪の場合を考える。
O(N)かそれより大きければ基本bidirectionalじゃね?
0898デフォルトの名無しさん
2010/03/09(火) 15:40:230899デフォルトの名無しさん
2010/03/09(火) 20:22:47一方向イテレータもある。
0900デフォルトの名無しさん
2010/03/09(火) 20:24:22仕様と実装による。
普通は、イテレータにあわないと思う。
0901デフォルトの名無しさん
2010/03/09(火) 20:59:43幅優先か深さ優先かで二つ定義されてた記憶が
0902デフォルトの名無しさん
2010/03/09(火) 22:34:220903デフォルトの名無しさん
2010/03/10(水) 01:26:34あれってイテレータ持ってなかったっけ
あったなぁ tree.hh
GPL だったから使わなかったけど、すごい参考になった
0904デフォルトの名無しさん
2010/03/10(水) 01:38:36自分でツリー書いて幅か深さ、必要なのをtemplateでtag受け取って特殊化して組めばいいだけの話ではないの?
0905デフォルトの名無しさん
2010/03/10(水) 11:52:520906デフォルトの名無しさん
2010/03/10(水) 12:52:130907デフォルトの名無しさん
2010/03/10(水) 18:46:46感染ってからじゃ遅い
0908デフォルトの名無しさん
2010/03/10(水) 20:04:46あれも構造としては木だけど。
0909デフォルトの名無しさん
2010/03/10(水) 21:27:100910デフォルトの名無しさん
2010/03/11(木) 00:56:360911デフォルトの名無しさん
2010/03/12(金) 15:10:37おとなしく権威には従えよ
0912デフォルトの名無しさん
2010/03/12(金) 18:14:47有名どころのライブラリを書いてるプロが優秀なのも言わずもがなだが、
もしそのついでにアマチュア全般とプロ全般を比較したがっているなら、
これについては、コードの品質とは殆ど関係無い。
0913デフォルトの名無しさん
2010/03/12(金) 21:05:18でないとしていきなり
アマチュア全般
ですか
おめでたいですね
0914デフォルトの名無しさん
2010/03/12(金) 21:16:08いきなりというなら、いきなりプログラム素人とか言い出す人が問題なんだよ。
0915デフォルトの名無しさん
2010/03/12(金) 21:20:370916デフォルトの名無しさん
2010/03/12(金) 21:25:370917デフォルトの名無しさん
2010/03/12(金) 22:32:45いや実用的な物は書けないかもしれないが
後学のために実験プログラムを書くことは、赤黒木のソースを
読むときに大いに役立つぞ
0918デフォルトの名無しさん
2010/03/13(土) 05:33:18そこでiteratorが指す位置も保存して、また復元できるようにしたい。でもできない。
助けてくださいエロい人。
0919デフォルトの名無しさん
2010/03/13(土) 06:00:14なにを試して「できない」と判断したの?
0920デフォルトの名無しさん
2010/03/13(土) 06:10:10何回++したらendと等しくなるかとかを保存しないといけないんじゃねーの
意外と面倒臭いなこれ……
0921デフォルトの名無しさん
2010/03/13(土) 09:59:020922デフォルトの名無しさん
2010/03/13(土) 10:51:05どちらかというと全体で一塊で意味のあるようなデータだし。
問題のiteratorの保存/復元だが、値を保存して読み込むときにfindでいいと思う。
0923デフォルトの名無しさん
2010/03/13(土) 12:43:20distance と advance を使ってできることとは違うのかな?
0924デフォルトの名無しさん
2010/03/20(土) 15:37:52正しくは償却定数時間なんだな
0925デフォルトの名無しさん
2010/03/20(土) 18:48:420926デフォルトの名無しさん
2010/03/20(土) 19:33:230927デフォルトの名無しさん
2010/03/21(日) 13:31:440928デフォルトの名無しさん
2010/03/21(日) 13:33:560929デフォルトの名無しさん
2010/03/21(日) 15:23:090930デフォルトの名無しさん
2010/03/21(日) 19:43:15実際にアクセスされるまでメモリの確保が遅延されるシステムとか
0931デフォルトの名無しさん
2010/03/22(月) 09:44:060932デフォルトの名無しさん
2010/03/23(火) 19:19:48コピーオンライトは、stringだったら
かなりの値打ちだと思うけど、
vectorだったらやりすぎだと感じるな。
0933デフォルトの名無しさん
2010/03/27(土) 18:41:15空にしたい場合こうやるよりほかにやり方はありますか?
while(!s.empty()){s.pop();}
0934デフォルトの名無しさん
2010/03/27(土) 18:53:460935デフォルトの名無しさん
2010/03/27(土) 19:18:31開放されて欲しくない場合は正攻法は>>933しかない
reinterpret_cast<std::deque&>(s).clear(); なんて鼻から悪魔な邪道もあるけど
そんな事するくらいなら最初からdeque使った方がいい
0936デフォルトの名無しさん
2010/03/27(土) 19:56:24stackってコピー演算子定義されたたのか。これはいいこと知った。
0937デフォルトの名無しさん
2010/03/27(土) 19:57:490938デフォルトの名無しさん
2010/03/27(土) 20:00:57それ動くのか?
むしろ、それが機能するstackは使いたくないな。
0939デフォルトの名無しさん
2010/03/27(土) 20:11:16そのメンバ関数呼んでるだけだぜ
他のコンテナを使う事もできるが、デフォルトはdeque
0940デフォルトの名無しさん
2010/03/27(土) 20:14:07かっこいいけど。
0941デフォルトの名無しさん
2010/03/27(土) 20:34:440942デフォルトの名無しさん
2010/03/27(土) 20:35:440943587
2010/03/27(土) 20:52:24SpaceShift使うとか工夫すれば良いのにねぇ。
0944デフォルトの名無しさん
2010/03/27(土) 20:53:45>他のコンテナを使う事もできるが、デフォルトはdeque
じゃあ実際に何のコンテナを使っているかわからなければ
>reinterpret_cast<std::deque&>(s).clear();
なんて出来ないね
0945デフォルトの名無しさん
2010/03/27(土) 22:16:16型引数にだって残るわけだし
0946デフォルトの名無しさん
2010/03/27(土) 22:22:46プログラマが管理する物を減らさないとそのうち手に終えなくなるぞ
0947デフォルトの名無しさん
2010/03/27(土) 22:46:390948デフォルトの名無しさん
2010/03/27(土) 22:47:38解放されて欲しいじゃなくて、解法されて欲しくない場合か、なるほど
そうなると、速度的にはどちらが有利なんだろう
0949デフォルトの名無しさん
2010/03/27(土) 22:48:120950デフォルトの名無しさん
2010/03/27(土) 22:54:50どちら、って何と何を比べての話?
0951デフォルトの名無しさん
2010/03/27(土) 23:06:25大文字の時点で標準じゃ無いだろう。
内部のコンテナを使って欲しいならそれなりのメンバ関数なりtypedefがあるんじゃね?
reinterpret_castは悪い冗談だ。
0952デフォルトの名無しさん
2010/03/27(土) 23:52:480953デフォルトの名無しさん
2010/03/27(土) 23:58:23だからcontainer_typeだってば
規格書にもちゃんと書かれてる歴とした標準のtypedef
直接触りたければ内部コンテナは「c」っていう名前でprotectedになってるから
継承して触ることも出来る
0954デフォルトの名無しさん
2010/03/28(日) 00:06:59ただ仮想デストラクタでないクラスを継承するのもねえ
private継承なら安全だけどstackにアップキャストできないし
0955デフォルトの名無しさん
2010/03/28(日) 00:13:59そんなDirtyな事はしたくないなあ
そこまでして自分の意見を通したいのか
0956デフォルトの名無しさん
2010/03/28(日) 00:19:55それはstackがそもそも適していないということでは
0957デフォルトの名無しさん
2010/03/28(日) 00:21:57したくないなあ、って誰もやれとは言ってないぞ
自分の意見を通したいのは君自身じゃね?
自分も規格書見て確かめたよ
0958デフォルトの名無しさん
2010/03/28(日) 00:23:290959デフォルトの名無しさん
2010/03/28(日) 00:24:01だったら書くなよ
0960デフォルトの名無しさん
2010/03/28(日) 00:24:58stack<hoge> s;
s=stack<hoge>()がスマートかな
0962デフォルトの名無しさん
2010/03/28(日) 00:27:56記法で代替できるかじゃなくて、選択したデータ構造が
stackである必然がないんじゃないかって話
端的にいえばdeque使えよってだけ
0963デフォルトの名無しさん
2010/03/28(日) 00:29:11IDが出ないんだから何とでも言えるわな
0964デフォルトの名無しさん
2010/03/28(日) 00:31:01言っておくが、コンテナの種類はテンプレート引数から指定するんだぞ
そしてデフォルト引数がdequeなのは規格で決まっている
0965デフォルトの名無しさん
2010/03/28(日) 00:32:540966デフォルトの名無しさん
2010/03/28(日) 08:16:510967デフォルトの名無しさん
2010/03/28(日) 08:45:26#include <stack>
template <typename T, typename Seq = std::deque<T> >
class my_stack : protected std::stack<T, Seq> {
private:
typedef std::stack<T, Seq> base;
public:
using base::value_type;
using base::reference;
using base::const_reference;
using base::size_type;
using base::container_type;
explicit my_stack(const Seq& c = Seq()) : base(c) { }
using base::empty;
using base::size;
using base::top;
using base::push;
using base::pop;
void clear() { base::c.clear(); }
};
0968デフォルトの名無しさん
2010/03/28(日) 09:10:170969デフォルトの名無しさん
2010/03/28(日) 09:20:360970デフォルトの名無しさん
2010/03/28(日) 09:34:11Stackアダプタぐらい自作した方が良い
0971デフォルトの名無しさん
2010/03/28(日) 09:37:490972デフォルトの名無しさん
2010/03/28(日) 09:38:36基本ダメ
仮想デストラクタがない
0973デフォルトの名無しさん
2010/03/28(日) 09:44:360974デフォルトの名無しさん
2010/03/28(日) 09:47:51単にガワを被せただけ
コンポジションに近い
0975デフォルトの名無しさん
2010/03/28(日) 09:52:44デストラクタが仮想でないことに気をつければ
コンテナアダプタは継承しても問題ないよね
0976デフォルトの名無しさん
2010/03/28(日) 09:59:34そこは public 継承じゃなけりゃ問題にならんだろ。
0977デフォルトの名無しさん
2010/03/28(日) 10:13:34public継承しなければコンパイルエラーになるだろ
0978デフォルトの名無しさん
2010/03/28(日) 10:30:510979デフォルトの名無しさん
2010/03/28(日) 10:37:45コンパイルできない
0980デフォルトの名無しさん
2010/03/28(日) 11:20:390981デフォルトの名無しさん
2010/03/28(日) 11:38:43試してみろよ
コンストラクタにアクセスできませんって叱られる
0982デフォルトの名無しさん
2010/03/28(日) 11:44:05class A {
A() {}
~A() {}
};
class B : A {
B() {}
~B() {}
};
int main()
{
B b;
}
0983デフォルトの名無しさん
2010/03/28(日) 11:46:09あったりまえだろう。Bのコンストラクタ、デストラクタがprivateになっとるだろうが。
皆が言ってるのはこうでしょ。
class A {
public:
A() {}
~A() {}
};
class B : private A {
public:
B() {}
~B() {}
};
int main()
{
B b;
}
0984デフォルトの名無しさん
2010/03/28(日) 11:55:080985デフォルトの名無しさん
2010/03/28(日) 13:32:57問題無い?
0986デフォルトの名無しさん
2010/03/28(日) 13:38:510987デフォルトの名無しさん
2010/03/28(日) 16:55:13涙を飲んでちゃんとprotected継承してるでしょ
レス数が950を超えています。1000を超えると書き込みができなくなります。