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


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

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



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

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

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

2 名前:デフォルトの名無しさん [2009/01/11(日) 11:15:02 ]
【C++】STL(Standard Template Library)相談室 9
pc11.2ch.net/test/read.cgi/tech/1204045410/
【C++】STL(Standard Template Library)相談室 8
pc11.2ch.net/test/read.cgi/tech/1198435319/
【C++】STL(Standard Template Library)相談室 7
pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
pc5.2ch.net/test/read.cgi/tech/1095583235/

3 名前:デフォルトの名無しさん [2009/01/11(日) 11:16:43 ]
入門ページなど

www.cplusplus.com/

・入門,一覧,使い方
www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
www.s34.co.jp/cpptechdoc/reference/stl_samples/

STLPort
www.sgi.com/tech/stl/
www.stlport.org/

4 名前:デフォルトの名無しさん [2009/01/11(日) 11:17:18 ]
C++相談室 part63
pc11.2ch.net/test/read.cgi/tech/1217008269/
Boost総合スレ part6
pc11.2ch.net/test/read.cgi/tech/1207749841/
C++0x 4
pc11.2ch.net/test/read.cgi/tech/1214407525/

5 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 13:09:24 ]
>>1おーつ

6 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 14:26:00 ]
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

7 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:34:28 ]
早速質問です。
set< 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

と言われる。
これは何が間違ってる?

8 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:42:58 ]
>>7
set< set<int> >の要素はset<int>だぞ? intじゃないぞ?

9 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:58:05 ]
>>7
↓こういうことしようとしてるのと同じ。結果がどうなってほしいのかわからん。

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
set<int>::iterator i(s.begin());
*i = 4;

10 名前:デフォルトの名無しさん [2009/01/11(日) 18:05:33 ]
>>7
std::set<int> v;
std::set< std::set<int> > s;
v.insert(10);
s.insert(v);



11 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 18:06:46 ]
>>8 ちゃんと嫁

12 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 19:04:48 ]
それ以前に空のコンテナからイテレータ作るのってまずくね?

13 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 19:11:15 ]
別にまずくはないだろ
begin()が有効とは限らないというだけで

14 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 03:17:22 ]
空のコンテナってbegin()==end()になるんじゃないの?無効なの?

15 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 04:55:50 ]
>>14
>>7

16 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 11:14:16 ]
>>14
それであってる。イテレータ自体は有効だけど、デリファレンス(要素にアクセス)はできない。

17 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:25:09 ]
どうしてもイテレータの良さが分からない
vectorとかdequeとかならat()でfor文回せばいいじゃん
一個変数増えるし、洗練された手法には見えない

だれか、熱く語ってくれないか


18 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:47:37 ]
・全てのコンテナにat()が実装されているとは限らない。
・全てのコンテナにoperator []()が実装されているとは限らない。
・全てのコンテナにイテレータが実装されている。
・全てのコンテナに対応したアルゴリズムを組む時に使える。
・別に使いたくなければ使わなくても良いけど。

19 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:53:04 ]
どっかのAPIからデータの集まりを「TheContainer」なるクラスで貰ってきたとしよう
君はそれを調べ上げて、めでたくその実体がvectorに過ぎないことを突き止め
中からatを引っ張り出してforループを書き各データに望みの処理を施した
ここまでは万々歳だ

ところがそのAPIのバージョンが上がって、TheContainerの実体はfantasticsetという
ベンダがオリジナルで作り上げた超高性能で複雑怪奇なコンテナに変わった
君は互換性を保つために、fantasticsetの構造を調べ上げて、
各データに順次アクセスするためのカオスな繰り返し文を書いて、
それが正しく全データを重複なく渡っているかどうかのテストもしなければならなくなった

最初からTheContainer::iteratorを使ってループしてれば、こんな苦労をせずに済んだんだ
どうだ素晴らしいだろう

20 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 01:22:20 ]
>>17
listはどうするんだね?



21 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 03:34:54 ]
>>17
>一個変数増える
ここkwsk

22 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 03:40:44 ]
>>21
俺も気になっている。
atや[]でもiが要るから互角だと思う。

23 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 03:54:50 ]
連結リストはランダムアクセス時に後方要素を検索するのに時間がかかるけど、
内部にさらにリストを使ったりして10000個とかジャンプさせればかなり安定すると
思うけどな。

ちょっと自分で作って比較検証してみるか……

24 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 04:23:02 ]
追加削除どうなるんだよという気がするけど

25 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 07:18:45 ]
end のこと言ってるんだろうが
配列でもサイズが必要になるな。

26 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 12:10:37 ]
>>23
それはスキップリストっていうデータ構造
結構古典的なデータ構造だから検証しなくても大体O(log N)になるよ

27 名前:17 mailto:sage [2009/01/15(木) 20:34:43 ]
>>18-22
抽象性が高い、と。速いとか、即役に立つというものでもないのね。

ちなみに、カウンタは変数に入りません、というイメージだった。
イテレータも宣言しだいでカウンタと同じように扱えるね。ちょっとforが長くなるけど。

なんとなく使ってみる気になった。

28 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 01:06:19 ]
>抽象性が高い、と。速いとか、即役に立つというものでもないのね。
……釣りだよね?

29 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 11:19:44 ]
抽象度が高い事が即役に立つ事もある。

30 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 02:44:58 ]
配列こそもはや使う気にならない。
イテレータがなくてもvectorやlistを使う。



31 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 02:53:09 ]
固定長で大量に使う場合はまだ配列を使うなぁ
それ以外はほとんどvectorだけど

32 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 02:59:43 ]
boost::beginとendがあれば、もう配列も恐くない。
これでBoost/TR1のarrayももう役目を終えた。

33 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 03:01:39 ]
vector は早く data() を実装してくれ。

34 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 11:19:06 ]
初歩的な質問で恐縮ですが関数テンプレートにてコンテナの第3要素を返す場合、
どのように記述したらよろしいでしょうか?

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>' に変換できません
とエラーになってしまいます

35 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 11:22:46 ]
戻り値型Tがコンテナ型なのにイテレータに入れようとしてる

36 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 11:26:56 ]
ヒャッハーーーーッ!!!!!
戻り値を typename T::const_iterator にして
iterator 部分を const_iterator にしたら解決しました。
関数の引数にconst T& としたので、普通のiterator は使えないのも見落としてました。
ありがとうございました。

37 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 12:09:50 ]
こんなやり方もある

template< 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);

38 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:16:30 ]
vectorやdequeで v.insert(v.end()+n,x); (n>0) とv.end() を
越えた位置を指定して挿入した場合の動作は、未定義でしょうか?
解説サイトを数件見ているのですが、記述が見つからないものでして。

39 名前:デフォルトの名無しさん [2009/01/23(金) 08:32:12 ]
>>38
23.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.

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

end()まではOKなのか

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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


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



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

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



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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include <iterator>



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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


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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

identitiesになにするもの?

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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


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

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

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

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

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

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

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

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

どっちなんだ。

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



141 名前:デフォルトの名無しさん [2009/02/24(火) 00:12:15 ]
今、シルトの本も調べてみたが、やっぱり関数オブジェクトの利点として
「値を格納したり、追加機能を実装できる」( p.230 )と書いてるな。

142 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:12:48 ]
すまん、全部 age ちまった・・・ orz

143 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:44:58 ]
vectorの連続性と一緒だな
普通はコピーなんてしないし、規格作った方もそんなつもりじゃなかったけど
ちゃんと書いてないせいで信用できないし、コピーしちゃう実装を誰かが作っても責められない
そんな誰も得しない状態

0xで直るんかね

144 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:52:16 ]
vectorの格納領域は「必ず」連続するようになったのは1998年以降だから
まぁ、いまどきのコンパイラならもう必ず連続すると考えていいんじゃないの。


145 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 11:38:30 ]
std::vector<int> v;
v.reserve(10);
... // v に値を格納
std::copy(v.begin(),v.end(),std::ostream_itreator<int>(std::cout,","));

このコードの copy 内の ostream_iterator... の部分て何を行っているのですか?
コンテナの要素をループで書き出してるのは分かるのですが、内部でどのような処理をしているのでしょう?


146 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 12:43:55 ]
>>138
俺もはまった
boost::refして誤魔化した

147 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 12:53:46 ]
ええ、どこのベンダだよ

148 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:00:32 ]
vectorの格納領域と同じで、標準化委員会がどっかで修正コメントだしてないのかな?

149 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:14:34 ]
>>130
俺なら output_iterator を受け取る関数を作って back_inserter を渡す。
std::vector なら reserve してからね。

>>133
良くないのはそうだけど、総和とかには使うし、命名とかコーディングスタイルの話になるんじゃないか?

150 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:48:24 ]
>>146
それどこのSTLライブラリ?
で、どんなコードではまった?



151 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:48:17 ]
>>149
ライブラリの内部実装の話を命名やコーディングスタイルでどうするの?

152 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:49:33 ]
>>145
ttp://msdn.microsoft.com/ja-jp/library/0c6y7x31(VS.80).aspx


153 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:08:40 ]
>149
総和系なら accumulate があるべ。

154 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 08:55:19 ]
状態を持つと並行処理できないじゃないか。

なーんてね

155 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:03:23 ]
>>151
内部状態を持つ関数オブジェクトを使う話で、内部実装の話はしてないよ。
使わないほうがいいけど、使うなら注意を喚起するとか、専用の関数を作って封じ込めるとか、という話。

>>153
全くその通りでした。

156 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:52:40 ]
mapは構造体をキーに持つことができないのでしょうか?
具体的には、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を使っています。

どうしたら解決できるでしょうか?

157 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:04:06 ]
エラーの内容から二つのpointを比較できないコードであるということがわかるので、mapの為に比較関数を用意する。
方針としては、グローバルにpointの大小を判別するbool operator<(const point&, const point&)を定義するか、
correspondの宣言の歳にmap<point, point, compare_t> correspond(compare);とする
(ただしcompare_tは戻り値boolで引数に(const point&, const point&)を取ることができる関数オブジェクトまたは関数の型で
compareはそのインスタンス)

158 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:25:45 ]
>>157
素早い回答ありがとうございます。
pointのxとyどちらでソートすべきか比較関数を用意してやればよいということでしょうか?

159 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:32:21 ]
うん、例としては
bool 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++とか参考にすれば、
綺麗に実装する方法が載ってると思う

160 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:39:54 ]
>>159
具体例までありがとうございます。
map 比較関数 でググったらいくつか例も出てきたので出来そうです。

よく考えるとmapは2分木を利用してるんだから自前の比較関数を用意してやる必要があるのは当たり前ですね。
勉強になりました。



161 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:33:14 ]
C++やSTLではコンテナの全要素を出力するときどのようにするのでしょうか?
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8944.txt
今は上のようにやってます。
list vector mapやDataのようなクラスが増えていくにつれコードが増え、似たような処理が何回も出てきそうです

162 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:37:20 ]
std::list<T>をTにすればコンテナ全種に使えるようになるはず。

163 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:41:47 ]
よくわからないけどこういうこと?
template<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;
}

164 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:50:54 ]
コンテナを取るんじゃなくて、algorithmみたいに範囲を取るようにすれ。

template<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();
}


165 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:51:31 ]
まぁそれだけだとlist<list<...>>みたいなのに適応できないけどな

166 名前:161 mailto:sage [2009/02/27(金) 23:02:22 ]
>>162
ほんとですね、全部なおしました
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の中身がコンテナじゃなさそうな場所に使ってみます

167 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 00:04:03 ]
とりあえず、rhsは right hand side(右側)の略なんだから
lhs << rhs って形にしようぜw

168 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 12:55:03 ]
関数オブジェクトにしといてfor_each()じゃだめなのか

169 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:45:22 ]
>>168
それ、コードではどうやるの

170 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 01:25:00 ]
こんな感じ?

template <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>());
}



171 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 12:40:27 ]
ostream_iteratorにassignという手も

172 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:04:02 ]
例としてよく引き合いに出されるのは ostream_iterator に copy だと思うが・・・

173 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:19:22 ]
for_eachを使うと copy よりも凝った出力形式を作れるってくらいかな

174 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:49:02 ]
#include <pstade/oven/io.hpp>
#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";
}

175 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:08:36 ]
>>136,143
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() の戻り値はまったく使えないことになりそうだ。

176 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 16:56:46 ]
>>175
for_eachの戻りはコピーされた関数オブジェクトに内部状態が反映されてるんじゃなかった?

177 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:17:17 ]
>176
関数オブジェクトに全要素を通して処理した結果の状態が保持されていることを期待するだろうが、
極端に言えば各要素の呼び出し毎に新しくコピーした関数オブジェクトを渡されたりすると、期待する
結果と異なる。
参照使うなりコピーされても大丈夫なようにはできるからまったく使えないは言い過ぎ。
とはいえ、そういう用途なら accumulate 使えばいいじゃん、とは思う。

178 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:22:46 ]
boost::ref使って渡せばいいんじゃないか。boost::mpl::for_eachではうまくいった

179 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:23:42 ]
 

180 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:02:38 ]
char *buf = new char[n];
//(snip)
std::istream is(pointer_streambuf(buf, buf_size));

みたいな感じで、ポインタをバインドできるstreambufってある?
ないならつくるんだけど。



181 名前:180 [2009/03/28(土) 19:11:47 ]
っていうか勢いあまって作ってしまったんだけど、標準かboostにあるならそっち使う。

あと、>>180の訂正:
x char *buf = new char[n];
o char *buf = new char[buf_size];



182 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:27:36 ]
istrstreamか?
廃止予定だけどw

183 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 20:12:25 ]
>>182
おk。でも廃止か。
strstreambufも廃止なんかな。

先にstringstream使ってて、basic_stringにしか対応してないから、
strstreamは無視してたわ。


184 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:15:50 ]
vectorについて、ある時点でのvectorの中身を参照するような配列のポインタ、
ちょうど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];

のように書いても大丈夫でしょうか。

185 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:24:59 ]
いやいや、むしろ&v[0]とか&v.front()でいける。

アロケータのconst_pointerはT const*のtypedefだし、addressは&演算子と同じこと。
事実上、死に設定。

186 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:36:31 ]
どうしてイテレータじゃだめなのかすら?

187 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:48:40 ]
>>185
ありがとうございました。

>>186
C定義の関数に渡す必要があるためです。

188 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:49:58 ]
v.at(i)でええやん

189 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:53:17 ]
やりたかった例としてはこっちの方が良かったかもしれません。

int buf[256];
if(v.size()<256) memcpy(buf, &v[0], v.size());

190 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:51:17 ]
C++0xならv.data()が使えるんだけどな



191 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 06:40:05 ]
SGIがなんかあれなんですよね

192 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:09:49 ]
2度目のchap11

193 名前:インドリ [2009/04/09(木) 10:03:38 ]
blogs.wankuma.com/episteme/archive/2009/04/08/171040.aspx
d.hatena.ne.jp/faith_and_brave/20090408

194 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:21:23 ]
淫鳥

195 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:35:56 ]
久しぶりにSTLPort使おう思ったら、ビルドまでずいぶん便利になってるのな……

196 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:09:07 ]
STLport 5.2.1とboost 1.38.0を一緒に使おうと思ったらビルドエラーが出まくって無理だった

197 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 18:33:47 ]
ちょw

198 名前:デフォルトの名無しさん [2009/04/22(水) 21:47:20 ]
自分で作ったクラスにイテレータを実装する方法がいまいちわかりません。
どこかにいい解説はないでしょうか?

それとも皆 boost::iterator_facade を使ってるのかな?

199 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 23:50:36 ]
>>198
boost::iterator_facade で何か不満でも?

200 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 23:58:19 ]
boostはインストール禁止なんです…



201 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:07:33 ]
なんでSTLport5.2.1をMinGWでビルドしようとすると
"awk"が見つかりません のエラーが出るの?

STLport5.1.5までは何の問題もなくビルド出来ていたんだが

202 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:13:15 ]
>>200
じゃ、 boost::iterator_facade の実装を見るとか。

とりあえず作ってみたものと、その問題点をここで晒してみるといいかもしれない。

203 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 01:37:55 ]
>>198
std::iteratorのマニュアルを読んで、
std::istream_iteratorみたいな単純なやつを読む。

204 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 06:13:13 ]
インストールというか置くだけで使えるよ!

そういうことではないんだろうが

205 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 16:56:09 ]
lower_bound/upper_boundですが

ttp://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)では後者のようですが・・・。

206 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 17:18:07 ]
>>205
その前者は、
>ある値と一致する範囲の一番最初を返す
と書いてある見出しとも矛盾している。

207 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:04:49 ]
後者が正しい。
もともと lower_bound と upper_bound は
value を挿入可能な半開区間 [ lower_bound, upper_bound ) を探すためのアルゴリズムだから。
これは equaLrange の結果に等しい。

って、マッサー本に書いてあった。確か。

208 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:22:49 ]
前者はlowerとupperの解説文章が逆ってことかな

209 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:27:28 ]
>>206
本当ですね。
>>207
なるほど。
>>208
逆としてみても、「見つからない場合はlast。」というのはおかしいですね。
あと、引数や戻り値のイテレータがランダムアクセスイテレータなのが気になります。

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

210 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 05:52:59 ]
class A
{
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コンテナを突っ込むような利用は、一般的にあまりされないの
でしょうか?




211 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 09:08:28 ]
>>210
それ、mapじゃなくてpairじゃいかんの?

212 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 10:43:41 ]
>>210
とりあえず自分で書いたやつを見せてみろよ。何がわからんのかわからん。

213 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:15:05 ]
>>210
1. AMapListから特定のAMapのイテレータを取得する。これをiとする
2. (*i->find(キー))->GetTime()

mapをlistに入れた構造が必要な場合はmapをlistに入れるよ
…としか答えられないな

214 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:28:56 ]
(*i)->find(キー)->second->GetTime();じゃね?

215 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 15:45:05 ]
>>214
そうだわ
スマネ

216 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:13:42 ]
vectorの要素ってCopy ConstructiveとAssignable以外には必要ないはずだよな?
VC9の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);
}


217 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:30:07 ]
>>216
それ、 resize() のあとの要素が何で初期化されてることを期待してるの?

218 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:46:00 ]
ああ、ごめん書き間違えた
resizeの第二引数にhogeの適当なインスタンス渡してもだめなんだよ。

219 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:48:13 ]
g++つかえば

220 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:14:50 ]
>>216
bcc 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 個のエラーが発生しました ***



221 名前:デフォルトの名無しさん mailto:sage [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だけの問題ではない事がわかる。

222 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:24:02 ]
ちなみに

public:
hoge() {}

を入れると両者とも一発で通る。

223 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:28:54 ]
resizeのプロトタイプは
void resize(size_type sz, T c = T());
だからデフォルトコンストラクタがないと通らないこと自体は当然

224 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:50:24 ]
ただ実装はSTLPortもDinkumwareも
void resize(size_type, T)
void resize(size_type)
のように二つの関数に分けてるがな

225 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:55:27 ]
#include <vector>

struct 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
全部通るよ?

226 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:57:11 ]
>>223
>>218

227 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:57:50 ]
>>225
むしろそれだけの環境を使いこなすお前は何者

228 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:04:53 ]
俺の場合、<memory>218行目の
typename _Alloc::value_type _Val;
でもろにDefault Constructor要求された。

229 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:09:42 ]
>>216
privateじゃん

230 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:13:13 ]
こりゃひどい



231 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:22:48 ]
ワラタ

232 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 23:17:14 ]
ついでに言うとdefault constructibleだ。

233 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 01:05:59 ]
いいもの見させてもらった
記念パピコ(゚∀゚)

234 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 20:36:31 ]
あなたをprivateです。

235 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 21:58:18 ]
わたしはあなたのpublic

236 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 00:03:10 ]
ごめんなさい、ずっとfriendでお願いします

237 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 00:51:04 ]
delegateな俺の心はこっぱみじん

238 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 07:30:41 ]
>>237
スレ違い

239 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 10:48:21 ]
NULLぽ

240 名前:デフォルトの名無しさん [2009/05/04(月) 16:40:11 ]
      - -―- 、
    /...::::::::::::::.. ヽ
  / ..:::::::::::::::::::/\ ヽ
  /..:::/::::/::::// ヽ l:. l.
  l:::::!::::/●)  (●)|:: |
.  !:::l::::l///  ,, ///l:i:l  いやぁぁぁん
  ヽ:i::!、 r ― ァ ノノ'     
    ` l\`ー './
   ノヽ \_フ.ヽ
   |_ 丶   ヽ
.   | |' 初心者)





241 名前:デフォルトの名無しさん [2009/06/07(日) 14:44:09 ]
atnd.org/events/702

124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU

242 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:06:24 ]
>>241
なぜここに?
0xスレに貼るのならともかく。

243 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:35:41 ]
ぶつぶつ会終わったよー

244 名前:デフォルトの名無しさん [2009/06/18(木) 11:57:11 ]
質問です
vector<int> v;
v.resize(100);
とやった際に、確保されたv[0]〜v[99]は、0クリアされていることは保障されているのでしょうか?

自分で試しにやってみる限り0クリアされているのですが、なぜわざわざクリアされているのか疑問です。
(mallocとかで確保したメモリは、クリアされていないですよね。なのになぜvectorだとわざわざそんなことを?)

自分で試した環境は、VS2008C++Express です

245 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 12:03:35 ]
>>244
新たに確保された要素はデフォルトコンストラクタで初期化される

246 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 12:04:28 ]
void resize( size_type sz, T c = T() ); だから。
なんで値で埋めるのかは…仕様決めた人に聞いてくれ。
領域確保だけならreserveがあるし。

247 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 13:00:56 ]
保障されてたんですね。
どうもありがとうございます

248 名前:2chとはいえマ的に mailto:sage [2009/06/18(木) 14:00:31 ]
×保障 (ある事態への)備え。プログラム的にいうとtry〜catch
○保証 約束されていること。プログラム的にいうとassert()を抜けるのが間違いない状態

249 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:37:51 ]
自作のクラスからヌルポの例外投げたいんだが
std::exceptionに標準であったりしない?
ヌルポ

250 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:47:35 ]
>>249
標準にはない。どういう場面で投げたい?
場合によっては標準の例外の方が意味が明確になるかもしれない。



251 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:54:58 ]
>>250
えっとね
データコンテナっぽいクラスを作ってて
->演算子とかで中のデータにアクセスさせてるんだけど
中のデータがnullの時は->演算子の処理中に例外で中断させたい

252 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:01:06 ]
>>251
なるほど。標準にマッチするのはなさそうかな。

253 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:04:08 ]
>>252
そっかthx

254 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:38:18 ]
boostになら何かそんなのあったな

255 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:44:06 ]
std::runtime_error でいいんじゃネ

256 名前:デフォルトの名無しさん [2009/06/29(月) 22:31:41 ]
vector で、バッファ拡張で要素をコピーするとき、メモリイメージをコピーではなく、
コピーコンストラクタでコピーして、コピー元は delete するのって何故だっけ?

257 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 22:34:09 ]
俺のLv7のESPで読んだところ
swap技法か例外安全について聞きたいらしい

258 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 00:43:34 ]
なんかいろんな話がごっちゃになってるような気がする

259 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 01:56:09 ]
>>256
メモリイメージをコピーで問題が発生しない保証は無いじゃないか

260 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 02:02:47 ]
>>256
仮にオブジェクトが自分のアドレスを使って何かしてるとしたら



261 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 07:47:16 ]
>>256
intなんかはメモリ領域のコピーでいいけど、
smart_ptrなどではオブジェクトのコピー処理を実行する必要があるから

262 名前:261 mailto:sage [2009/06/30(火) 07:50:46 ]
別にそうでもないか
忘れてくれ

263 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 18:34:47 ]
時々でいいので>>261の事を思いだしてあげて下さい

264 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:16:30 ]
>>262 >>256
smart_ptrはコピー時に参照回数を変更するひつようがあるんでメモリイメージコピーはできないからそうでもあるよ。



265 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:20:47 ]
メモリ領域コピーして元領域のメモリをそのまま解放したらカウント維持で問題ないからそうでもない
そういう問題ではない

266 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 17:15:45 ]
ものすごく基本的な質問をさせてください。
std::vectorで100個(数は可変)のデータがあって
これの最初20個ぐらい(数は可変)のデータを削除して
前に詰めたいのですが、どうすればいいのでしょうか?

erase (remove( ではダメでした。


267 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 17:29:47 ]
v.erase( v.begin(), v.begin() + 20 );

268 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 19:53:15 ]
できました!
ありがとうございました!


269 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:27:56 ]
初めて出てきた要素に対してのみ動作するunique_transformを実装してるのですが
unary_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のどっかのフォルダに入ってるんですかね?

270 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:51:41 ]
あ、特に修正しなくてもidも渡せるのか
>>269は忘れてください



271 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:53:25 ]
忘れました。^^

272 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:14:30 ]
std::vector<Object*> objs;
をソートしたいのですが、どうすればいいのでしょうか?
Objectクラスにはbool operator< (const Object& lhs, const Object& rhs); が定義されています。
objs.sort (objs.begin(), objs.end());
とやると、上の<を使わずにポインターの値そのものを使ってソートしてくれやがります。


273 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:48:57 ]
>>272
第三引数にコンパレータを渡せ

274 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:42:22 ]
Object& じゃ型が違うんじゃ
Object*& じゃないの

275 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:50:35 ]
>>274
ポインタ型同士の比較は272が言っているとおりコンパイラが組込で持っているから、
そんなのは定義できない。
というわけで>>273

276 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:00:58 ]
> コンパイラが組込で持っている

ああ、すっかり忘れてた

277 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:23:21 ]
bool operator <(Object* o1, Object* o2);

グローバル関数のオーバーロードで行けるかと思ったけど、
引数の片一方がクラスじゃねえぞ、とコンパイラにキレられた

278 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:54:19 ]
ObjectPtrクラスを作って、Objectの&を上書きしてPtrクラスを返すようにすれば

279 名前:272 mailto:sage [2009/07/29(水) 19:03:15 ]
みなさん、ありがとうございます。
言っていることがさっぱりわからないので、勉強し直してきます。


280 名前:デフォルトの名無しさん mailto:sage [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);




281 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 11:00:25 ]
lambda さんかっけーっす!

282 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 11:48:54 ]
なるほど、覚えておこう
std::sort(objs.begin(), objs.end(), *boost::lambda::_1 < *boost::lambda::_2);

283 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 21:19:29 ]
日本横断 STL の旅


SL の見間違いだった

284 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:07:16 ]
そういえばlsってよくslと打ち間違えて電車走るな
電車は飽きたので、slって打ったらSTLを宣伝するディストリを誰か作って

285 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:39:14 ]
>>284
走っているのは蒸気機関車であって電車ではない罠。
つーか、適当なSTL紹介文書を垂れ流すスクリプトを作って問題のslよりも上流に置けばいいだけじゃん。

286 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:47:12 ]
alias sl='lynx www.sgi.com/tech/stl/'

287 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:59:28 ]
ttp://d.hatena.ne.jp/wasisan/20090703/
STLってlistとtreeを区別するもんだっけ?

288 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 10:25:05 ]
>>287
別に区別するともしないとも言ってないんでないの?

289 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:32:11 ]
STLの中にはlistと別に_Treeクラスがある
listのノードは_Next, _Prevがあるだけだが
_Treeのノードは_Parent, _Left, _Rightがあるから
手が一本多い=構造に違いがある

っていうレスを求めてるのか?>>287

290 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:44:14 ]
標準で定められてるSTLコンテナはvector,deque,list,set,multiset,map,multimapだけ
treeはないし、あったとすればそれはベンダの独自拡張だから何とも言えない



291 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 02:49:21 ]
VCだと確かmapとsetの親がtreeだったな

292 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 00:36:35 ]
今時二分木とかw
ハッシュマップだろjk

293 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 01:20:43 ]
おまえのハッシュはソート済みにしてくれんのか

294 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 02:15:38 ]
おうよ、常にソート済みさ

295 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 02:25:42 ]
鬼才あらわる

296 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:04:35 ]
>>294
男前だなあんた

297 名前:デフォルトの名無しさん [2009/08/21(金) 12:08:50 ]
std::stringstreamは、ostringstreamとistringstreamの多重継承であると知った
std::stringはstd::stringstreamと関係してる?別物?

298 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:18:47 ]
>>297
当然関係してる。
で、当然別物。

299 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:34:25 ]
>>297
嘘乙
stringstreamはiostreamを継承している

300 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:02:08 ]
int a[10];
std::generate(a, a+10, rand);
で乱数を入れられますが、rand()%100を入れたい場合、bindとか使ってどう書けばいいですか?
lambdaならできそうな気はしますが。



301 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:33:27 ]
>>300
generate(a, a+10, bind(modulus<int>(), bind(rand), 100));
TR1(bind)無しだと関数オブジェクト作らないと無理かな。
bindが使える環境ならTR1のrandomを使った方が良いような気がする。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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