5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2008/08/26(火) 12:01:17
C++標準ライブラリの一つ、STLについて。

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

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

2 :デフォルトの名無しさん:2008/08/26(火) 12:02:03
【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/

3 :デフォルトの名無しさん:2008/08/26(火) 12:03:43
入門ページなど

・入門
http://www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
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/
・TIPS集
http://www.nantekotta.com/stl.html
・メルマガ
http://www.kab-studio.biz/Programing/STLiostream/
・解説
http://ja.wikipedia.org/wiki/Standard_Template_Library
http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html

マルチスレッドプログラミングの時には
http://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html

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

4 :デフォルトの名無しさん:2008/08/26(火) 12:05:01
書籍紹介


STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
http://www.amazon.co.jp/gp/product/4881357786/

STL―標準テンプレートライブラリによるC++プログラミング 第2版
http://www.amazon.co.jp/gp/product/4894714329/

標準C++:STLの基礎知識
http://www.amazon.co.jp/gp/product/4756138047/

標準講座C++―基礎からSTLを利用したプログラミングまで
http://www.amazon.co.jp/gp/product/4881357050/

STLによるコンポーネントデザイン
http://www.amazon.co.jp/gp/product/475613422X/

Effective STL―STLを効果的に使いこなす50の鉄則
http://www.amazon.co.jp/gp/product/4894714108/

5 :デフォルトの名無しさん:2008/08/26(火) 12:06:01
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/l50
Boost総合スレ part6
http://pc11.2ch.net/test/read.cgi/tech/1207749841/l50
C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/l50

6 :デフォルトの名無しさん:2008/08/27(水) 09:34:44
>>1

7 :デフォルトの名無しさん:2008/08/29(金) 00:12:00
早速質問です。
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 :デフォルトの名無しさん:2008/08/29(金) 00:37:34
ねぇねぇ。
>>4の書籍紹介にも出てくるSTL標準講座(ハーバーと知るとちょw)なんだけど
これのp.17中段(vectorの代表的なメンバ関数の紹介)に

「end()関数はベクタの最後の要素を指す反復子を返します」

って、書いてあるんだけど、これって間違いだよね?
end()関数は末尾(最後の要素のひとつ後)を指すんだよね?
実際、

vector< int > v( 10, 1 );
vector< int >::const_iterator iter = v.end();
cout << *iter;

みたいにやると、「デリファレンスできねーよ、ばーかばーか」って
実行時エラーがでやがりまくりやがりますりやがりますり。

9 :デフォルトの名無しさん:2008/08/29(金) 01:01:37
楽しいか?

10 :デフォルトの名無しさん:2008/08/29(金) 01:04:46
うん。

11 :デフォルトの名無しさん:2008/08/29(金) 01:11:33
>>8 死にな。

12 :デフォルトの名無しさん:2008/08/29(金) 01:22:01
死んだら、end()が最後の要素を指す様になりますか?

13 :デフォルトの名無しさん:2008/08/29(金) 01:22:39
いや、お前が終わるだけ。

14 :デフォルトの名無しさん:2008/08/29(金) 01:34:36
p.14の
「コンテナ内を巡回するには、 begin() で先頭を指す反復子を取得し、
 反復子の値が end() と等しくなるまで反復子をインクリメントします。」
ってのも、実際にプログラムしたらエラーでる。

つか、気になったのは、シルト先生は for ループの条件に不等号を使うんだよね。
for ( int i = 0, i < 10, ++i )みたいに。
これはAccelerated C++ではやるべきじゃないって最初の方で書かれてる。
なぜなら、普遍の表明を正しく立てられなくなるし、エラーも発見しにくくなるから。
ループの終わりは正確に示すべきで、特に理由がなければ
for ( int i = 0, i != 10. ++i )のように書く方が良い、と。
こうすれば、ループが [0,10) であることを正しく表明できる。

どっちを信じたらいいんだ。

15 :デフォルトの名無しさん:2008/08/29(金) 01:38:46
俺の個人的な嗜好でいうと、不等号のほうが好きだな。
簡単に要素のスキップとかできるし

16 :デフォルトの名無しさん:2008/08/29(金) 01:50:51
ランダムアクセスイテレータには < が使えるが、そうでなければ使えない。
!= は任意のイテレータで使用可能である。
従って、後でコンテナの種類を入れ替えたりする可能性があるので!= が無難である。
というのが、STLのイテレータに関する結論。
(コンテナの種類を変更するのは、そんな簡単な仕事じゃなかったりするが。。。)

for 文の本体でカウンタの値を変更出来るのだから、
終了条件 i != 10 がいつも正しい表明とは限らない。

それが正しい表明なら != で書けば良いだろう。
i < 10 でも十分正しい表明であるケースは起こりうる。

ので、int カウンタに対しては、どちらでも良くて、時に応じて好きな方を選ぶ。
ただ、そんな細かい事より、もっと気を配るべき事は沢山ありそうだが。

17 :デフォルトの名無しさん:2008/08/29(金) 01:58:10
>というのが、STLのイテレータに関する結論。

なるほど。納得。

18 :デフォルトの名無しさん:2008/08/29(金) 01:59:47
で、結局、.end()はどこを指すのか。

19 :デフォルトの名無しさん:2008/08/29(金) 02:03:10
末尾であってるよ。

20 :デフォルトの名無しさん:2008/08/29(金) 03:49:59
>>7
エラーメッセージを見る限り、i.operator ->の戻り値の型がconst set<int>になっているみたい。
これが正しいのか規格のsetのあたりみても分からなかった、すまん。

21 :デフォルトの名無しさん:2008/08/29(金) 05:25:27
もっと単純な形、例えば以下の2つのコードを考える。

// OK!
set< int > s;
set< int >::iterator iter;
s.insert( 12 );
iter = s.begin();
cout << *iter << endl;

// Error!
set< int > s;
set< int >::iterator iter;
iter = s.begin();
cout << *iter << endl; // ここでError

イテレータ iter はコンテナ s の冒頭を指しているわけだが
コンテナ s が空っぽだから、実際には何も指していない。
何も指していないものはデリファレンスできないのでエラーになる。
当然、存在しないオブジェクトのメソッドも呼び出せない。
なので・・・

set< int > base;
base.insert( 0 );
set< set< int > > s;
s.insert( base );

set< set< int > >::iterator i;
i = s.begin();
i->insert( 12 );

のようにあらかじめなんか突っ込んでおけばOK。

22 :デフォルトの名無しさん:2008/08/29(金) 06:25:27
>>7,20,21
set の iterator には const が付いてる。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103

23 :デフォルトの名無しさん:2008/08/29(金) 10:34:55
キーなんだから、状態が変わるとコンテナが困った事になるわな。

24 :デフォルトの名無しさん:2008/08/29(金) 22:06:41
vectorやmapの要素にvector<double>やvector<float>を混在させたいのですが、
そういうことは出来ないんですかね?

25 :デフォルトの名無しさん:2008/08/29(金) 22:15:04
できるお


26 :デフォルトの名無しさん:2008/08/29(金) 22:19:23
>>25
どうやってやるですかね?
std::vector<std::vector> vec;
vec.push_back(std::vector<float>);
とかだと、vectorのtemplateの型を1行目で指定してないので、
compileがもちろん出来ないんですが。

27 :デフォルトの名無しさん:2008/08/29(金) 22:30:04
指定すればいいんだよ。

28 :デフォルトの名無しさん:2008/08/29(金) 22:32:54
>>27
>>26のvecの第一要素はvector<double>で、
第二要素はvector<float>にしたいという意味です。

29 :デフォルトの名無しさん:2008/08/29(金) 22:35:49
boost使っていいなら
std::vector<boost::any>
とか
std::vector<boost::variant<std::vector<double>, std::vector<float> > >

30 :デフォルトの名無しさん:2008/08/30(土) 01:08:15
boostすげぇぇぇぇぇぇぇぇぇ!

31 :デフォルトの名無しさん:2008/08/30(土) 01:31:11
それほどでもない

32 :デフォルトの名無しさん:2008/08/30(土) 01:49:20
>>31
そうだな
お前が作ったんじゃないもんな

33 :デフォルトの名無しさん:2008/08/30(土) 01:53:05
>>32
boostさんは謙虚なライブラリで大人気
あまり調子こくとリアルで痛い目を見て病院で栄養食を食べる事になる

34 :デフォルトの名無しさん:2008/08/30(土) 05:33:14
boostはすごいと思うぜ?
これを知ってるかどうかで生産性が違う

35 :デフォルトの名無しさん:2008/08/30(土) 09:01:55
いろんな有名な本でもboost位は紹介されるしな

36 :デフォルトの名無しさん:2008/08/30(土) 09:48:23
一部が次期標準に採用されるくらいだしな

37 :デフォルトの名無しさん:2008/08/30(土) 10:00:05
progress_displayも次期標準に入るんでしょうか?

38 :progress_display:2008/08/30(土) 18:19:55
期待して待ってて欲しいお(`・ω・´)

39 :デフォルトの名無しさん:2008/08/30(土) 21:33:29
progress_displayはC++0xには入りません

40 :デフォルトの名無しさん:2008/09/02(火) 22:43:24
vectorで2次元配列を作って、任意の行を基準にソートするにはどうしたらいいすか?

41 :デフォルトの名無しさん:2008/09/02(火) 22:45:46
BOOST_FOREACH

42 :デフォルトの名無しさん:2008/09/03(水) 11:53:07
ファイル読み込んで、データ整理する際のみソートが1度だけあって
それ以降、そのデータへのアクセスは走査のみの場合

vector と list、Dotch?

43 :デフォルトの名無しさん:2008/09/03(水) 11:58:40
ランダムアクセスができソートが速いのがvector。
任意の位置への挿入削除が速いのがlist。
よってvectorかと。

44 :デフォルトの名無しさん:2008/09/03(水) 12:47:33
STLportで_STLP_SHORT_STRING_SZを変更して使用してる人いる?
値を変更しても安全なんかな。

45 :デフォルトの名無しさん:2008/09/03(水) 18:32:22
コンテナを持つクラスで
コンストラクタ、デストラクタ内でclearするべき?

コンテナ自身、コンストラクタ、デストラクタで
clearは保証されてないんですか?

46 :デフォルトの名無しさん:2008/09/03(水) 18:33:17
clearしなくていいよ

47 :デフォルトの名無しさん:2008/09/03(水) 20:19:55
std::vector<union{int, int*}> hoge;
みたいな、要素を共用するようなこと出来ませんか?

unionをtypedefしちゃえばいいんだろうけど、
文を短くできないかなぁと思ったんですが…

48 :デフォルトの名無しさん:2008/09/03(水) 20:33:20
boost::any

49 :デフォルトの名無しさん:2008/09/03(水) 20:53:20
boost::variant

50 :デフォルトの名無しさん:2008/09/03(水) 21:03:49
>>48,49
d

51 :デフォルトの名無しさん:2008/09/03(水) 23:23:51
boostがすごすぎて濡れてきた。

52 :sage:2008/09/20(土) 23:20:38
vector<int> hoge(100);
hoge[0]=41;hoge[1]=10;hoge[2]=20;hoge[3]=2;....
となってるときに、hogeからある決められた数字以下の列だけを先頭から順番に
抜き出したいのですが、一行で書けるでしょうか?
よろしくお願いします。

53 :デフォルトの名無しさん:2008/09/20(土) 23:26:32
std::transform(hoge.begin(), hoge.end(), to.begin(), std::bind2nd(std::less<int>(), n));

54 :デフォルトの名無しさん:2008/09/20(土) 23:37:42
copy_ifがあれば簡単なんだが

55 :デフォルトの名無しさん:2008/09/20(土) 23:38:04
std::remove_copy_if(hoge.begin(), hoge.end(), std::back_inserter(hage), std::not1(std::bind2nd(std::less<int>(), n)));
std::copy_ifでできるよ、と書こうと思ったら無かったorz
C++0xマダー

56 :デフォルトの名無しさん:2008/09/21(日) 10:20:11
hoge | pstade::oven::filtered(_1 <= boost::lambda::constant(n));

0xで標準になるかもしれないrange baseの<algorithm>, <numeric>が楽しみですね


57 :デフォルトの名無しさん:2008/09/23(火) 19:57:36
Effective STL第43項を参考に,独自のループをfor_eachを使ったものに書き換えています

つまり,
class Widget {
public:
void redraw() const;
};

list<Widget> lw;

for (list<Widget>::iterator i = lw.begin(); i != lw.end(); ++i) {
i->redraw();
}

上記のようなメンバ関数を呼び出すようなループを下記のように置き換えています。(Effective STLからそのまま引用)

for_each (lw.begin(), lw.end(), mem_fun_ref(&Widget::redraw));


現在悩んでいる問題は
multimap<int, Widget *> widget_map;

for (multimap<int, Widget *>::iterator i = widget_map.begin(); i != widget_map.end(); i++) {
i->second->redraw();
}

このようなmapコンテナに対するループをどうやってfor_eachに置き換えるか…というものです。

for_each (widget_map.begin(), widget_map.end(), .... //これは無理
for_each (widget_map.begin()->second, widget_map.end()->second .... // イテレータでないのでやはり無理

なにか良いアイディアはあるでしょうか?

58 :デフォルトの名無しさん:2008/09/23(火) 20:10:27
関数を挟めばいいんだよ。
struct MapRedraw
{
void operator ()(std::multimap<int, Widget *>::value_type const& e) const
{
e.second->redraw();
}
};

for_each(widget_map.begin(), widget_map.end(), MapRedraw());

59 :57:2008/09/23(火) 20:13:42
>>58
なるほど
メンバ関数のみを使うという方法に固執していました

60 :デフォルトの名無しさん:2008/09/23(火) 20:16:15
スコット・メイヤーズ宣伝乙

61 :デフォルトの名無しさん:2008/09/23(火) 20:25:17
関数がポコポコ出てくるのがウザい

62 :デフォルトの名無しさん:2008/09/23(火) 21:07:45
STLを勉強したての頃に抱いた強い期待に比べると、
まったくと言っていいくらい使う機会が無いなぁ、for_eachは。
まぁ、俺はそうだっていう単なるスタイルの話だけれど。

63 :デフォルトの名無しさん:2008/09/23(火) 21:30:32
0xで無名関数がかけるようになったら、もうちょっとfor_eachの出番も増えるはず。

64 :デフォルトの名無しさん:2008/09/23(火) 22:02:57
0x厨うぜぇ

65 :デフォルトの名無しさん:2008/09/23(火) 22:24:07
標準でこれぐらいできるようになって欲しい
for_each(widget_map | map_values | indirected
, bind(&Widget::redraw, _1));

66 :デフォルトの名無しさん:2008/09/23(火) 22:26:14
>>65
最後のindirectedは要らなくないか?

67 :デフォルトの名無しさん:2008/09/23(火) 22:44:55
>>65
確かにこの場合だと要らんね、指摘ありがとう

68 :デフォルトの名無しさん:2008/09/23(火) 22:46:08
訂正
× >>65
>>66


69 :デフォルトの名無しさん:2008/09/23(火) 22:53:22
lambda使えないとalgorithmって生きてこないんだよね

70 :デフォルトの名無しさん:2008/09/27(土) 02:47:41
std::vectorを走査する時、
添字よりiteratorのが早いんですか?

71 :デフォルトの名無しさん:2008/09/27(土) 03:04:51
イテレータがポインタの実装なら、operator[]関数を呼ぶオーバーヘッドの分だけ速いんじゃね。

72 :デフォルトの名無しさん:2008/09/27(土) 03:05:54
そんなんで変わるほど、コンパイラはへぼじゃない。 判りやすい単純な書き方をするのが一番

73 :デフォルトの名無しさん:2008/09/27(土) 03:09:19
それは普通最適化で消える。

ただ、一般的な話をすると
vectorはクラス/構造体であり、内部にポインタメンバを持っている。
そのため、[]で参照する時には、必ずメモリ上にベースアドレスを示す変数を読む必要がある。
一方、iteratorはただのポインタであり、レジスタ割付が可能。
そういう意味で、昔の「ポインタ/配列どちらが速い」論争とは意味が違う。

とはいえ、実装と最適化次第なのは当然。

74 :デフォルトの名無しさん:2008/09/27(土) 13:58:29
・ i < vec.size() より itor != vec.end() の方が実態を正確に表現している
・ algorithm に渡す時はイテレータ
のような理由で、イテレータを使ったほうが、より C++ らしいとはいえるだろう。

75 :デフォルトの名無しさん:2008/09/27(土) 14:48:13
またit++が遅いから++itにしろの話か

76 :デフォルトの名無しさん:2008/09/27(土) 14:54:45
>>75
誰に言ってるの。

77 :デフォルトの名無しさん:2008/09/27(土) 15:06:18
またC++が遅いから++Cにしろの話か

78 :デフォルトの名無しさん:2008/09/27(土) 20:09:52
またC#が遅いからCにしろの話か

79 :デフォルトの名無しさん:2008/09/28(日) 12:46:14
環境: VisualStudio 2008

find_ifアルゴリズムを使いたいのですが、
書籍やwebページを参照して

find_if(v.begin(), v.end(), IsTestes);

というふうに記述するとコンパイラがエラーを吐きます。
(IsTestedの行: error C3867: 関数呼び出しには引数リストがありません。
 メンバへのポインタを作成するために & を使用してください)

&を付けて関数ポインタにしても解決しませんでした。
これはVS2008がヘンなの? 俺が何か見落としてる?

80 :デフォルトの名無しさん:2008/09/28(日) 12:48:44
IsTestes側がまずいと思われ
関数オブジェクトでぐぐるべき

81 :デフォルトの名無しさん:2008/09/28(日) 13:30:09
>>80
ありがとうございます。
関数オブジェクトに変えたら通りました。

82 :デフォルトの名無しさん:2008/09/29(月) 13:56:19
>>73
実装の話だが、VC++のChecked Iterator有効状態だとiteratorアクセスが遅く、
vectorの単なる走査だと生ポインタ取り出してインクリメントしたほうが速くなる
結果というのをどっかで見た

83 :デフォルトの名無しさん:2008/09/29(月) 22:32:49
デバッグ版で速度を気にしても仕方がない

84 :デフォルトの名無しさん:2008/09/30(火) 00:08:56
>>82
デフォルトで安全なほうに振ってるからな
それ知らずにベンチマークして「遅いwww糞杉www」
って言ってる奴マジ恥ずかしい

85 :デフォルトの名無しさん:2008/10/03(金) 21:16:07
サンプルコードに下記のコードがあったのですが解説がないので
どのような動きをするのかわかりません・・。
誰か簡単に教えていただけませんか
//------------------------------------------------------------
//STLの補助マクロ
//
//

#define foreach(type,obj,i) \
for(type::iterator i=(obj).begin();(i)!=(obj).end();(i)++)
#define const_foreach(type,obj,i) \
for(type::const_iterator i=(obj).begin();(i)!=(obj).end();(i)++)




86 :デフォルトの名無しさん:2008/10/03(金) 21:24:03
>>85
解説しろといわれてもこまるほど
簡単なというか基本的なことしかでてきてない
コードなんだがなにが分からないの?
イテレータ知らないの?

87 :デフォルトの名無しさん:2008/10/03(金) 22:10:28
>>85
typeにはstd::vectorとかのコンテナ型を指定する。objはそのインスタンス。iはイテレータを使ったループ変数だ。
こんな風に使う。

std::vector<int> vecx;
(略).
foreach(std::vector,vecx,i)
{
std::cout<<*i;
}



88 :デフォルトの名無しさん:2008/10/04(土) 05:58:22
今時のコンピュータ早くて
多少重い部品使っても全然平気。


89 :デフォルトの名無しさん:2008/10/04(土) 09:28:46
C++でそんなマクロを作る意味あんの?

90 :デフォルトの名無しさん:2008/10/04(土) 11:03:46
マクロじゃないとできへんのや・・

91 :デフォルトの名無しさん:2008/10/04(土) 11:42:58
>>85のマクロだけど
「#define foreach(type,obj,i)」のtypeを無くして引数を2個だけにできますか?
何に使うかはともかくとして、ちょっと気になった。

92 :デフォルトの名無しさん:2008/10/04(土) 11:54:38
>>91
BOOST_FOREACHを使う。


93 :デフォルトの名無しさん:2008/10/04(土) 12:06:59
BOOST_FOREACHもマクロなんですがw

94 :デフォルトの名無しさん:2008/10/04(土) 12:19:19
でっていう

95 :デフォルトの名無しさん:2008/10/04(土) 12:53:53
VC++なら8からfor eachが使える。

96 :デフォルトの名無しさん:2008/10/04(土) 13:37:59
BOOST_FOR_EACHを使うとループを二重にも三重にも出来る

std::vector<std::vector<int> > vec(10, std::vector<int>(10));
BOOST_FOREACH(std::vector<int>& row, vec)
BOOST_FOREACH(int& i, row)
i = 999;

97 :デフォルトの名無しさん:2008/10/04(土) 13:44:59
>>91
autoを使う

98 :デフォルトの名無しさん:2008/10/05(日) 01:30:25
>>97
autoは別スレの話題だ
typeofならギリギリ可

99 :デフォルトの名無しさん:2008/10/05(日) 15:35:23
vectorへのアクセスを速くする良い方法ってありますか?
いま、
for(vec::iterator it=vec.begin();it!=vec.end();it++) access to *it

for(int i=0, int num=vec.size(), Type *ptr=&vec[0];i<num;i++) accsess to ptr[i];
とかやっちゃってます。

100 :デフォルトの名無しさん:2008/10/05(日) 15:42:29
>>99
BOOST_FOREACHを使うとend()がキャッシュされる分高速化されるらしい。


101 :デフォルトの名無しさん:2008/10/05(日) 15:57:14
endをキャッシュするより
>>99のように 数値変数でループ回数を制御する方が速いことが多い

x86のような性能優先のCPUならどっちでも変わらないが
組み込みに使える普通のCPUだと差がつくことが多い

102 :99:2008/10/05(日) 16:14:17
なるほど、最適化すればx86なら変わらないのですね。ありがとう。

ちなみに、目的としては動的に確保できる多次元配列のアクセスを速く
したいんだけれども。array[][][]と同程度の速度が出たりしますか。
・・・なんて聞いてないで自分で実験してみればいいか^^;

BOOSTはデフォルトでビルドできないためソースを人に渡せないから、
速度の関係ないアルゴリズム検証用にしか使ってません。

103 :デフォルトの名無しさん:2008/10/05(日) 16:19:22
BOOST_FOREACHはビルドしなくても使える

104 :デフォルトの名無しさん:2008/10/05(日) 16:27:35
>>103
そうじゃなくてboost入れてない人がいるって話だろ

105 :99:2008/10/05(日) 16:48:34
そうです。使わない人にとっては、BOOST入れるのって結構面倒ですしね。

ソース書いて、アセンブラ見てみたんだけど、一見したところ変わらないみたい。

通常、静的な多次元配列array[a][b][c]ならば、連続で並んでるのが保障
されてるから、一発で目的のアドレスを参照できるから速い。

疑問なのが、動的な多次元配列の場合、
int ***ptr
ptr = new int**[a]
ptr[i] = new int*[b]
ptr[i][j] = new int[c]
とした時、
ptr[i][j][k]にアクセスすると、ptr[i]にアクセスして、入ってる番地を見
て、更に入ってる番地を・・ってのを繰り返すけど、メモリアクセスは通常
遅いので、動的配列は遅いのだけど。

で、普通に考えてvectorも同じような多重メモリアクセスをやってるような
気がするんだけど、遅くならないのかな。

106 :デフォルトの名無しさん:2008/10/05(日) 16:56:16
vector<vector<vector<int> > >とかなら105のと同じように遅くなるだろと思う。

107 :デフォルトの名無しさん:2008/10/05(日) 16:58:03
仕方がない
行毎に列の大きさを変えられる利便性とのトレードオフ

108 :99:2008/10/05(日) 17:16:38
うーむ、やっぱそうですよね。ありがとうございます。

僕のケースでは大抵の場合は行毎のサイズは固定で、初期化の時から変化
しないって場合が多いので、1次元配列で確保してます。例えば画像デー
タみたいに、ユーザの入力にあわせて初期化サイズが変わるみたいな状況です。

この場合、データの規則性・連続性は保障されるので、構造的には静的多
次元配列と同じパフォーマンスが出せるはずですが、最適化してくれるものですか?

もし可能なら、変数沢山のマクロから解放されてソースも読みやすくなるし、
メモリリークもしないから非常に素敵なんだけどな・・・。

109 :デフォルトの名無しさん:2008/10/05(日) 17:17:54
長方形や立方体でよければ、1次元に詰め込んでv[i * x + j]とアクセスする方法が取れる。

110 :デフォルトの名無しさん:2008/10/06(月) 03:44:50
boost::multi_arrayもあるけどインタフェースが変態的なんだよな
結局の所自分で簡単なクラス作って使うのが無難

111 :デフォルトの名無しさん:2008/10/15(水) 12:18:18
vectorで配列を作って
vectorの要素0から99までの最大値をmax_elementで求める
vectorの要素100から199までの最大値をmax_elementで求める
vectorの要素200から299までの最大値をmax_elementで求める
省略
という処理をしたいんですが、どのようにすればいいでしょうか?

112 :デフォルトの名無しさん:2008/10/15(水) 12:22:41
a = *max_element(&v[0], &v[100]);
b = *max_element(&v[100], &v[200]);
c = *max_element(&v[200], &v[300]);

113 :デフォルトの名無しさん:2008/10/15(水) 12:36:31
省略

114 :デフォルトの名無しさん:2008/10/15(水) 12:37:38
ありがとうございます。
それで出来るはずだと思って試していたら、他の所でミスしてましたorz。
iteratorを使って
ループ文中で
if(count%100){
a=*max_element(iterator,ここが分からない);
}
という風にiteratorを基準に、後ろ100個目までを範囲指定することを出来ませんか?

115 :デフォルトの名無しさん:2008/10/15(水) 12:41:30
ランダムアクセスイテレータなら
a=*max_element(iterator, iterator + 100);

116 :デフォルトの名無しさん:2008/10/15(水) 12:42:36
vectorなんだからランダムアクセスできるでしょ

117 :デフォルトの名無しさん:2008/10/15(水) 12:53:31
出来ました!ありがとうございます!!

118 :デフォルトの名無しさん:2008/10/19(日) 00:12:46
疑問なんだけど、vectorの配列から作ったiteratorってのは、
ポインタの配列なの?

119 :デフォルトの名無しさん:2008/10/19(日) 00:21:37
最適化の結果ポインタと同じような動作になるけど
そのものじゃないはず

120 :デフォルトの名無しさん:2008/10/19(日) 01:13:31
実装によるんじゃなかった?
単にポインタをtypedefしている実装もあれば、classにしてる実装もあるって
聞いたような気がする夢をみたかもしれない

121 :デフォルトの名無しさん:2008/10/19(日) 16:43:31
vectorの配列から作ったiteratorって言うと、

vector<vector<hoge> >::iterator

のことかい。

122 :デフォルトの名無しさん:2008/10/19(日) 17:21:14
俺はvector<hoge>[N]のイテレータ、つまりvector<hoge> *のことかと思った
でもどっちにしても話が合わない気がする

123 :デフォルトの名無しさん:2008/10/19(日) 17:24:23
vi->begin() とか気持ち悪いコード初めて書いたわ

124 :デフォルトの名無しさん:2008/10/19(日) 17:37:42
別に普通かな

125 :デフォルトの名無しさん:2008/10/19(日) 18:30:23
ハッシュテーブルの辞書みたいなもんだろ。

126 :デフォルトの名無しさん:2008/10/19(日) 18:44:13
まったく気持ち悪くないよ

127 :118:2008/10/20(月) 09:02:02
>>121,122
vector<int>::iteratorみたいなもんです。書き方が悪かったですね。すみません

2Dライブラリだったらピクセルデータの配列を引数
3Dライブラリだったら座標データの配列を引数
にとる関数がありますけど、そういう関数にvectorで管理してるデータを
渡したいときは、どのようにしてますか?
私は、vectorに入ってるデータのサイズ分の配列を作って、そいつに入れてから
ライブラリの関数に渡すってことをしてたんですけど、もっとスマートな方法って
ないですか?

128 :デフォルトの名無しさん:2008/10/20(月) 09:33:27
vectorのイテレータがポインタだという保証はない
でもvectorの内容がメモリ上で連続している保証はある
だからvがvector<T>なら、Tの配列を要求する関数に&v[0]を渡しても大丈夫
イテレータitに対応するポインタを渡したければ&*itのようにすればいい

129 :デフォルトの名無しさん:2008/10/20(月) 12:26:11
わかりやすい解答ありがとうございます。
vector便利過ぎる

130 :デフォルトの名無しさん:2008/10/21(火) 09:58:32
vectorでイテレータなんか使ったこと無いな。
Win32 APIを使う場合は、配列を使わない訳にはいかないから、
何番目という数字が必要な場合が出てくるし、
配列要素アクセスでは、i < vec.size()の記述でないとおかしいから。

131 :デフォルトの名無しさん:2008/10/21(火) 10:52:18
>>130のイテレータバージョンはたぶんこんな感じだな

vectorでインデックスなんか使ったこと無いな。
algorithmを使う場合は、イテレータを使わない訳にはいかないから、
beginとendが必要な場合が出てくるし、
イテレータアクセスでは、i != vec.end()の記述でないとおかしいから。

132 :デフォルトの名無しさん:2008/10/21(火) 12:22:45
つか、>>130 が vector で iterator 使ったことがあるかどうかなんて
地球上の誰も興味のない話を唐突にされても。

133 :デフォルトの名無しさん:2008/10/21(火) 19:53:51
内部でやってることは一緒じゃないの

134 :デフォルトの名無しさん:2008/10/21(火) 20:01:15
いや、vector のイテレータとか、型が分からないと使えないしめんどいー

インデックスでいいじゃんでも C++ 使うならイテレータつかったほうがいいのかなーどうしよー
と迷うに迷って混在させてgdgdになってる俺みたいな人には重要な話

135 :デフォルトの名無しさん:2008/10/21(火) 20:26:30
C配列との橋渡し的な役目もあるしね。使う人/使わない人がいるのは当然かと。

136 :デフォルトの名無しさん:2008/10/21(火) 20:51:16
>>134
対象のvectorが見えてるのに型が判らないってどういう状況だ?

137 :デフォルトの名無しさん:2008/10/21(火) 21:01:51
いちいちstd::vector<foo>::iteratorと書くのが面倒だと言っているだけだと思う。
早くautoが欲しい。

138 :デフォルトの名無しさん:2008/10/21(火) 21:04:22
どっちも似たようなものだし、いざとなれば相互に変換できるし、どうでもいい

139 :デフォルトの名無しさん:2008/10/22(水) 13:30:52
構文糖は重要だよ
各種LL言語が有用性を示してるじゃん

140 :デフォルトの名無しさん:2008/10/22(水) 13:36:50
イテレータとポインタは構文糖の関係にはない

141 :デフォルトの名無しさん:2008/10/22(水) 19:03:29
>>137
typedef 一回書けば解決

142 :デフォルトの名無しさん:2008/10/22(水) 21:04:19
double型 と char型のメンバを持つ構造体をvectorにいれて、全要素入れ終わったらソートみたいにしてるんですけど、

mapとかつかったらもっと効率よくなりますか?ソートするキーはdouble型の値で、降順です。

143 :デフォルトの名無しさん:2008/10/22(水) 21:30:53
ファイルからや手からの入力ならset使えば、ソート時間はほぼ無い。
読み込んでいる間にソートされるので。
もしメモリ間の転送であっても速いとは思う

144 :デフォルトの名無しさん:2008/10/22(水) 21:40:54
mapじゃなくてpairかもしれません。

pairでdouble型とchar型のメンバを作って、doubleをキーにソートって感じにしたいんですが、どうしたらいいですか?
char型のメンバは重複する場合もあります。

145 :デフォルトの名無しさん:2008/10/22(水) 21:46:00
扱う要素数によるよ。
整数とかポインタなら、数千まではvectorの方が一般的に他のコンテナよりも速い

146 :デフォルトの名無しさん:2008/10/22(水) 21:49:31
つまりvectorにガシガシいれてあとからソートですか?

147 :デフォルトの名無しさん:2008/10/22(水) 21:50:32
実測しよう

148 :デフォルトの名無しさん:2008/10/22(水) 21:51:29
それほど速度を気にしないなら、setにぶち込むのが簡単。 いれたらソート終わっているので

149 :デフォルトの名無しさん:2008/10/22(水) 21:52:15
そんなに速度は気にしません。あまりにも比較して遅いなら別ですが

150 :デフォルトの名無しさん:2008/10/22(水) 22:02:12
気になるなら測れ、としか。

151 :デフォルトの名無しさん:2008/10/22(水) 22:03:05
速度気にしてないのか

152 :デフォルトの名無しさん:2008/10/22(水) 22:13:56
気にしてないわけではありません。
実測してみます

153 :デフォルトの名無しさん:2008/10/22(水) 22:18:40
typedef struct{

double dist;

char name[20];

}DIST;


int main(){

std::set<DIST> distance;

distance.insert( 200 ); →2要素を代入するにはどうすればいいですか?


}

154 :デフォルトの名無しさん:2008/10/22(水) 22:22:03
>>153
DIST型のオブジェクトを渡すべきところへ200を渡してどーすんですか

155 :デフォルトの名無しさん:2008/10/22(水) 22:36:25
あらかじめvectorでサイズを決め打ちするなら早いけど、
領域を増やしていくならsetのほうがはやい

156 :デフォルトの名無しさん:2008/10/22(水) 22:37:13
>>154
渡し方がわかりません。ソートに使うキーはdoubleのほうです

157 :デフォルトの名無しさん:2008/10/22(水) 22:40:53
>>153
std::pairでくるんで渡せ

158 :デフォルトの名無しさん:2008/10/22(水) 22:54:03
こんなんでどう?

struct DIST {
double dist;
char name[20];
DIST(double d, char* str) : dist(d) {
std::strcpy(name, str);
}
friend class Comp;
};

struct Comp {
bool operator()(const DIST& d1, const DIST& d2) const {
return d1.dist < d2.dist;
}
};

int main()
{
std::set<DIST, Comp> distance;
distance.insert(DIST(200, "abc")); //→2要素を代入するにはどうすればいいですか?
distance.insert(DIST(100, "def"));
distance.insert(DIST( 50, "ghi"));

for (std::set<DIST, Comp>::const_iterator pos = distance.begin(); pos != distance.end(); ++pos)
std::cout << pos->dist << ", \"" << pos->name << "\"\n";
}

159 :デフォルトの名無しさん:2008/10/22(水) 22:54:46
distance.insert( std::pair(200.0 ,"moziretu") );
こうですか?

160 :デフォルトの名無しさん:2008/10/22(水) 22:56:05
>>158
通りません・・・

161 :デフォルトの名無しさん:2008/10/22(水) 22:56:51
>>160
これ頭に付けてるよな

#include <iostream>
#include <cstring>
#include <set>

162 :デフォルトの名無しさん:2008/10/22(水) 23:02:07
>>161
コピペみすってました・・・

struct DIST {
double dist;
char name[20];
DIST(double d, char* str) : dist(d) {
std::strcpy(name, str);
}

friend class Comp;
};

struct Comp {
bool operator()(const DIST& d1, const DIST& d2) const {
return d1.dist < d2.dist;
}
};

これがどういうことをしてるのかわかりません。

163 :デフォルトの名無しさん:2008/10/22(水) 23:07:19
>>162
まず二要素を一度に代入できるように、DISTにコンストラクタを付けた。
こうする事によって一時オブジェクトが生成できるようになる。

次にソートの基準をdoubleにするために、叙述関数もしくは関数オブジェクト
を書かなければならないが、この場合は関数オブジェクトを書いている。

というのもstd::setのデフォルトの比較基準はless<DIST>となり、これは
存在しないので、自分で書かなければならないからだ。そこで比較関数
オブジェクトにCompを使う事にして自分で書いている。

164 :デフォルトの名無しさん:2008/10/22(水) 23:09:37
classがstructになっててなんかおかしいよ

165 :デフォルトの名無しさん:2008/10/22(水) 23:20:44
>>164 わかったよこれでいいだろ
class DIST {
double dist;
char name[20];
public:
DIST(double d, char* str) : dist(d) {
std::strcpy(name, str);
}
double getdist() const {
return dist;
}
const char* getname() const {
return name;
}
friend class Comp;
};
struct Comp {
bool operator()(const DIST& d1, const DIST& d2) const {
return d1.dist < d2.dist;
}
};
int main()
{
std::set<DIST, Comp> distance;

distance.insert(DIST(200, "abc")); //→2要素を代入するにはどうすればいいですか?
distance.insert(DIST(100, "def"));
distance.insert(DIST( 50, "ghi"));

for (std::set<DIST, Comp>::const_iterator pos = distance.begin(); pos != distance.end(); ++pos)
std::cout << pos->getdist() << ", \"" << pos->getname() << "\"\n";
}

166 :デフォルトの名無しさん:2008/10/23(木) 02:37:33
おまえら暇だな…

DIST dist;
distance.insert(dist);

167 :デフォルトの名無しさん:2008/10/23(木) 19:19:10
func(string hoge){

}
という関数に

char mozi[256];で宣言された文字列をfunc(mozi)みたいに渡せますか?

168 :デフォルトの名無しさん:2008/10/23(木) 19:20:02
ええ

169 :デフォルトの名無しさん:2008/10/23(木) 19:21:30
なんでそんなことができるんですか?

170 :デフォルトの名無しさん:2008/10/23(木) 19:23:21
stringのコンストラクタにconst char*を取るものがあるから

171 :デフォルトの名無しさん:2008/10/23(木) 19:26:39
なるほど!STLってほんとにすごいですね

172 :デフォルトの名無しさん:2008/10/24(金) 00:21:21
でもSTL関係ないですね!

173 :デフォルトの名無しさん:2008/10/25(土) 03:20:25
stringはSTLだろ
basic_string<char>でテンプレートだし。

174 :デフォルトの名無しさん:2008/10/25(土) 04:09:49
>>173
馬鹿発見

175 :デフォルトの名無しさん:2008/10/25(土) 08:24:14
>>173
ん・・あぁ・・そうだね・・・・

176 :デフォルトの名無しさん:2008/10/25(土) 10:01:54
>>173
const char *を引数にとるコンストラクタを持つ文字列クラスは、STL固有ではありません。

177 :デフォルトの名無しさん:2008/10/25(土) 17:43:47
んなこたーない

178 :デフォルトの名無しさん:2008/10/25(土) 18:02:21
自前で似たようなモノを作れるのに?

179 :デフォルトの名無しさん:2008/10/25(土) 18:47:47
>>176
const T* だよ

>>178
STLであろうがなかろうが全部自前で似たようなものを作れるぞ

180 :デフォルトの名無しさん:2008/10/25(土) 20:47:06
なんか話が噛み合ってない

181 :デフォルトの名無しさん:2008/10/25(土) 21:03:12
わかってないんだよ、おそらく本当にw

182 :デフォルトの名無しさん:2008/10/25(土) 21:23:12
ということにしたいのですね。

183 :デフォルトの名無しさん:2008/10/25(土) 21:36:55
はいはい模範回答。

もともとのAlexanderのSTLにはbasic_string<>は無かった。
しかし、標準化の過程でSTLコンテナに適合するようにされた。

basic_string<>がalgorithmと重複するようなメンバ関数を持っていたり、
しかもそれがイテレータではなくsize_typeを扱ったりするのはその名残。

184 :デフォルトの名無しさん:2008/10/27(月) 10:23:42
>>173 の
>basic_string<char>でテンプレートだし。
てのが気になるなあ…
「stream I/O もテンプレートだからSTL」とか言い出しかねない勢い。

185 :デフォルトの名無しさん:2008/10/27(月) 12:46:36
入念に勉強してない限り、
「C++コンパイラに付いてくるtemplate classを使ったもの全部=STL」
と思っている人は多い気がする
実用上困る事項でもないし・・・

186 :デフォルトの名無しさん:2008/10/27(月) 15:08:26
定期的に出る話題だから
今回も「ああ、またですか」てなもんだ。
でもbasic_stringはもう
仲間に入れてあげてもいいと思うんだ。

187 :デフォルトの名無しさん:2008/10/27(月) 16:00:31
やだよ
basic_stringなんてC++標準化委員会も「失敗作だった」と
認めているじゃないか

188 :デフォルトの名無しさん:2008/10/27(月) 20:21:30
そこまで言ってたっけ。

189 :デフォルトの名無しさん:2008/10/27(月) 20:55:00
>>186
たまにこのスレを斜め読みするものとしては
そういう話が定期的に回ってくれると
自身の無知加減がよくわかるから助かるよ。

basic_stringって曰くがあったのか・・・(´・ω・)

190 :デフォルトの名無しさん:2008/10/28(火) 01:35:54
>>187 ソースくれ

191 :デフォルトの名無しさん:2008/10/28(火) 01:47:14
標準化委員会はSTL自体が「失敗作だった」って
認めてたぞ

192 :デフォルトの名無しさん:2008/10/28(火) 01:50:21
標準化委員会はC++自体が「失敗作だった」って
認めてたぞ

193 :デフォルトの名無しさん:2008/10/28(火) 04:45:29
親は>>192自体が「失敗作だった」って
認めてたぞ

194 :デフォルトの名無しさん:2008/10/28(火) 11:11:11
俺は「性交作だ」って聞いた

195 :デフォルトの名無しさん:2008/10/28(火) 11:40:21
おあとがよろしいようで

196 :デフォルトの名無しさん:2008/10/28(火) 20:20:17
100個ぐらいの文字列を入れて
そのなかで一番出現率が高い文字列を探すには
STLのどんなデータ構造とアルゴリズムをつかえばいいでしょうか?

197 :デフォルトの名無しさん:2008/10/28(火) 20:43:38
まず服を脱ぎます

198 :デフォルトの名無しさん:2008/10/28(火) 20:44:07
次にソートします

199 :デフォルトの名無しさん:2008/10/28(火) 20:48:02
かぜひきました

200 :デフォルトの名無しさん:2008/10/28(火) 20:51:58
相当大変な事態ですね。

201 :デフォルトの名無しさん:2008/10/28(火) 21:02:46
手術は成功です

202 :デフォルトの名無しさん:2008/10/28(火) 21:25:40
そーっとしておいてくださいね

203 :デフォルトの名無しさん:2008/10/28(火) 21:27:19
真面目な解答お願いします

204 :デフォルトの名無しさん:2008/10/28(火) 21:32:40
std::map<string,int>で出現頻度数えれば?


205 :デフォルトの名無しさん:2008/10/28(火) 21:36:06
質問です。

struct a {
func() {}
};

struct b {
vector <a> va:
};

とあって、for_eachアルゴリズムでva内のfuncを呼び出すには
どのような書き方をすればいいのでしょうか?mem_fun_refと
bind2ndを組み合わせるのでしょうか?

206 :デフォルトの名無しさん:2008/10/28(火) 21:44:53
自己解決しました。mem_fun_refだけでいいようです。

207 :デフォルトの名無しさん:2008/10/28(火) 22:11:52
>>204
連想配列ですよね?stringがキーでintが値ってことですか?

208 :デフォルトの名無しさん:2008/10/28(火) 22:14:09
hash


209 :デフォルトの名無しさん:2008/10/28(火) 22:17:42
map<string,int> mとすると、m[str]++としてあとはソートなりなんなりすりゃいい

210 :デフォルトの名無しさん:2008/10/28(火) 22:30:23

map<string,int> test;

test["hoge"]++;

sort(test.begin(), test.end(), greater<int>());

こうですか?


211 :デフォルトの名無しさん:2008/10/28(火) 22:40:03
mapってソートできないだろ
挿入した時点でキーで自動的にソートされてるんだから

全部要素を挿入したらvectorにでも全要素をコピーして
今度はint基準でソートすればよい

212 :デフォルトの名無しさん:2008/10/28(火) 22:41:26
なるほど。どうりでコンパイルが・・・
ちょっとやってみます

213 :デフォルトの名無しさん:2008/10/28(火) 22:43:39
vectorにキーと値の構造体をコピーするんでしょうか?

最大値を知りたいのではなく、最大値をとるキーをしりたいんです

214 :デフォルトの名無しさん:2008/10/28(火) 22:51:17
脳味噌を使え脳味噌

215 :デフォルトの名無しさん:2008/10/28(火) 22:55:46
何か汚ねえなあ・・・lambdaを使わないとやっぱ綺麗に書けんわ

struct Comp : public std::binary_function<std::pair<std::string, int>, std::pair<std::string, int>, bool> {
bool operator()(const std::pair<std::string, int>& v1, const std::pair<std::string, int>& v2) const {
return v1.second < v2.second;
}
};

void print(const std::pair<std::string, int>& v)
{
std::cout << "string = '" << v.first << "', count = " << v.second << std::endl;
}

int main()
{
std::map<std::string, int> msi;
std::vector<std::pair<std::string, int> > vsi;

msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++;
msi["def"]++; msi["def"]++;
msi["ghi"]++; msi["ghi"]++; msi["ghi"]++; msi["ghi"]++;

for (std::map<std::string, int>::iterator pos = msi.begin(); pos != msi.end(); ++pos)
vsi.push_back(std::make_pair(pos->first, pos->second));

std::sort(vsi.begin(), vsi.end(), Comp());
std::for_each(vsi.begin(), vsi.end(), print);
}

216 :デフォルトの名無しさん:2008/10/28(火) 22:58:14
わざわざmapにするいみあんの?

217 :デフォルトの名無しさん:2008/10/28(火) 22:59:29
なんか複雑ですね・・・
ちょっと解読してみます

218 :デフォルトの名無しさん:2008/10/28(火) 23:01:17
>>216
挿入が楽
それだけ

219 :デフォルトの名無しさん:2008/10/28(火) 23:03:53
ああ強いて言えば挿入が速いか・・・

220 :デフォルトの名無しさん:2008/10/28(火) 23:04:51
「一番」出現頻度高いのが欲しいだけなら、わざわざソートまでする必要なかろ
O(n)で済むぞ


221 :デフォルトの名無しさん:2008/10/28(火) 23:05:45
>>220
えっとどうするんですか?

222 :デフォルトの名無しさん:2008/10/28(火) 23:07:06
mapに突っ込んだ後で、単に全舐めすりゃいいだろ
シークエンスの最大値を求めるのにいちいちソートするのか?お前さんは

223 :デフォルトの名無しさん:2008/10/28(火) 23:09:36
まあそうだな
イテレータを回すだけ
最大値が知りたいだけならそれでいい

224 :デフォルトの名無しさん:2008/10/28(火) 23:11:33
まあただ最大値の文字列の候補が複数あった時は少々工夫が必要か

225 :デフォルトの名無しさん:2008/10/28(火) 23:12:10
最大値にタイがある場合も考慮せにゃならんな
単純でいて意外と深いのかもしれないw

226 :デフォルトの名無しさん:2008/10/28(火) 23:17:42
int main(){

string str;

map<string,int> test;

int maxval=0;
int maxkey;

test["hoge"]++;
test["hoge"]++;
test["huga"]++;

map<string, int>::iterator itr = test.begin();
map<string, int>::iterator itrEnd = test.end();



while(itr != itrEnd){

      itr++;
}


}

こうしたんですが、値自体はどうやって参照するんですか?

227 :デフォルトの名無しさん:2008/10/28(火) 23:21:00
itr->second

228 :デフォルトの名無しさん:2008/10/28(火) 23:23:12
ああそうかpairのコンテナなんですよね

229 :デフォルトの名無しさん:2008/10/28(火) 23:25:51

int main(){

string str;

map<string,int> test;

int maxval=0;
string maxkey='\0';

test["hoge"]++;
test["hoge"]++;
test["huga"]++;

map<string, int>::iterator itr = test.begin();
map<string, int>::iterator itrEnd = test.end();



while(itr != itrEnd){
if(itr->second >maxval){
maxval = itr->second;
maxkey = itr->first;
}
itr++;
}

cout << "maxkey:" << maxkey << endl;

}
コンパイルはできるんですが、とまります・・・

230 :デフォルトの名無しさん:2008/10/28(火) 23:27:09
>>224-225
そうなんですよね。その辺は工夫でできそうです


231 :デフォルトの名無しさん:2008/10/28(火) 23:29:41
タイを考慮しても2回舐めればいいだけだから、たいした問題ではないか
なんちって

232 :デフォルトの名無しさん:2008/10/28(火) 23:30:49
タイがあっても3つ以上はことはないとおもうんで、大丈夫そうです。

しかし動かないです・・・

233 :デフォルトの名無しさん:2008/10/28(火) 23:34:12
>>229
>string maxkey='\0';

が良くない。これはstring maxkey=NULL; と同じ意味になる。
つまりアドレス0をアクセスする文字列で初期化しようとする。

234 :デフォルトの名無しさん:2008/10/28(火) 23:35:44
基本からやった方がいいんじゃ・・・

235 :デフォルトの名無しさん:2008/10/28(火) 23:37:58
>>233
if文内で代入するので問題ないかと思ったんですが・・・

>つまりアドレス0をアクセスする文字列で初期化しようとする。
??

236 :デフォルトの名無しさん:2008/10/28(火) 23:38:35
微妙に誤解を招きそうなので訂正

×つまりアドレス0をアクセスする文字列で初期化しようとする。
○つまりアドレス0から始まるC文字列で初期化しようとする。

処理系によっては文字列が大きすぎて止まり、他の処理系では
アドレス0をアクセスするのでセグメントエラーで止まったりする。

237 :デフォルトの名無しさん:2008/10/28(火) 23:39:17
正しくはstring maxkey=""; あるいは単にstring maxkey でいい。

238 :デフォルトの名無しさん:2008/10/28(火) 23:40:39
>>235
charだけを引数に取るコンストラクタがないため、
暗黙の変換でconst char*を引数に取るコンストラクタが呼ばれてしまう。

239 :デフォルトの名無しさん:2008/10/28(火) 23:40:40
わかりました。親切にありがとうございました

240 :デフォルトの名無しさん:2008/10/28(火) 23:51:42
つーか、'\0'はintじゃね?

241 :デフォルトの名無しさん:2008/10/28(火) 23:55:17
あとまだ質問が・・・

map<string,int> test;

while(){

if(条件){ }


}

として、条件が成立したときだけ、testを初期化(すべてのキーに対して値を0にしたい)したいのですが、どうすればいいですか?

242 :デフォルトの名無しさん:2008/10/28(火) 23:55:37
>>240
だから、std::string::string(0) が呼ばれてしまう。
この意味をよく考えてみろ。

243 :デフォルトの名無しさん:2008/10/28(火) 23:59:24
>>241
イテレータを回して全てのsecondに0を代入するしかないだろ

244 :デフォルトの名無しさん:2008/10/29(水) 00:00:28
if(){

map<string,int> test;


}

ではだめですか?

245 :デフォルトの名無しさん:2008/10/29(水) 00:04:15
>>244
それはまずい。if文の外側のtestが隠蔽されてしまう。

246 :デフォルトの名無しさん:2008/10/29(水) 00:08:10
ネタとマジレスの見分けがつかない

247 :デフォルトの名無しさん:2008/10/29(水) 00:08:27


map<string,int> test;

while(){

if(){

map<string,int> test;


}
}

でもですか?

248 :デフォルトの名無しさん:2008/10/29(水) 00:10:01
>>247
同じ事だ。
>>246
うむ・・・釣られてるのやもしれぬ

249 :デフォルトの名無しさん:2008/10/29(水) 00:15:38
決して釣りとかじゃありません。知識不足ですいません。

250 :デフォルトの名無しさん:2008/10/29(水) 00:19:30
釣りじゃないなら

・差し当たってSTLよりも先にstringの予備知識を付ける
・スコープの意味を理解する

これは最低限やっておく事をお勧めする

251 :デフォルトの名無しさん:2008/10/29(水) 00:20:28
わかりました!ありがとうございました

252 :デフォルトの名無しさん:2008/10/29(水) 00:29:30
while(itr != itrEnd){

itr->second = 0;
itr++;
}
初期化はこんな感じですかね?
firstのstringの初期化もいりますか?itr>first="";としたらコンパイルできなかったので・・・

253 :デフォルトの名無しさん:2008/10/29(水) 00:35:55
itr->firstはconstだろが。
なんでそんなことがしたいんだよ!

254 :デフォルトの名無しさん:2008/10/29(水) 00:39:00
>>252
お前は一度STL標準講座の本を買ってきてサンプルプログラムを
全部手で打ち込んで走らせて実行してみろ。

俺はそうやって覚えた。

255 :デフォルトの名無しさん:2008/10/29(水) 00:40:34
252の質問はわすれてください!whileでインクリメントしてたitrをbeginに設定しなおしてなかった・・・

256 :デフォルトの名無しさん:2008/10/29(水) 04:25:30
学習の初期なら、ヘタすりゃ一日100個はつまらん疑問(後から考えれば)が浮かぶもんだが、
その頻度でいちいち書き込まれちゃかなわん。

ていうか、ある疑問を自力で解こうと動く過程で、副作用的に身につく多くの事柄こそが
実質的には学習のメインだと思うんだが(疑問を1つ解決する度に、幾つもの新知識が身につく)、
いちいち質問してたらその一番大事な効能が激減するぞ。

257 :デフォルトの名無しさん:2008/10/29(水) 06:08:33
至言

258 :デフォルトの名無しさん:2008/10/29(水) 07:53:27
つか、STL以前の問題ばかりだな

259 :デフォルトの名無しさん:2008/10/29(水) 08:05:31
>>240
C では int だけど C++ では char 。

260 :240:2008/10/29(水) 08:55:46
>>242
あほ。
文字列リテラルに文字を突っ込む馬鹿じゃねーよ。
勝手に他人認定するな

261 :デフォルトの名無しさん:2008/10/29(水) 10:43:00
考えてみろ、と言われても
何も考えず「あほ」呼ばわりする程度には馬鹿なんですね。

262 :デフォルトの名無しさん:2008/10/29(水) 12:49:34
>>261は何か勘違いをしてないか

263 :デフォルトの名無しさん:2008/10/29(水) 13:28:07
あほだし仕方がない

264 :デフォルトの名無しさん:2008/10/29(水) 17:05:21
>>258
だからあのときあれほどC++相談室とスレ分けるなと言ったのに・・・

265 :デフォルトの名無しさん:2008/10/29(水) 17:08:29
>>264
一緒にしたら荒れて収拾付かなくならなくないか?
C++相談室が過疎ってるから丁度いいのかもしれんけど

266 :デフォルトの名無しさん:2008/10/29(水) 21:05:44
初心者スレに行くべきだと思う

267 :デフォルトの名無しさん:2008/10/30(木) 17:12:36
リストの中身をAの順で並び替えて、A同士が連続したままになるように
Bの順で並び替えるにはどうすればいいの?

268 :デフォルトの名無しさん:2008/10/30(木) 17:17:32
Bでソートした後
Aで安全ソート
ってことか?

269 :デフォルトの名無しさん:2008/10/30(木) 17:52:56


>>267

あ1 あ2 あ3 い7 い9 う4 う5 う6
てな感じ?

270 :デフォルトの名無しさん:2008/10/30(木) 22:02:56
>>268
安全じゃなくて安定だろ

271 :デフォルトの名無しさん:2008/10/31(金) 00:01:29
stable_sort

272 :デフォルトの名無しさん:2008/10/31(金) 07:46:27
期待通りの並てになるまでランダムに入れ替える

273 :デフォルトの名無しさん:2008/10/31(金) 07:54:36
きたいどおりのなみて?

274 :デフォルトの名無しさん:2008/10/31(金) 08:11:40
>>272
ほんとにそういうアルゴリズムがあるんだよな
最初見たときギャグかと思ったが
http://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88

275 :デフォルトの名無しさん:2008/10/31(金) 08:54:38
お前らボゴソートさんをあまりなめない方が良い。

276 :デフォルトの名無しさん:2008/10/31(金) 08:54:40
勿論、ギャグですが。

277 :デフォルトの名無しさん:2008/10/31(金) 09:48:11
イテレータを保持して参照しようとするとエラーが出る

erase()はしてない、参照前にpush_back()をした
push_back()すると以前のイテレータが無効になるのか?

278 :デフォルトの名無しさん:2008/10/31(金) 09:52:06
>>277
無効になるコンテナもある。vectorとかdequeとか。
無効にならないコンテナもある。listとかmapとか。

279 :デフォルトの名無しさん:2008/10/31(金) 12:25:13
まさにvector
場所を保持できないので必要なデータをとるときに
最初から検索しなきゃならないので不便だな
listに変更する

280 :デフォルトの名無しさん:2008/10/31(金) 12:29:08
vectorなら単にインデクスアクセスすりゃいいんじゃね?

281 :デフォルトの名無しさん:2008/10/31(金) 12:58:07
インデックスも保持しといたらあてにならんだろう

282 :デフォルトの名無しさん:2008/10/31(金) 13:13:01
push_backしかしないならインデックスは変わらんだろ

283 :デフォルトの名無しさん:2008/10/31(金) 15:29:09
インデックスはとある理由で禁書されている。

284 :デフォルトの名無しさん:2008/10/31(金) 15:45:12
push_backしかしない場合、dequeのイテレータは無効になるが
参照やポインタは無効にならない。

微妙に便利な時もあるかもしれない。

285 :デフォルトの名無しさん:2008/10/31(金) 16:25:56
push_backしかしない場合インデックスは変わらないだろうけど
参照とかポインタは変わるだろ

286 :デフォルトの名無しさん:2008/10/31(金) 16:57:59
vectorならな
dequeだと変わらない

287 :デフォルトの名無しさん:2008/10/31(金) 17:25:06
dequeもメモリ続いてるから、足りなくなったら再確保されてアドレス変わらね?

288 :デフォルトの名無しさん:2008/10/31(金) 17:48:20
> An insert at either end of the deque invalidates all the iterators to the deque,
> but has no effect on the validity of references to elements of the deque.

先頭と末尾への挿入は、イテレータは無効にするが要素への参照は無効にしない。

289 :デフォルトの名無しさん:2008/10/31(金) 17:53:24
↑は規格書の 23.2.1.3 deque modifiers のところね。

290 :デフォルトの名無しさん:2008/10/31(金) 17:53:27
>>287
deque<T>の仕様をとてつもなく乱暴に要約すると、
vector<T*>みたいな構造になってる。
だから拡張されても要素自体のアドレスは変わらない。


291 :デフォルトの名無しさん:2008/10/31(金) 17:55:25
ちなみに両端以外への挿入はイテレータも参照も無効になるから注意

292 :デフォルトの名無しさん:2008/10/31(金) 18:37:10
>>287
ランダムアクセスできるだけでメモリは続いてないでしょ?

293 :デフォルトの名無しさん:2008/11/01(土) 01:17:19
とうとうお前らがdequeのスゴさに気づく時が来た

294 :デフォルトの名無しさん:2008/11/01(土) 01:20:50
いや知ってて当たり前のことばかりだから

295 :デフォルトの名無しさん:2008/11/01(土) 01:21:28
dequeの使いどころがわからん

296 :デフォルトの名無しさん:2008/11/01(土) 01:29:23
上から取ったり、下から取ったり、南京玉簾のような使い方をする場合、dequeほど使えるコンテナは無いぞ。

297 :デフォルトの名無しさん:2008/11/01(土) 01:49:09
「dequeは結構すげえんだぜ!」
っていうデータをまとめた記事(英語)が以前貼られてたね。

298 :デフォルトの名無しさん:2008/11/01(土) 09:50:07
>>295
・ランダムアクセスしたい
・要素を加えたり抜いたりすることがある

そういうときに使う。
vectorでやると要素の追加・削除で領域を連続にするためのコストがかかる。

299 :デフォルトの名無しさん:2008/11/01(土) 11:40:49
listはイテレータを記録すれば、ランダムアクセスできるよね?
イテレータが無効になる場合ある?

300 :デフォルトの名無しさん:2008/11/01(土) 11:48:27
つうかイテレータ記録すればどんなコンテナだろうとランダムアクセスできるんじゃね

301 :デフォルトの名無しさん:2008/11/01(土) 12:57:27
話の焦点が「イテレータを記録するモノ(コンテナなり何なり)」の機能に移るだけだよな、それ。

302 :デフォルトの名無しさん:2008/11/01(土) 14:17:32
>299
結局 vector<list<something>::iterator> みたいなのを使うことになって
vector が登場する罠

303 :デフォルトの名無しさん:2008/11/01(土) 17:56:00
つまり
boost::multi_index
の話しに

304 :デフォルトの名無しさん:2008/11/02(日) 00:29:30
dequeのbuffer sizeってなんぼぐらい?

vc7,8は16bytes
gcc3.4.4(cygwni)は512bytes

vcの16って小さくね?
stringなんかはlistと同じになっちゃわないか

このサイズを指定できるdequeがほしいんだが
boostにあったりするかなあ

305 :sage:2008/11/02(日) 02:27:17
すみませんです。
listのiteratorって、
要素の追加とか削除とかして要素数が変わってしまっても、
そのまま使える保証はあるんでしょうか?
要素の参照は保証されている思うんですが、iteratorが使えるのか。
VCでは実際動くみたいですが言語仕様的にいかがなものか。
ぜひアドバイスおねがいします。

306 :デフォルトの名無しさん:2008/11/02(日) 02:48:55
保証されている。アドバイスとしては仕様書読め。

307 :デフォルトの名無しさん:2008/11/02(日) 02:51:24
付け加えると削除したイテレータ自体は当然無効になる。

308 :sage:2008/11/02(日) 03:15:01
早速の返答ありがとうございます!
ブラボーlist!使いやすさ爆発です。
そして以後ちゃんと仕様書読むようにします。
ありがとうございました。m(_ _)m

309 :デフォルトの名無しさん:2008/11/02(日) 10:20:03
VC使ってる時点で言語仕様も糞も無いと理解しろ。

310 :デフォルトの名無しさん:2008/11/02(日) 11:41:22
VC++6.0の頃じゃないんだから
今は結構まともだよ

311 :デフォルトの名無しさん:2008/11/02(日) 12:10:26
VC++2008と仕様書との相違点はそれほど多くない。
書いてないだけで、これ以外にもあるのかもしれないがw
http://msdn.microsoft.com/en-us/library/x84h5b78.aspx

312 :デフォルトの名無しさん:2008/11/02(日) 13:37:16
むしろgccのほーが異端

313 :デフォルトの名無しさん:2008/11/02(日) 13:45:55
それはない

314 :デフォルトの名無しさん:2008/11/02(日) 14:30:28
MFC(笑)
ATL(笑)

315 :デフォルトの名無しさん:2008/11/02(日) 15:35:16
急にどうした?

316 :デフォルトの名無しさん:2008/11/02(日) 15:45:00
dcc最強

317 :デフォルトの名無しさん:2008/11/02(日) 20:53:06
ecc最強



翻訳的な意味で

318 :デフォルトの名無しさん:2008/11/04(火) 13:56:24
BCCはどうよ
C++Builder2009にはBoost標準添付だったが

319 :デフォルトの名無しさん:2008/11/04(火) 14:33:06
Boostって行っても1.35、しかもフルセットでなくてサブセットだけどな

320 :デフォルトの名無しさん:2008/11/05(水) 11:45:38
map<string int> hoge;

mapを宣言したとき、intの領域は初期化されているんでしょうか?

されていないとしたら、

map<string,int>::iterator itr;
map<string,int>::iterator itrEnd;

itr = hoge.begin();
itrEnd = hoge.end();

while(itr != itrEnd){

itr->second = 0;
itr++;
}


のように初期化すればいいんですかね?

321 :デフォルトの名無しさん:2008/11/05(水) 11:58:44
ちがう

322 :デフォルトの名無しさん:2008/11/05(水) 12:00:49
なんで初期化したいんだろうか

323 :デフォルトの名無しさん:2008/11/05(水) 12:12:16
intのほうでカウントとりたいんです

324 :デフォルトの名無しさん:2008/11/05(水) 12:33:11
map<string int> hoge;

だけだと map コンテナの中身は空っぽだから
string も int もまだ領域確保されていなくて
デフォルト初期化も値初期化もはじまっていない
空のコンテナの begin() と end() は無効な要素を指している
無効な要素に対するアクセスは失敗する

itr->second = 0; // やっちゃらめぇ

だと思います

325 :デフォルトの名無しさん:2008/11/05(水) 12:47:23
空のコンテナなら begin() == end() にならないんだっけ?
そうなるなら>>320を走らせちゃってもアクセス違反にはならないが

326 :デフォルトの名無しさん:2008/11/05(水) 12:51:39
>>324
なるほど

void func(){

map<string int> hoge;

}

の関数内で宣言した場合、関数が呼び出される度に 空っぽになるんでしょうか?

327 :デフォルトの名無しさん:2008/11/05(水) 13:04:07
呼び出される度にbegin()==end()になります

328 :デフォルトの名無しさん:2008/11/05(水) 13:16:46
hoge["str"] ++;

とやればちゃんと0から加算されるんですか?

329 :デフォルトの名無しさん:2008/11/05(水) 13:17:25
空のコンテナのイテレータはbegin()==end()になるって保証は
規格書に書いてあるの?

330 :デフォルトの名無しさん:2008/11/05(水) 13:18:24
>>328
vectorとmapを混同するな

331 :デフォルトの名無しさん:2008/11/05(水) 13:19:34
>>328
規格ではmapにoperator[]を適用した場合もしそのキーが
存在しない時はデフォルトのコンストラクタで初期化される
決まりになってるからint()、つまり0から始まる

332 :デフォルトの名無しさん:2008/11/05(水) 13:22:43
>>329
23.1.7


333 :デフォルトの名無しさん:2008/11/05(水) 13:25:49
>>330
どの辺を混同していますか?

334 :デフォルトの名無しさん:2008/11/05(水) 13:25:53
>>332
サンクス
これは目から鱗だ

335 :デフォルトの名無しさん:2008/11/05(水) 20:23:33
iteratorの位置を動かすとき
++it とかするけど it+=8 のような感じで8個分移動する方法はないの?

336 :デフォルトの名無しさん:2008/11/05(水) 20:26:55
>>335
advance

337 :デフォルトの名無しさん:2008/11/05(水) 20:27:32
もちろん、ランダムアクセス可能なイテレータはit += 8で平気。

338 :デフォルトの名無しさん:2008/11/05(水) 20:36:44
listなのでループで回すしかないか

あと、ある値を持つコンテナを検索する関数を作ったのだが
見つからなかった場合NULLを返そう思ったら
itにNULL代入できない。しかも it ==0とか演算も不可
このような場合みんなはどうしてるん?

339 :デフォルトの名無しさん:2008/11/05(水) 20:40:21
>>338
end返すのはいやなのか?

340 :デフォルトの名無しさん:2008/11/05(水) 20:47:32
thx、打開した

341 :デフォルトの名無しさん:2008/11/05(水) 21:25:09
そもそもfindでいいんじゃね

342 :デフォルトの名無しさん:2008/11/05(水) 21:28:59
stlportのhash_mapにお尻から回す奴はないですか?

343 :デフォルトの名無しさん:2008/11/05(水) 21:33:23
イチジク浣腸はどうだ

344 :デフォルトの名無しさん:2008/11/05(水) 21:53:29
rbegin() rend()

345 :デフォルトの名無しさん:2008/11/05(水) 22:49:22
叙述関数には引数わたせないの?
find_if( List.begin(), List.end(), compare( 引数1 、 引数2 ) );

346 :デフォルトの名無しさん:2008/11/05(水) 22:56:09
ファンクタを使えばいくらでも。

347 :デフォルトの名無しさん:2008/11/06(木) 16:02:53
>>342
vcのstdext::hash_mapならreverse_iteratorがあるぞ

348 :デフォルトの名無しさん:2008/11/07(金) 00:51:20
VC2008とSTLpらすか5.1.7ですけど
_STLP_USE_STATIC_LIBを指定すると
↓と言われてリンクできません。
ファイル 'stlportstld_statix.5.1.lib' を開くことができません。

stlportstld_static.5.1.libならあるんですけど。バグですか?

349 :デフォルトの名無しさん:2008/11/07(金) 01:02:22
ren stlportstld_static.5.1.lib stlportstld_statix.5.1.lib

350 :デフォルトの名無しさん:2008/11/07(金) 01:12:47
#define _STLP_NEW_PLATFORM_SDK 1

351 :デフォルトの名無しさん:2008/11/08(土) 12:18:23
VB6からVC++2005にプログラムを移植してるんですが、
下記の処理がVB版に比べてVC++版では50倍ほど時間がかかりました。
1から順に使われていないID番号を探すアルゴリズムで、内容は全く同じですが、なぜでしょうか?
m_itemは構造体配列で、要素数は600個程度です。
VC++のstd::vectorの実装はクソすぎなんでしょうか?

■VBの処理

Dim i As Long, j As Long
For i = 1 To 65535
 For j = 0 To m_item_num - 1
    If m_item(j).id = i Then Exit For
 Next
  If j = m_item_num Then
   get_new_item_id = i
   Exit Function
 End If
Next

■VC++の処理

size_t i, j;
for( i= 1; i< 0xFFFF; i++ ){
 for( j= 0; j< m_item.size(); j++ )
   if( m_item[j].id == i )  break;
 if( j == m_item.size() )  return i;
}

352 :デフォルトの名無しさん:2008/11/08(土) 12:36:59
>>351
const size = m_item.size();
for(j = 0; j < size; ...

キミのままだと、jのループ後とにm_item.size()関数が評価される。

353 :デフォルトの名無しさん:2008/11/08(土) 12:47:16
VC2005だとm_item[j]が毎回範囲チェックされてる
vector使う前に
#define _SECURE_SCL 0を入れると良い感じらしい

あと、まさかとは思うけどDebug版じゃなくて
Release版で実行してないとかはないよね?


354 :デフォルトの名無しさん:2008/11/08(土) 12:58:48
そもそもループを1重に直したら(VBでもC++でも)もっと速くなると思う。

355 :デフォルトの名無しさん:2008/11/08(土) 12:59:39
setでも使えばいいのに、とも思った

356 :デフォルトの名無しさん:2008/11/08(土) 13:01:24
VBは知らないけど、C++のただの配列とvectorとでも50倍も差はないから、なんか他の要因で遅くなってると思われ。

357 :デフォルトの名無しさん:2008/11/08(土) 13:02:15
あーごめんそれは無理か

358 :デフォルトの名無しさん:2008/11/08(土) 14:00:46
終了条件おかしくないか?

359 :デフォルトの名無しさん:2008/11/08(土) 14:07:46
351ですが、

>>352が主な原因だったようです。>>353でも多少改善しました。
二重ループをやめて、qsort()でもしてから一重ループで探すというのもいいかもしれませんが、
アルゴリズムを変更しないとVBより遅くなるというのは腑に落ちませんね。

ベクターは使い方次第でパフォーマンスに劇的に影響するようで、なんか怖いです。

360 :デフォルトの名無しさん:2008/11/08(土) 14:24:53
VC2008のvectorで
if (int i = 0; i < tbl.size(); i++) tbl[i] ・・・
みたいな使い方と、
配列で、
if (int i = 0; i < TBL_SIZE; i++) tbl[i] ・・・
みたいな使い方をした場合、
Debugビルドで最適化なしだと数十倍の差で、Releaseビルドで、最適化ありだと、二倍程度の差だった。

361 :デフォルトの名無しさん:2008/11/08(土) 14:26:01
このスレ的にはiterator使おうぜ

362 :デフォルトの名無しさん:2008/11/08(土) 14:31:04
>>359
VB知らないんだけど、この場合のm_item_numってなに?
それ次第では、そもそも「内容は全く同じ」という認識が間違ってたことに。

363 :デフォルトの名無しさん:2008/11/08(土) 14:35:47
VBとコードが違わないか?
>for( i= 1; i< 0xFFFF; i++ ){
for( i= 1; i<= 0xFFFF; i++ ){

調べてる要素が違ってるなら50倍違ってもおかしくはないけど。
あとは計測時間が短すぎて時間を計ってるタイマーの精度の違いが出てるとか
とりあえず>>351のコードをReleaseビルド&_SECURE_SCLでコンパイルしてVBより50倍も遅いなんてことあり得ないだろ。

364 :デフォルトの名無しさん:2008/11/08(土) 14:53:51
>359
ちゃんと最適化かけたか?

365 :デフォルトの名無しさん:2008/11/08(土) 15:06:10
STLがVBに負けるなんて悔しい ビクンビクン

366 :351:2008/11/08(土) 15:08:04
すみません。デバッグビルドになってたようです><
なんかデバッグなしにしたり最適化とかするとエラーが出てコンパイルできなかったので、何となく諦めてました。
>>359をやった上で最適化まですると、VBより速くなりました。
めでたしめでたし。

367 :デフォルトの名無しさん:2008/11/08(土) 15:10:02
しね

368 :デフォルトの名無しさん:2008/11/08(土) 15:12:42
まさにVB脳

369 :デフォルトの名無しさん:2008/11/08(土) 15:14:42
二重ループのかわりにstd::find_ifを使ってみようぜ!
あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ
Itemがidをもつぐらいなら用途にあってる可能性高いし


370 :デフォルトの名無しさん:2008/11/08(土) 15:20:36
VBでもデータ構造を変えれば劇的に速くなるな。

371 :デフォルトの名無しさん:2008/11/08(土) 15:27:41
>>369
ちょっとよく分かりませんが、勉強してみます。
今はVBのコードをC++にツラツラ置き換える作業だけをやってます。

VBの配列 → std::vector
VBのString → std::string

という置き換えで、今のところこれ以上のSTLの知識はありません。
アルゴリズムを下手に変えると、新たにバグが混入することになるので。

372 :デフォルトの名無しさん:2008/11/08(土) 15:33:36
VB6と一緒に心中してくれよ。こっちくんな。

373 :デフォルトの名無しさん:2008/11/08(土) 15:40:28
移植させてもらえるだけでも素晴らしいことだと思わないか。

374 :デフォルトの名無しさん:2008/11/08(土) 15:44:24
つうか既にバグ混入しててワロタ
>for( i= 1; i< 0xFFFF; i++ ){

375 :デフォルトの名無しさん:2008/11/08(土) 16:03:45
findを使って作ってみました

enum { N = 600, ID_MAX = 0xffff };

template<typename ID> struct Compare {
Compare(ID i) : m_i(i) {}
template<typename T> bool operator()(T const& i) { return i.id == m_i; }
private:
ID m_i;
};

template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end(), Compare<ID>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}


376 :375:2008/11/08(土) 17:05:13
id_typeとget_idを特殊化することによってより流用できるようにしてみました
参照の参照が怖いのと面倒臭いのが難点だと思いました

template<typename T> struct id_type { typedef typename T::id_t type; };
template<typename T>
typename id_type<T>::type get_id(T const& x) { return x.id; }
template<typename T>
struct Comparator {
typedef typename id_type<T>::type ID;
typedef bool result_type;
Comparator(ID i) : m_i(i) {}
bool operator()(T const& i) const {
return get_id<T>(i) == m_i; }
private:
ID m_i;
};
template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end()
, Comparator<typename Container::value_type>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}

377 :デフォルトの名無しさん:2008/11/08(土) 17:39:34
これはひどい

378 :デフォルトの名無しさん:2008/11/08(土) 18:08:48
なんというオナニー

379 :デフォルトの名無しさん:2008/11/09(日) 02:37:20
数値を文字列にするには
ostringstream を使用する方法がメジャー?

380 :デフォルトの名無しさん:2008/11/09(日) 02:39:59
>>379
たぶん sprintf を使う人のほうが多い。
snprintf が C++ 標準に入ればさらに増えるかもしれない。

結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。

381 :デフォルトの名無しさん:2008/11/09(日) 02:54:15
sprintfはchar確保するの面倒だとおもうけど
利用者が多いのは何か理由があるの?

382 :デフォルトの名無しさん:2008/11/09(日) 02:55:45
>>381 C からの移行組。

383 :デフォルトの名無しさん:2008/11/09(日) 03:10:24
Exceptional C++ Style でstringstreamはsprintfに比べて
だいたい10倍くらい遅いと書かれていた。

384 :デフォルトの名無しさん:2008/11/09(日) 03:30:02
速度的な点もあるけど
printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて
細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、
というのもある。

C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし
「C++らしくない」という良くわからない理由で嫌う人も。
また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。

385 :デフォルトの名無しさん:2008/11/09(日) 03:54:57
書式の設定がめんどくさい上に、長くなってしまう気がするんだが俺の書き方悪いのかな

386 :デフォルトの名無しさん:2008/11/09(日) 04:07:58
>>385
stream のことなら、たぶんそんなもん。

そういえば C++0x でもこの点は特に改善されたような話を聞かないな。
boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。

387 :デフォルトの名無しさん:2008/11/09(日) 10:57:41
>>379
boost::lexical_cast を使うがよい
結局 stringstream 使ってるんだけどな

388 :デフォルトの名無しさん:2008/11/09(日) 11:53:14
>>381
char確保しなくてもいいよ。

std::string str;
int a = 123;

str.resize(256,0);
sprintf((char*)str.c_str(), "%d", a);
str = str.substr(0, str.find('\0'));


389 :デフォルトの名無しさん:2008/11/09(日) 12:04:57
stringにconst_castか…

390 :デフォルトの名無しさん:2008/11/09(日) 12:06:07
c_strの間違いw

391 :デフォルトの名無しさん:2008/11/09(日) 12:23:41
>>388
c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ
っていうかconst外して書き込むなんて無茶苦茶にもほどがある

392 :デフォルトの名無しさん:2008/11/09(日) 12:24:08
#include <vector>
#include <cstdio>
#include <iostream>

int main(int, char *[])
{
std::vector<char> buf(0xff, 0);
int n=10000;
std::sprintf(&buf.front(), "%d", n);
std::cout << static_cast<const char*>(&buf.front()) << std::endl;
return 0;
}

なるへそ

393 :デフォルトの名無しさん:2008/11/09(日) 12:27:03
printf系はセキュリティ面で問題あると思ってたが

問題ないの?

394 :デフォルトの名無しさん:2008/11/09(日) 12:29:46
const外し
か、漢だ!

395 :デフォルトの名無しさん:2008/11/09(日) 12:30:56
nの型がintでlog10(n)が100や200にもなるアーキテクチャがあれば教えて欲しいものだ

396 :デフォルトの名無しさん:2008/11/09(日) 12:41:02
string使おうがvector使おうが
スタック上に領域確保してれば
char配列となんら変わらん

397 :デフォルトの名無しさん:2008/11/09(日) 12:46:24
>>396
大概はそうだが、規格には反するな

398 :デフォルトの名無しさん:2008/11/09(日) 13:07:49
>>393
使い方の問題。
ユーザー入力をフォーマット文字列に使おうとする大バカと
最大文字数の指定方法を知らないバカがそう言ってるだけ。

399 :デフォルトの名無しさん:2008/11/09(日) 13:18:32
>>398
具体的に何の関数を言ってるかわからんけど、
すくなくともsprintfはあぶない

400 :デフォルトの名無しさん:2008/11/09(日) 13:28:49
一般的にやるべきでないとされていることを「だって出来るじゃん」の一言でやってしまう・・・

くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!

401 :デフォルトの名無しさん:2008/11/09(日) 13:31:44
>>399
具体的にどこが危ないのか教えてよ

「使い方を間違えたら危ない」というレベルの話なら
「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから

402 :デフォルトの名無しさん:2008/11/09(日) 13:39:40
>>401
え?最大文字数を指定できないじゃん

それが危険だと思えないならまぁ好きにするといいよ

403 :デフォルトの名無しさん:2008/11/09(日) 13:42:38
sprintfで100byteのバッファしか取っていないのに、
100文字以上有るかもしれないユーザ入力を与えるとかね。

404 :デフォルトの名無しさん:2008/11/09(日) 13:44:11
VCのsprintf_s使ってます(^^)

405 :デフォルトの名無しさん:2008/11/09(日) 13:46:22
ハア?

char buff[100]
sprintf(buff, "%.80s", user_input);

これのどこが危ないって?

406 :デフォルトの名無しさん:2008/11/09(日) 13:47:28
まさしく>>398の最下行に書いてあるバカが言ってるとしか思えないんですけど。

407 :デフォルトの名無しさん:2008/11/09(日) 13:48:08
C++ で何で sprintf なんて使ってるのん?
しかも STL スレで・・・。
ostringstream か boost::format を使っとけ。

408 :デフォルトの名無しさん:2008/11/09(日) 14:00:20
>>405
そういうことを分かって使う分にはいいけど、
実際に使う人間が必ずしも分かっているとは限らないし、
分かっていても、うっかりやってしまう危険性があるよね。

409 :デフォルトの名無しさん:2008/11/09(日) 14:04:25
つうかそんな単純なケースならいいけど、
色々出力したりロケールが絡むと出力結果の予想がしんどいだろ

410 :デフォルトの名無しさん:2008/11/09(日) 14:08:01
そんなレベルなら、「vectorで[]は使わないほうが良い。at()を使え。」と同じじゃないの。

特に>>399はわざわざ>>398に対して言ってるんだから
もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。

そりゃ、切捨て前提という仕様は良くないとか
全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど
それとセキュリティ的な問題は全く別だから。

柔軟性だって例えば
std::vecotr<char> buff;
buff.resize(???);
sprintf(&buff[0], "%.*s", buff.size()-1, str);
のような使い方である程度確保できるし。

>>409
「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。

411 :デフォルトの名無しさん:2008/11/09(日) 14:13:43
>>410
> 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
この一行が>>409の話とは全く別の話なのは、そういうジョークなの?

412 :デフォルトの名無しさん:2008/11/09(日) 14:14:33
ostreamが状態を持ってるのもしんどい

413 :デフォルトの名無しさん:2008/11/09(日) 14:14:53
あ、別にユーザー文字列をそのまま配列に落とす場合に限らないよ。

そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから
例えば
sprintf(filename, "file-%.80s%d.dat", input, num);
のような形式でも、充分に最大値は予想できるし。
あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。

414 :デフォルトの名無しさん:2008/11/09(日) 14:17:55
使い難さが有るということは、ミスり易いってことじゃね?
ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。

415 :デフォルトの名無しさん:2008/11/09(日) 14:19:43
いわゆる、バグというものは、ミスることによって起こるんだから。
十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、
世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。

416 :409:2008/11/09(日) 14:19:58
>>410

いやだから
出力結果の予想が困難→バッファ長の予想が困難
セキュリティ的にあぶなくね?
という話し

気をつけて使え
って話しなら
そうですね
としか言えないけど

みなミスりがちだからsnprintfとかVC++のセキュア関数とか
あるんじゃないの?

417 :デフォルトの名無しさん:2008/11/09(日) 14:32:40
いやだから
全然>>398への反論になってない。
「使い方を知らないのが問題」なだけでは
「セキュリティ的に問題がある」ということにはならないから。
まあ、416の言いたいことはもっともだし
他にもっと良い選択肢があるならそちらを使うべきなのは確か。
でも残念ながら標準ではない。


ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。
>>398の最下行を無視して>>402と反論するような人が>>399みたいに書くわけだから。

418 :デフォルトの名無しさん:2008/11/09(日) 14:35:28
あ、それと、「最大値の見積もりを間違える」点についてだけど

別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。
多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
例えば>>405のようにね。

419 :デフォルトの名無しさん:2008/11/09(日) 14:37:36
>多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
ええええー

420 :デフォルトの名無しさん:2008/11/09(日) 14:38:20
最大量がきっちり分かってる状況じゃないかそれでいけるのは

421 :デフォルトの名無しさん:2008/11/09(日) 14:41:24
は?
当然過ぎて困りますが
ユーザー入力の部分の最大量は>>405のように制限して
その上で他の部分の見積もりが多少違っていても大丈夫なように
ということですけど。

422 :デフォルトの名無しさん:2008/11/09(日) 14:42:37
ユーザー入力の部分の最大値を制限するのは
当然というか大前提だと思っていましたが、皆さんは違うのですか。
認識の違いですね。

423 :デフォルトの名無しさん:2008/11/09(日) 14:44:22
つまり、%fは使うなってことですね、判ります。

424 :デフォルトの名無しさん:2008/11/09(日) 14:48:54
あー、sprintfは使い方が難しくセキュリティ的な問題を起こしやすいので使うべきではない。
とすると、

同じように、
使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない
ということになりますね。

つまり、
C++をやめましょう、と。
Javaあたりがよろしいでしょうか。
実際、世間の潮流もそういう流れになってますしね。

425 :デフォルトの名無しさん:2008/11/09(日) 14:49:50
>>423
%.fを使ってください

426 :デフォルトの名無しさん:2008/11/09(日) 14:52:52
>>425
sprintf(buf, "%10.0f", 1e100);

427 :デフォルトの名無しさん:2008/11/09(日) 15:02:23
snprintf()なら、
snprintf(s, sizeof(s), …
ってやっとけば安全だけど、
sprintf()は人間が数えないといけないじゃん。

>>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、
書式が複雑になってくると、ミスる可能性がでてくるよ。

てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。

428 :デフォルトの名無しさん:2008/11/09(日) 15:04:36
いつまで STL スレで sprintf の話をやってんだよ。
そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。

429 :デフォルトの名無しさん:2008/11/09(日) 15:05:04
だよな!

430 :デフォルトの名無しさん:2008/11/09(日) 15:07:32
>>426
printf("%.2u", -1);
の時に必ず2桁に収まると思う人は居ませんね。
これと同様に最大桁数が見積もれる点は変わらないと思いますが。
いや、最大桁数はbit数に依存するので環境依存ですけど。

>>427
だからsnprintfはC++においては非標準だって。
それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。
「C++はセキュリティ的に問題がある」というのと同様。

431 :デフォルトの名無しさん:2008/11/09(日) 15:07:47
ところで型安全って何ですか?

432 :デフォルトの名無しさん:2008/11/09(日) 15:10:57
snprintfってC99からなんだっけ…
0xでは標準になるのかなぁ

433 :デフォルトの名無しさん:2008/11/09(日) 15:12:10
なりません

434 :デフォルトの名無しさん:2008/11/09(日) 15:13:40
相変わらず話題の質が下がると賑わうな。

435 :デフォルトの名無しさん:2008/11/09(日) 15:20:11
>>432
ドラフト N2798 の 17.1 [library.general] p9 より
> This library also makes available the facilities of the C99 standard library,
> suitably adjusted to ensure static type safety.

436 :デフォルトの名無しさん:2008/11/09(日) 15:23:46
_scprintfで数えたらいい

437 :デフォルトの名無しさん:2008/11/09(日) 15:28:25
>>430
doubleの最大桁数を常に見込んでバッファを確保するとでも?
%fを使わずに、素直に%gを使えば済むじゃん。
そういう使いこなしを必要とするからsprintf()は難しいと言うなら判るが、
使いこなしてもいないのに語ろうとするな。

438 :デフォルトの名無しさん:2008/11/09(日) 15:33:24
結論:ostrstream or boost::lexical_cast or boost::format or boost::egg::to_string

439 :デフォルトの名無しさん:2008/11/09(日) 16:00:48
結論:いままで聞いた話を総合すると、一番スマートなのはこれ。

std::string str;
int a = 123;
str.resize(12);
sprintf_s((char*)str.c_str(), str.size()-1, "%d", a);
str.resize(str.find('\0'));

ストリームとかで中間バッファを使うのはメモリの無駄だし、sprintfの書式指定能力の高さは最強。

440 :デフォルトの名無しさん:2008/11/09(日) 16:02:21
>>439
その場合だとstr.size()は0が返るよ。
あと規格は大切にね。

441 :デフォルトの名無しさん:2008/11/09(日) 16:03:16
>>その場合だとstr.size()は0が返るよ。
ごめん勘違いした。

でもその書き方は受け入れられない。

442 :デフォルトの名無しさん:2008/11/09(日) 16:05:42
c_str()を出力バッファに使う男の人って

443 :デフォルトの名無しさん:2008/11/09(日) 16:06:48
もはやSTLじゃねーなw

444 :デフォルトの名無しさん:2008/11/09(日) 16:13:28
vectorを使えばかろうじてSTLに関する話題の範疇に入…らないか

445 :デフォルトの名無しさん:2008/11/09(日) 16:17:17
>>439
× (char*)str.c_str()
○ &str[0]

あと、せっかくだから sprintf_s() の戻り値使えよ。

446 :デフォルトの名無しさん:2008/11/09(日) 16:30:07
>>445
規格ではstd::stringのメモリ上の連続性は保証されていない。
std::vectorと混同するな

447 :デフォルトの名無しさん:2008/11/09(日) 16:33:39
どうせ大丈夫なんだから別に良いじゃん


448 :デフォルトの名無しさん:2008/11/09(日) 16:35:47
仕事で一緒にならないなら別にいいよ

449 :デフォルトの名無しさん:2008/11/09(日) 16:38:17
>>446
C++0x で連続性は保証されるようになるし、
現状のどの実装でも連続性は成り立っている。

450 :デフォルトの名無しさん:2008/11/09(日) 16:41:45
>>446
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
まぁ現時点で保証が無いというのは確かなんだけどね。

451 :デフォルトの名無しさん:2008/11/09(日) 17:38:58
size_t count = _sctprintf(_T("%d"), 777) + 1;
std::vector<TCHAR> buffer(count);
_stprintf_s(&buffer[0], count, _T("%d"), 777);


452 :デフォルトの名無しさん:2008/11/09(日) 17:52:09
TCHAR(笑)

453 :デフォルトの名無しさん:2008/11/09(日) 18:42:07
>>449
そういう話をしたいのなら実装依存スレへ逝け

454 :デフォルトの名無しさん:2008/11/09(日) 18:43:16
>>451
そういう話をしたいのなら実装依存スレへ逝け

455 :デフォルトの名無しさん:2008/11/09(日) 19:54:23
STLのlistを利用したプログラムを実行中、
"list iterators incompatible" という例外が発生しました。これはどういったエラーでしょうか?
開発環境はVisualStudio2005 AcademicEditionです。

456 :デフォルトの名無しさん:2008/11/09(日) 20:01:13
ソース晒せ

457 :デフォルトの名無しさん:2008/11/09(日) 20:06:15
transformの使い方に関して質問があります。環境はGCCです。
目的は、stringの中身をすべて小文字に変換したいのです。

#include <string>
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>

string aa = "AbCdEfG";
transform(aa.begin(),aa.end(),aa.begin(),tolower)

で、aaの中身をすべて小文字に変換できません。
理由はわかりますでしょうか?

458 :デフォルトの名無しさん:2008/11/09(日) 20:10:50
>>457
とりあえずコンパイルエラーだろ。
エラーの意味がわからんということならエラーメッセージ晒せ。

459 :デフォルトの名無しさん:2008/11/09(日) 20:14:20
俺の環境では全部小文字になるが・・・。

460 :デフォルトの名無しさん:2008/11/09(日) 20:20:44
使用したソース

#include <string>
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
string aa = "AbCdEfG";
transform(aa.begin(),aa.end(),aa.begin(),tolower);
}

以下がコンパイルエラー

test.cpp: In function 'int main()':
test.cpp:9: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits\
<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> \
> >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded f\
unction type>)'


よろしくどうぞおねがいします。

461 :デフォルトの名無しさん:2008/11/09(日) 20:23:26
>456
ttp://www.hsjp.net/upload/src/up51891.txt
本来の拡張子は.hppです。ごちゃごちゃしててすみません。
103行目のupdate_etc()関数が怪しいと思っているのですが…

462 :デフォルトの名無しさん:2008/11/09(日) 20:24:53
Effective STL に乗ってたネタかな

463 :デフォルトの名無しさん:2008/11/09(日) 20:32:13
>>457
たぶん、こういう関数オブジェクトを作ってそれを渡せばいいよ。
struct my_tolower : std::unary_function<char, char>
{
char operator ()(char c) const
{
return std::tolower(c);
}
};

464 :デフォルトの名無しさん:2008/11/09(日) 20:54:01
transform(aa.begin(), aa.end(), aa.begin(), static_cast<int(*)(int)>(tolower));
通った

typeof(aa)::value_type : char
tolower : int(*)(int)
でtolowerをchar(*)(char)と型推論しようとして失敗してる

なので正確にキャストして与えてやればおk?

465 :デフォルトの名無しさん:2008/11/09(日) 20:57:12
>>461
まずはデバッガのバックトレースを見たりブレークポイントつかったりしてあたりつければいいよ
segvだろうが、unhandled exceptionだろうがどこで発生したか分かるから


466 :デフォルトの名無しさん:2008/11/09(日) 21:00:18
>>464
>>460の最後の行の中にunresolved overloaded function typeってのがあるでしょ。
C++では、tolowerが多重定義されているのだが、
それではテンプレート引数の型が決定できないということでエラーになる。
だから、>>464のようにキャストが必要になる。>>463みたいに他の方法も考えられる。

467 :デフォルトの名無しさん:2008/11/09(日) 21:06:27
>>466
>>464
>>460
ありがとうございます。
なるほどよく分かりました!


468 :デフォルトの名無しさん:2008/11/09(日) 21:21:38
>465
ありがとうございます。とりあえずどこで投げてるのか絞り込んでみます。

ただ、list iterators incompatibleというのがどういう状態を指すのか、よくわからないのです。

469 :デフォルトの名無しさん:2008/11/09(日) 21:37:51
vcのstlのincludeディレクトリにて"list iterators incompatible"で全文検索するとか

470 :デフォルトの名無しさん:2008/11/09(日) 22:01:54
>469
そういう方法もあるのですね
listの中を覗いてみます。
ありがとうございます

471 :デフォルトの名無しさん:2008/11/12(水) 11:38:03
dequeにpush_backで要素を挿入していくのは、予め配列をサイズ決め打ちで宣言して代入していくのより遅いですか?

472 :デフォルトの名無しさん:2008/11/12(水) 12:13:18
>>471
速度は実測が基本。

一般的に、 push_back() を繰り返す場合、配列要素のメモリ確保回数が増えるので
遅くなる可能性が高くて、それでも push_back() ならコピーコンストラクタが使われるので
要素の型によっては代入に比べて速い可能性もある。

473 :デフォルトの名無しさん:2008/11/12(水) 20:00:12
気になるけど図るのが面倒臭いなら、reserveしておけば精神的に気が和らぐ。

474 :デフォルトの名無しさん:2008/11/12(水) 22:12:15
vectorならreserveは必須だと思う
dequeってどうだろう

475 :デフォルトの名無しさん:2008/11/12(水) 22:21:59
dequeはある一定の長さのブロックが不連続に確保されるそうだから
reserveしたらシステムからメモリを持ってくる時間は稼げるけどvector
と違ってメモリの再配置は起きにくいんだよね

476 :デフォルトの名無しさん:2008/11/12(水) 23:24:27
それは実装によるんでは。

477 :デフォルトの名無しさん:2008/11/12(水) 23:32:37
実装によるのはもちろんだが一般的な実装の話ね

478 :デフォルトの名無しさん:2008/11/13(木) 01:13:27
dequeのpush_backが(償却じゃなくて正真正銘の)定数時間であることは規格で要求されてたはず
だから一概に実装に依るとも言えない

479 :デフォルトの名無しさん:2008/11/13(木) 07:48:57
dequeはpush_back/push_frontで既存要素のコピーが起こりえないのがありがたい
まあ最初から要素数が判ってるならvector一択だけど

480 :デフォルトの名無しさん:2008/11/13(木) 20:37:08
STLのことは良く分からないけど、
list,stack,queue,vector,dequeで空のクラスSampleのポインタを、
10万個格納、(1個delete&削除・1個格納)*10万回、
空になるまでdelete&要素削除 してみた。
vectorは予め追加要素の2倍reserve()した。
要素の追加削除はvector,stack以外『古い物から削除』、前から取り出して後ろから追加でやった。
stack、queueはそれぞれコンテナdequeを利用。

list 68.11 秒
vector 20.344 秒
stack 27.5 秒
deque 9.468 秒
queue 9.438 秒

queueが速すぎてワロタ
dequeは操作する方向次第でstackとほぼ同等
queue,stack,dequeはこの場合、実質同じモノだし

queue,stackのコンテナを変えたら悲惨な結果になった
PCが悲鳴を上げたのでこれ以上のテスト回数は勘弁

481 :デフォルトの名無しさん:2008/11/13(木) 20:41:18
あぁ、次はboost::circular_bufferだ…

482 :デフォルトの名無しさん:2008/11/13(木) 20:58:12
>481
>480と同条件、上限20万個として計測してみた。
平均5.5秒くらいだった

483 :デフォルトの名無しさん:2008/11/13(木) 23:21:57
ひょっとしてlistってあんまり使わない方が良い?

484 :デフォルトの名無しさん:2008/11/13(木) 23:51:07
むしろ連結リストのくせに良い数字が出てると思うがね

485 :デフォルトの名無しさん:2008/11/14(金) 00:18:06
リンクリストより配列のほうがキャッシュに引っかかりやすいからいいぞってMSも言いている。
http://msdn.microsoft.com/ja-jp/library/eye126ky.aspx

486 :デフォルトの名無しさん:2008/11/14(金) 00:33:54
>>483
状況次第
listのほうが向いてる使い方もあるしね

487 :デフォルトの名無しさん:2008/11/14(金) 00:54:30
途中(先頭末尾以外)の要素の削除はlistじゃないとやってられんやろー

488 :デフォルトの名無しさん:2008/11/14(金) 00:55:31
あとリストの連結やリストの分割もあるか

あれ?そんなことできたっけ・・・?

489 :デフォルトの名無しさん:2008/11/14(金) 01:01:03
とりあえずただデータを突っ込んで置きたい(出し入れ順番とかどうでも良い)場合には、
リストは不向きってことか

490 :デフォルトの名無しさん:2008/11/14(金) 01:14:52
昔はやたらとリンクリストを使うのがいいとされていたが、
今のご時世でも初心者にリンクリストを教えたがる間抜けが後を絶たない。
普通にstd::vectorを使えるように仕込んでおけば、std::listを使うのも苦労はないだろうに。

491 :デフォルトの名無しさん:2008/11/14(金) 01:15:39
>>487
途中の削除もdequeは結構速い。
listは削除してもイテレータが無効にならないのが利点かな。

492 :1/2:2008/11/14(金) 15:46:52
listを使っていてよく分からない事態に遭遇したので質問します。
長くなってしまったので申し訳ありませんが分割投稿します。

環境:VC++2005 / XP

typedef struct globalArray
{
  int type;
  char name[100];
  float variable[5][5];
} globalVar;

typedef struct nodeDat
{
  CShaderNode *nodeKind;
  globalVar varDat[5]; // 上の構造体(globalVar)
  int dataNum;
  float power;
} nodeData;

typedef struct _data
{
  nodeData mainNode; // 上の構造体(nodeData)
  nodeData blendNode; // 上の構造体(nodeData)
  nodeData subNode; // 上の構造体(nodeData)

  int materialNum;
  dxMaterial *matrials[MAX_MATNUMBER];
} dataBlock;

493 :2/2:2008/11/14(金) 15:47:25

上のような構造体が有りまして、一番下のdataBlockをリストとして扱っているのですが、

dataBlock tmp;
/* 〜 データ作成処理 〜 */
/* 〜 挿入先探索 〜 */
insert(itr,tmp);

とデータを挿入してリストを覗くと途中までしか正しくデータが入っていません。
データ作成過程で"",NULL,0.0fと全て初期値を用いてデータを初期化しているのですが、
data[0]->mainNode.varDat[0].variable
以降のデータが未初期化のまま生成されています。

構造体を入れ子にする前は正しく動いていたのですが、
listを扱う際は構造体を入れ子で扱うとNG等の制約があるのでしょうか。
ご教授お願いいたします。

494 :デフォルトの名無しさん:2008/11/14(金) 15:53:19
それだけだと推測しかできん
・初期化の部分が不完全か
・未初期化というのが勘違いか
・リスト操作がバグってるか
のいずれかしかないが、心当たりがないなら何か見逃してるんだろう
そのようなNG的制約は無いので大丈夫

495 :492:2008/11/14(金) 16:04:13
返信ありがとう御座います。

(※(int)はキャストではなく型を説明上明示するために便宜的につけた物です。紛らわしくてすみません。)

例えば仮データ(tmp)で、
(int)materialNumを0で初期化したのがリストのデータでは
(int)materialNumが-33686019になってしまっているので、
>・リスト操作がバグってる
のでしょうかね……

ありがとうございます。制約は無いときいて安心しました。
もう少し追ってみます。

496 :492:2008/11/14(金) 16:30:43
連投失礼いたします。
色々弄ってみたところ、構造体のメンバの記述順を入れ替えると正確に入るデータと入らないデータが出てきました。
詳しく調べたところ、連結しようとしている構造体は180byteで、リストで正しく入るのは96byteの領域まででした。
数字的にこれって多分仕様ですよねぇ……

497 :デフォルトの名無しさん:2008/11/14(金) 18:55:54
-33686019ってことは0xfdだろ?
ちゃんとdeep-copyせんと。

498 :デフォルトの名無しさん:2008/11/14(金) 19:59:55
dataBlock tmpA;
/* 〜 データ作成処理 〜 */
dataBlock tmpB;
tmpB = tmpA;

ってやって、tmpAとtmpBは同じ内容の独立したオブジェクトになる?

499 :デフォルトの名無しさん:2008/11/14(金) 20:04:28
誰にもわかりません

500 :492:2008/11/14(金) 21:01:27
返信ありがとう御座います。
>>498さんのを実行してみたところ、同内容の独立したオブジェクトに成りました。

deep-copyなのですが、
/* 〜データ作成処理〜 */
を抜けた後、tmpに全ての値がきちんと入っていることを確認し、
data.insert(itr,tmp);
でインサートを行っているのですがコピーに関してはlist側で処理されている様で、
こちら側からコピー処理を定義することが出来るのでしょうか。

501 :デフォルトの名無しさん:2008/11/14(金) 21:50:22
>>500
コピー演算子をオーバーロード。

502 :デフォルトの名無しさん:2008/11/15(土) 00:35:09
その場合はコピーコンストラクタじゃ?

503 :492:2008/11/15(土) 01:20:38
すみません、何かもう全く関係ないところが原因っぽいです。
構造体のメモリ領域と他のクラスのメモリ領域が被ってる……

504 :デフォルトの名無しさん:2008/11/15(土) 03:13:32
あるIDを割り当てるクラスを作成しようと思っています
インターフェースとしてはこんなかんじで
class IDAllocator{
uint32_t T AllocID();
void FreeID(uint32_t id);
};
クライアントコードに対して、一意なIDを割り当てるのですが、
IDを使い終わった後は返却し、後ほど再利用できる様にしたいです。

IDを割り当てる際に、現在使われてないIDの内、最小の数値のIDを返す仕様にしたいのですが、
STL的にかっちょいい実装方法を教えてください

今のところ割り当て済みのIDをvectorに記録しておいて、0から1ずつ増やしてvectorに無いIDがあれば
それを使うというどう考えても効率の悪いやり方でやっています


505 :デフォルトの名無しさん:2008/11/15(土) 03:44:37
使い終わって返却されたIDをpriority_queueに記録し、再利用するときはそこから取り出す

506 :デフォルトの名無しさん:2008/11/15(土) 03:48:12
priority_queueが空なら新たに生成する→新しいIDは最も大きい数値になる ってことか

507 :デフォルトの名無しさん:2008/11/15(土) 09:29:56
インテレータの有効性をチェックする方法はない?
何も代入されてないときなど、別の変数でフラグ保持するのは面倒だと思うので

508 :デフォルトの名無しさん:2008/11/15(土) 09:59:37
とりあえずend()でも入れとけとか、
有効/無効状態をチェックするなとか、
そもそもインテレータって何とか。

509 :デフォルトの名無しさん:2008/11/15(土) 14:38:28
そんなあなたにboost::optional

510 :デフォルトの名無しさん:2008/11/16(日) 01:05:27
>488
splice 使えばできるはず。

511 :デフォルトの名無しさん:2008/11/16(日) 01:53:37
これっておかしくない?
ttp://www.geocities.jp/ky_webid/cpp/library/008.html

512 :デフォルトの名無しさん:2008/11/16(日) 01:57:21
>>511
どこがどうおかしいと思うのか書けやカス

513 :デフォルトの名無しさん:2008/11/16(日) 11:21:20
とりあえずテンプレートクラスはクラステンプレート

514 :デフォルトの名無しさん:2008/11/16(日) 12:11:13
enumの値か?

515 :デフォルトの名無しさん:2008/11/16(日) 12:14:51
それは別に間違ってなくね

516 :デフォルトの名無しさん:2008/11/16(日) 12:16:41
MIRROR_X

517 :デフォルトの名無しさん:2008/11/16(日) 12:24:52
問題ないだろ
MIRROR_X = SCALE | ROTATE
を意図して書いてあるならな。

518 :デフォルトの名無しさん:2008/11/16(日) 12:35:10
はー?

519 :デフォルトの名無しさん:2008/11/16(日) 12:50:45
enum bitset
二大不要物(笑)

520 :デフォルトの名無しさん:2008/11/16(日) 12:54:39
enumを不要とか言うやつは素人

521 :デフォルトの名無しさん:2008/11/16(日) 13:04:54
enum要らないとか言う奴はただのバカかTMPしない人だろ

522 :デフォルトの名無しさん:2008/11/16(日) 13:08:23
>C言語であれば、ANDやOR等の演算を使って管理しますが、C++ではbitsetが利用できます。
この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。

523 :デフォルトの名無しさん:2008/11/16(日) 13:10:34
じゃぁbitsetってなんに使うの?


524 :デフォルトの名無しさん:2008/11/16(日) 13:13:37
ビット単位のフラグの管理をせざるを得ないときに使うかなぁ。ま、そのときが来たら考えるよ。

525 :デフォルトの名無しさん:2008/11/16(日) 13:16:23
>>522
上級者のあなたがおすすめするサイトを教えてください

526 :デフォルトの名無しさん:2008/11/16(日) 13:20:55
>>523
>>519

527 :522:2008/11/16(日) 13:23:15
残念ながら今のところ、初心者に安心してお勧めでキルサイトは見つけていない。
したがって、申し訳ないが期待には応えられない。

ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。
中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。

528 :デフォルトの名無しさん:2008/11/16(日) 13:34:14
enumは型安全じゃないのが気に要らないな

529 :デフォルトの名無しさん:2008/11/16(日) 13:35:07
C++のenumは、|=するだけでキャストが必要な糞仕様

530 :デフォルトの名無しさん:2008/11/16(日) 13:44:26
俺は#define派
enumだとアセンブラソースから使えないから

531 :デフォルトの名無しさん:2008/11/16(日) 13:54:37
>>529
そもそもビットフラグで使うとは限らないわけで…

532 :デフォルトの名無しさん:2008/11/16(日) 14:08:21
>>519

unionに失礼だろw

533 :デフォルトの名無しさん:2008/11/16(日) 16:05:41
それは128ビットとかに使うぞ

534 :デフォルトの名無しさん:2008/11/17(月) 09:37:02
お前らみんな、unionさんに謝れ!

535 :デフォルトの名無しさん:2008/11/17(月) 15:37:45
アマチュアの俺からすると分からんのだけど、unionって実際の業務で使われてるの?
enumなんかは割りと使ってるんだけど

536 :デフォルトの名無しさん:2008/11/17(月) 15:48:34
>>535
使うこともあるよ。Cでbitsetもどきを実装するときとか。

537 :デフォルトの名無しさん:2008/11/17(月) 17:54:37
大きな数値から上位ビットと下位ビット分けたり

538 :デフォルトの名無しさん:2008/11/17(月) 18:04:00
・建前
unionは環境に激しく依存するから、使わない方がいい。

・本音
いまどきビッグエンディアンとか無いだろw

539 :デフォルトの名無しさん:2008/11/17(月) 18:11:15
オレも、エンディアン、ビット幅、signedの右シフト、除算の符号は実装決めうちで作ってる

540 :デフォルトの名無しさん:2008/11/17(月) 18:14:14
>>538
サーバ系では未だにSunが頑張っているから無視できないのよね。

541 :デフォルトの名無しさん:2008/11/17(月) 18:33:05
うにおんは組み込みCで以前使ってた事がある
おそらく今でも使ってる

542 :デフォルトの名無しさん:2008/11/17(月) 18:45:55
1の補数はもう絶滅でいいだろ

543 :デフォルトの名無しさん:2008/11/17(月) 18:50:13
引き算どうすんだよw

544 :デフォルトの名無しさん:2008/11/17(月) 18:59:06
負数の表現方法のことだろ。

545 :デフォルトの名無しさん:2008/11/17(月) 19:17:14
それは2の補数

546 :デフォルトの名無しさん:2008/11/17(月) 19:19:57
http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE

547 :デフォルトの名無しさん:2008/11/17(月) 22:16:38
よその言語だとASCIIにIEEE754も決め打ちと化しているものもあるよな。

548 :デフォルトの名無しさん:2008/11/17(月) 23:10:13
未だにIBMのサーバでEBCDICとかあるから油断できない

549 :デフォルトの名無しさん:2008/11/17(月) 23:51:08
>>538
俺はエンディアン入れ替えたいからunion使ってる。
union {
double a;
char b[8];
}

550 :デフォルトの名無しさん:2008/11/17(月) 23:54:30
つーかネットワークバイトオーダはbigだし
画像処理でもエンディアン入れ替えなんてよくやるでしょ

全部littleで済むと思ってる人ってどういう世界に生きてるんだ?

551 :デフォルトの名無しさん:2008/11/18(火) 00:08:27
意識する場面なんてほとんどないな

552 :デフォルトの名無しさん:2008/11/18(火) 00:11:46
>>550
そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない)
というのがエンディアン決め打ちのコーディングだと思う。

553 :デフォルトの名無しさん:2008/11/18(火) 00:14:19
#ifdefるだろjk

554 :デフォルトの名無しさん:2008/11/18(火) 00:41:30
いや、自動判断する。
例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。

555 :554:2008/11/18(火) 00:51:28
s/int foo = 0/int foo = 1/

まぁ、unionは使わないけれど。

556 :デフォルトの名無しさん:2008/11/18(火) 00:53:15
スレから脱線するが、標準の方法でエンディアンをコンパイル時に知る方法ってある?
実行時ならできるんだが

557 :デフォルトの名無しさん:2008/11/18(火) 00:58:32
boost/detail/endian.hppとかを見る限り、標準では無さそうだね

558 :デフォルトの名無しさん:2008/11/18(火) 01:50:26
>>556
コンパイル環境のエンディアンを?
それとも、ターゲット環境?

559 :デフォルトの名無しさん:2008/11/18(火) 01:58:09
>>556
VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。

560 :デフォルトの名無しさん:2008/11/18(火) 13:28:05
>>554
PDP-11位だしな変態なの

561 :デフォルトの名無しさん:2008/11/18(火) 14:44:19
>>560
お前はSun、IBM、MIPSを敵に回した。

562 :デフォルトの名無しさん:2008/11/19(水) 16:25:22
vectorについてですが
array.reserve(array.size());
でぴったりのサイズに変わるかと思ったのですが変わりません。

大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が
メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。
何かいい方法はないでしょうか?

563 :デフォルトの名無しさん:2008/11/19(水) 16:28:10
vector<T>(array).swap(array);

564 :デフォルトの名無しさん:2008/11/19(水) 16:32:01
reserveは拡大する方向にしか働かないのでは

565 :デフォルトの名無しさん:2008/11/19(水) 16:36:13
>>>562
§23.2.4.2.2
void reserve(size_type n);
2 Effects: A directive that informs a vector of a planned change in size, so that it can manage the storage
allocation accordingly. After reserve(), capacity() is greater or equal to the argument of
reserve if reallocation happens; and equal to the previous value of capacity() otherwise. Reallocation
happens at this point if and only if the current capacity is less than the argument of reserve().
3 Complexity: It does not change the size of the sequence and takes at most linear time in the size of the
sequence.

greater or qrual と書いてあるから等しいかもしくは大きいとなるので
ぴったりのsize()になる保証はない。

566 :デフォルトの名無しさん:2008/11/19(水) 16:37:52
おっと

equal to the previous value of capacity() otherwise.

ともあるから、縮小しようとしてもcapacity()は変化しない事になる。
詰まるところ>>563のようにスワップ技法に頼るしかない。

567 :562:2008/11/20(木) 11:20:10
>>563-566
出来ました。ありがとうございます。
サイズの縮小は出来ないんですね。勉強になりました

568 :デフォルトの名無しさん:2008/11/21(金) 01:13:58
今までイテレータが指してるコンテナのことをイテランドと呼んでたんですが
そんなの聞いたことないって言われました

ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…)
普通に使いますよね?

569 :デフォルトの名無しさん:2008/11/21(金) 01:17:07
はつみみです

570 :デフォルトの名無しさん:2008/11/21(金) 01:18:50
ぐぐった時点で気づいてるだろwwww俺は聞いたこと無いな
iterandにしたら多少出てくるけど、まぁスズメの涙ね

571 :デフォルトの名無しさん:2008/11/21(金) 01:24:17
あーやっぱり?
iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで
あっちでは普通の言葉かもしれないと思ってたんですが

じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう
「イテレータが指してるコンテナ」ですか?

572 :デフォルトの名無しさん:2008/11/21(金) 01:24:23
イテレータが指してるコンテナ?

vector<int>::iterator it;
だと
vectorが「イテランド」になんの?


573 :デフォルトの名無しさん:2008/11/21(金) 01:27:10
例えば
vector<int> v;
vector<int>::iterator it = v.begin();

なら、itはvのイテレータで、vはitのイテランドです

574 :デフォルトの名無しさん:2008/11/21(金) 01:38:03
iterateeとか言ってみる。

575 :デフォルトの名無しさん:2008/11/21(金) 03:09:59
Pythonではiterable

576 :デフォルトの名無しさん:2008/11/21(金) 03:40:26
>>575
それは意味が全然違う

577 :デフォルトの名無しさん:2008/11/21(金) 03:50:39
iterable はまんまイテレータ(とみなせるもの)。

578 :デフォルトの名無しさん:2008/11/21(金) 12:37:36
itのコンテナ 程度にしか言わないな

579 :デフォルトの名無しさん:2008/11/21(金) 12:54:20
イテランドがまあ、何を指している言葉かは
 オペレータ⇔オペランド
からの類推でわかるけどさ。

それより世間一般ではイテレータなんだろうが、
俺はついついイタレータと読み書きしてしまう今日この頃。

580 :デフォルトの名無しさん:2008/11/21(金) 13:15:51
>>579
おいたが過ぎますぞ

581 :デフォルトの名無しさん:2008/11/21(金) 17:24:11
いてまうどー

582 :デフォルトの名無しさん:2008/11/21(金) 17:52:19
とりあえず、イテランドがあんまり一般的な言葉じゃないことはよくわかりました
内輪以外では使うのを控えることにします
ありがとうございました

583 :デフォルトの名無しさん:2008/11/22(土) 02:05:31
あんまりという表現なのか・・・w

584 :デフォルトの名無しさん:2008/11/22(土) 02:41:16
つうかどこでその言葉を習ったんだろ

585 :デフォルトの名無しさん:2008/11/22(土) 15:27:41
イテランドでぐぐるとこのスレが引っかかるなw

586 :デフォルトの名無しさん:2008/11/22(土) 15:47:04
イテランドたんのアニメ化が決定したそうです。

587 :デフォルトの名無しさん:2008/11/22(土) 16:56:13
とある言語の被反復構造(イテランド)

588 :デフォルトの名無しさん:2008/11/22(土) 17:09:09
パパ〜遊園地いきたーい
よーし家族みんなでイテランドにでもいくか〜

589 :デフォルトの名無しさん:2008/11/22(土) 17:16:39
井手ランド

590 :デフォルトの名無しさん:2008/11/22(土) 17:32:30
とある要素の列挙目録(イテレータ)

591 :デフォルトの名無しさん:2008/11/22(土) 17:46:29
イテランドたんの要素数は103000ですね、わかります。

592 :デフォルトの名無しさん:2008/11/22(土) 18:29:32
変数 X が std::list 型で変数 I がその reverse_iterator だとすると

X.erase( I.base() );

で I が示す要素の隣を消去するので I はまだ使えますよね。
VC8 で I を使うと assert で止まるんですけど。

593 :デフォルトの名無しさん:2008/11/22(土) 18:55:16
その1行だけ示されてもなあ。

594 :デフォルトの名無しさん:2008/11/22(土) 19:24:06
デバッガで追えばいいじゃん……

595 :デフォルトの名無しさん:2008/11/22(土) 19:29:51
string strに入っている文字列のi番目から後ろをstr2に代入するにはどうすればいいですか?

596 :デフォルトの名無しさん:2008/11/22(土) 19:56:15
str2 = str.substr(i);

597 :デフォルトの名無しさん:2008/11/22(土) 19:57:28
substr

598 :デフォルトの名無しさん:2008/11/22(土) 20:06:38
>>592
使えない

599 :デフォルトの名無しさん:2008/11/22(土) 20:25:38
595です。ありがとうございました。あとstringを==で比較するときに小文字と大文字を区別しな方法はありますか?
一度変換しないとだめでしょうか?

600 :デフォルトの名無しさん:2008/11/22(土) 21:06:58
stringはそもそも「大文字と小文字」っていう概念が無いと思う

601 :デフォルトの名無しさん:2008/11/22(土) 21:10:43
大文字だの小文字だのは真面目にやり出すと大変だぞ
ロケールの問題とか

602 :デフォルトの名無しさん:2008/11/22(土) 21:19:34
>>598
std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。

603 :デフォルトの名無しさん:2008/11/22(土) 21:23:31
stringは複雑なんですね・・・わかりました

604 :デフォルトの名無しさん:2008/11/22(土) 21:30:16
複雑なのはstringではなく、真の国際化です

605 :デフォルトの名無しさん:2008/11/22(土) 21:51:06
"ガ"と"ガ"を==で比較してtrueにできないからstd::stringはクソ

606 :デフォルトの名無しさん:2008/11/22(土) 21:54:04
CLでいうところのequalpを手前で実装しろクソ

607 :デフォルトの名無しさん:2008/11/22(土) 21:58:17
@と`を同じ文字と解釈するべき環境とかあるからな

608 :デフォルトの名無しさん:2008/11/22(土) 21:59:34
7bit ASCII内での大文字小文字無視なら、char_traits自作でやる実装を何かの本で見た。

609 :デフォルトの名無しさん:2008/11/22(土) 22:03:38
typedef pair<double,string> HOGE;



void func(??){

HOGE p;
p.first = data;
p.second = chordname;
pairs.push_back(p);

}


int main(){
deque<HOGE> pairs;

for(){
func();
}

}



mainで作ったdequeにfunc関数で値を入れたいんですがどうしたらいいですか?
もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。

610 :デフォルトの名無しさん:2008/11/22(土) 22:04:09
引数

611 :デフォルトの名無しさん:2008/11/22(土) 22:11:52
引数なのはわかるんですが・・・



void func(deque<HOGE> &pairs){

}


main(){

func(pairs);

}

こうですかね?

612 :デフォルトの名無しさん:2008/11/22(土) 22:15:07
>もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。

むちゃくちゃだ。


613 :デフォルトの名無しさん:2008/11/22(土) 22:20:12
えっと具体的にどうおかしいですか?


614 :デフォルトの名無しさん:2008/11/22(土) 22:22:48
頭がおかしい

615 :デフォルトの名無しさん:2008/11/22(土) 22:35:40
mainのスコープを抜ける=プログラムが終わる

プログラムが終わった後にdequeが初期化されるって、
atexit内で初期化したいのか

616 :デフォルトの名無しさん:2008/11/22(土) 23:14:48
>>615
ちょっと表現を間違えました。

617 :デフォルトの名無しさん:2008/11/22(土) 23:44:46
えっとそれで611で大丈夫ですかね?

618 :デフォルトの名無しさん:2008/11/23(日) 00:42:48
private な vector<int> hoge を外部から走査して数値を得たい

const int *mage = &hoge;

のような方法でするのかな?と思ったんですが
セオリーな方法はどんな書き方なんでしょうか

619 :デフォルトの名無しさん:2008/11/23(日) 00:45:27
参照せずに値じゃね?

620 :618:2008/11/23(日) 00:45:59
いやいまいちお前がなにいってんのかわかんないけど

621 :デフォルトの名無しさん:2008/11/23(日) 00:47:43
hogeをスキャンして数値を返すメソッドを公開すればいいじゃない

622 :デフォルトの名無しさん:2008/11/23(日) 00:52:10
プレイベートなデータなので、捜査には礼状が必要です。

623 :デフォルトの名無しさん:2008/11/23(日) 00:53:45
vectorの中身は連続性が保証されている、
つまりprivateなvectorの、先頭アドレスを返すような関数作って
それをconst int * で受け取り(もちろんサイズも)、
そのconst int * を走査するのかな?と思ったけど

書き方がわかんないから>>618になってしまった
ゴメンナサイ(´・ω・`)

624 :デフォルトの名無しさん:2008/11/23(日) 00:58:23
beginとendのペアを返す

625 :デフォルトの名無しさん:2008/11/23(日) 01:02:01
>>621に一票

626 :デフォルトの名無しさん:2008/11/23(日) 01:09:49
>>621
スキャンって・・・?
丸ごとコピーしてそれを返す?
内部でiterator保持して呼び出す毎に進める?

現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`)


ちなみに具体的にはintではなく
x,y座標が入ってるpair<int,int>で
これを取得してGUIでリアルタイムに線を引きたい
という状況です

627 :デフォルトの名無しさん:2008/11/23(日) 01:23:53
現場の人とか関係ねーw
>>618の走査 == >>621のスキャン
だろOKJK

それから情報後出しって嫌われるの知らないかね
いいから黙ってソースコードべたっと貼れ

628 :デフォルトの名無しさん:2008/11/23(日) 01:27:26
では俺はコールバックを提案しよう。

629 :618:2008/11/23(日) 02:19:18
>>627
GUIライブラリ使ってる上に携帯厨なんです(ノ∀`)

typedef std::pair<int,int> Pos
class Hoge{
public:
 const Pos *getPosArray(int *arraySize);

private:
 std::vector<Pos> p;
};

const Pos *Hoge::getPosArray(int *arraySize){
 *arraySize = p.size();

 return *arraySize ? &p[0] : 0;
}

こうしてみた
コーディングスタイル云々は勘弁してつかーさい

630 :デフォルトの名無しさん:2008/11/23(日) 02:28:25
const std::vector<Pos>& ppp() const { return p; } でいいじゃん


631 :デフォルトの名無しさん:2008/11/23(日) 14:43:29

int function(string &buff){


}

main(){

string buff:

function(buff);
}


mainで宣言したstringに関数で値を入れるには、これであってます?

632 :デフォルトの名無しさん:2008/11/23(日) 14:45:30
>>631
いいよ。

633 :デフォルトの名無しさん:2008/11/23(日) 14:50:04
ありがとうございます。

functionでの代入時は


buff ="mozi";
みたいな感じでいいですか?

634 :デフォルトの名無しさん:2008/11/23(日) 14:51:30
俺ルールだと、関数で値を入れる場合はポインタ渡しにして、
単に値を渡すだけなら参照にしてるな。

635 :デフォルトの名無しさん:2008/11/23(日) 14:56:47
>>633
それでいいよ。

値を渡すだけでも、返してもらうときでも参照でいいよ。
const のあるなしで区別すればOK

636 :デフォルトの名無しさん:2008/11/23(日) 14:57:54
>>634
M$ なんかが当初そういう方針だった気がするな。
NULL チェックが必要になるから個人的には微妙なんだが・・・。

637 :デフォルトの名無しさん:2008/11/23(日) 16:31:25
>>635
賛成。


それとは別に、俺は std::string 程度なら値を返すようにしたい。
function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。
また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。

オーバーロードして両方のバージョンを用意すればいいだけだけど。

638 :デフォルトの名無しさん:2008/11/23(日) 19:27:34
>>635 こうしろと?
int& function(string &buff){




639 :デフォルトの名無しさん:2008/11/23(日) 19:28:40
>>638
いや、引数の話だよ。

640 :デフォルトの名無しさん:2008/11/23(日) 19:58:24
>>635
int function(int&, double& )とかした場合
function( 1, 0.1) は使えないだろ
こんな使い方禁止?

641 :デフォルトの名無しさん:2008/11/23(日) 20:05:30
>>640
直前のカキコとか見れよ。

引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、
そういう使い方は意味ないだろ。


642 :デフォルトの名無しさん:2008/11/24(月) 19:24:39
istreamから数バイトずつ読み取って意味解釈していくような
プログラムを作っているのですが、

istream input;
short header1;
input.read(&header1, sizeof(header1));
short header2;
input.read(&header2, sizeof(header2));

こんな感じでしか書けないのでしょうか?

short header1 = input.read(sizeof(header1));
short header2 = input.read(sizeof(header2));

などと書ければよいのですが・・


643 :デフォルトの名無しさん:2008/11/24(月) 19:27:10
>>642
read<short>(input) とかいう関数でも作れば良いんじゃない?

644 :デフォルトの名無しさん:2008/11/24(月) 20:13:34
>>642
short header1, header2;
if(input >> header1 >> header2) {
// ...
}

645 :デフォルトの名無しさん:2008/11/24(月) 20:26:01
>>644
そんな餌に(AAry

646 :642:2008/11/25(火) 01:57:17
>>643

こんなのを作ってみました。

template<class T>
std::istream& read(std::istream& is, T& data)
{
return is.read(reinterpret_cast<char*>(&data), sizeof(T));
}


>>644

それって、inputが文字列なら良いですが、
バイナリ読みしたい場合はダメですよね?



647 :デフォルトの名無しさん:2008/11/25(火) 16:50:03
vectorのイテレータは足し算ができるのに、listのイテレータではできないんですね。
listで添え字アクセスのようなことをやる場合は、

list<int>::iterator it = list.begin();
for(size_t i= 0; i< index; i++ ) it++;

みたいなことをやらないといけないの?

挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、
indexを使ったアクセスも多いので、なんかブサイクですね。
いい方法ないですか?

648 :デフォルトの名無しさん:2008/11/25(火) 16:55:04
>>647
コンテナの種類とランダムアクセスイテレータに関して
も少し理解を深めといた方が。

649 :デフォルトの名無しさん:2008/11/25(火) 16:57:49
>>647
std::advance()

650 :デフォルトの名無しさん:2008/11/25(火) 17:16:49
>>648
ランダムアクセスをしたいならvectorを使うべきだと?
一般論ではそうでしょう。

しかし、
vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。
listの場合は配列要素の数にかかわらずコストは一定です。

だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、
処理速度的に最適なものを選びたいと思っています。

それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。

>>649
listの要素の入れ替えをしたくはないのです。

651 :デフォルトの名無しさん:2008/11/25(火) 17:22:20
>>650
つdeque
ランダムアクセスできて挿入も速い

652 :デフォルトの名無しさん:2008/11/25(火) 17:26:38
>>651
私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。

653 :デフォルトの名無しさん:2008/11/25(火) 17:41:22
>>652
dequeは途中の挿入も(そこそこ)速いんだよ。
dequeの仕様を満たそうとすると、どうしてもそういう実装になる。

654 :デフォルトの名無しさん:2008/11/25(火) 18:02:08
>>650
要件がいまいちつかめないので何ともいえないけど、
規格を眺めてlistが最適だと思うなら仕方がないんじゃない?
listはランダムアクセス出来ないしね。

でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ

655 :デフォルトの名無しさん:2008/11/25(火) 18:14:47
>>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ


656 :デフォルトの名無しさん:2008/11/25(火) 18:39:03
周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ
そういうのはほっとくに限る

657 :デフォルトの名無しさん:2008/11/25(火) 18:44:27
挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで

658 :デフォルトの名無しさん:2008/11/25(火) 18:51:51
advanceを思いっきり勘違いしてる節があるよね

659 :デフォルトの名無しさん:2008/11/25(火) 18:58:49
>>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。

660 :デフォルトの名無しさん:2008/11/25(火) 19:05:31
>>659
何が?

661 :デフォルトの名無しさん:2008/11/25(火) 19:28:06
用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど

662 :デフォルトの名無しさん:2008/11/25(火) 19:31:05
>>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな

663 :デフォルトの名無しさん:2008/11/25(火) 19:35:42
質問に答えてるだけなんだから、>>647>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない

664 :デフォルトの名無しさん:2008/11/25(火) 20:03:28
std::vector<要素 *>

665 :デフォルトの名無しさん:2008/11/25(火) 20:30:10
skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな

666 :デフォルトの名無しさん:2008/11/25(火) 20:40:43
setについて質問です
http://www5c.biglobe.ne.jp/~ecb/cpp/07_15.html
要素の追加(追加場所をイタレーターで指定) 定数時間

とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?

667 :デフォルトの名無しさん:2008/11/25(火) 21:02:51
>>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが

668 :デフォルトの名無しさん:2008/11/25(火) 21:04:52
>>666
insertのことだと思うが

669 :デフォルトの名無しさん:2008/11/25(火) 21:11:14
>>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ

670 :デフォルトの名無しさん:2008/11/25(火) 21:15:27
vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?

671 :デフォルトの名無しさん:2008/11/25(火) 21:17:35
>>670
ないです。

672 :デフォルトの名無しさん:2008/11/25(火) 21:18:02
あります
vectorから取り除いたときのdeleteし忘れ

673 :デフォルトの名無しさん:2008/11/25(火) 21:20:48
>>670
オブジェクトの多重参照

674 :デフォルトの名無しさん:2008/11/25(火) 21:54:32
FUGAはduobleとstringのpairです

multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?


count関数がありますけど使い方が・・・

huga.count("hogehoge");みたいな感じで使いたいんです

675 :デフォルトの名無しさん:2008/11/25(火) 22:04:16
>>674
count_if()

676 :デフォルトの名無しさん:2008/11/25(火) 23:21:30
>>671-673
サンクス deleteしなきゃだったんだな
ありがとう

677 :デフォルトの名無しさん:2008/11/26(水) 00:50:01
>>670
ptr_vectorでも使えば

678 :デフォルトの名無しさん:2008/11/26(水) 11:06:22

KOUZOUTAI data[100];

partial_sort( data, data + 10 ,data+100, Sortpred1)

ってできますけど



vector<KOUZOUTAI> data(size);



partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1)

ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?

679 :デフォルトの名無しさん:2008/11/26(水) 11:18:38
>>678
data.begin() + 10

680 :デフォルトの名無しさん:2008/11/26(水) 12:37:31
const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?

681 :デフォルトの名無しさん:2008/11/26(水) 15:34:21
typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator>
を作って変換しろ

682 :デフォルトの名無しさん:2008/11/26(水) 15:46:58
>>681
std::set, std::map の検索は普通の実装で対数時間

683 :デフォルトの名無しさん:2008/11/26(水) 18:49:39
*reinterpret_cast<std::set<A>::iterator*>(&cit)

大体の実装なら通るよ
細かいこと気にすんなってwwwww

684 :デフォルトの名無しさん:2008/11/26(水) 20:24:23
対数時間なら別にいいんじゃね

685 :デフォルトの名無しさん:2008/11/27(木) 01:02:08
>>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?

686 :デフォルトの名無しさん:2008/11/27(木) 01:35:37
>>680
定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>

687 :デフォルトの名無しさん:2008/11/30(日) 15:23:23
vector<vector<T> > WArray;
WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?

688 :デフォルトの名無しさん:2008/11/30(日) 15:44:30
> 全体のデータサイズは、size_of()関数で取得できるけど、

できるか?

689 :デフォルトの名無しさん:2008/11/30(日) 15:57:26
>>688
>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;

690 :デフォルトの名無しさん:2008/11/30(日) 16:29:30
いや、それ全体じゃないから。

691 :デフォルトの名無しさん:2008/11/30(日) 17:38:11
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?

692 :デフォルトの名無しさん:2008/11/30(日) 17:41:32
マルチ市ね

693 :デフォルトの名無しさん:2008/11/30(日) 17:45:42
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください

694 :デフォルトの名無しさん:2008/11/30(日) 18:34:07
さっさとしね

695 :デフォルトの名無しさん:2008/11/30(日) 19:02:34
大体わかるけどマルチ野郎には絶対教えない

696 :デフォルトの名無しさん:2008/12/04(木) 00:08:26
こんなファイルがあって、
--
a foo FOO
a fooz FOOZ
a foz FOZ
b bar BAR
b baar BAAR
--
その場合、こんな関係を現わしているんだけど、
--
a-+-foo
  +-fooz
  +-foz

b-+-bar
  +-baar
--
どんなデータ構造にするのが手頃か相談に乗ってくれまいか。

697 :デフォルトの名無しさん:2008/12/04(木) 00:17:04
何やりたいかによるだろうが、単に vector vector ではだめなの?

698 :デフォルトの名無しさん:2008/12/04(木) 00:26:09
aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。

699 :デフォルトの名無しさん:2008/12/04(木) 00:31:12
mapでいいだろ

700 :デフォルトの名無しさん:2008/12/04(木) 00:32:12
楽しようと思えばmap<string,map<string, string> >かなぁ

701 :デフォルトの名無しさん:2008/12/04(木) 00:51:58
>>698
なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。

702 :デフォルトの名無しさん:2008/12/04(木) 01:17:48
multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら

703 :デフォルトの名無しさん:2008/12/04(木) 01:34:40
struct Entry {
string type, id, name;
bool operator<(const Entry &a) const { return type < a.type; }
};
multiset<Entry> entries;

でequal_range使わせるかな

704 :デフォルトの名無しさん:2008/12/04(木) 02:41:11
定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。

705 :696=698:2008/12/04(木) 06:11:17
レスありがと。

なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。

# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w

706 :デフォルトの名無しさん:2008/12/04(木) 20:31:19
vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?

vec.erase(vec[5])
vec[5].erase()

みたいなことはできませんか?

707 :デフォルトの名無しさん:2008/12/04(木) 20:34:31
begin()+5

708 :706:2008/12/04(木) 20:36:56
おおー。感動です。ありがとうございました。

709 :デフォルトの名無しさん:2008/12/04(木) 22:10:14
まあ使い辛いとは思うがな・・・。

710 :デフォルトの名無しさん:2008/12/04(木) 22:28:47
関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧

711 :デフォルトの名無しさん:2008/12/04(木) 22:29:42
. はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。

712 :デフォルトの名無しさん:2008/12/04(木) 22:34:59
右辺値やな

713 :デフォルトの名無しさん:2008/12/05(金) 00:12:57
for_eachの使い方を知ったときは感動したけどやっぱり使いづらい

714 :デフォルトの名無しさん:2008/12/05(金) 00:21:25
lambda なしに for_each だけあってもね・・・。

715 :デフォルトの名無しさん:2008/12/05(金) 10:23:09
range adapterも欲しいナ

716 :デフォルトの名無しさん:2008/12/05(金) 18:00:27
rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない

717 :デフォルトの名無しさん:2008/12/06(土) 15:46:46
deque<string> buff;


にpusu_back()は定数時間ですか?それと

buff[0]みたいなアクセスはありですか?

718 :デフォルトの名無しさん:2008/12/06(土) 16:32:10
「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。

あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。

答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。

719 :デフォルトの名無しさん:2008/12/06(土) 16:39:40
>>718
そんなのはいいから答え教えろかす

720 :デフォルトの名無しさん:2008/12/06(土) 16:46:12
長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな

721 :デフォルトの名無しさん:2008/12/06(土) 16:49:17
std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています

722 :デフォルトの名無しさん:2008/12/06(土) 17:45:09
>>720
> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?

723 :デフォルトの名無しさん:2008/12/06(土) 18:13:35
むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw

724 :デフォルトの名無しさん:2008/12/06(土) 18:18:33
これらの操作を提供するための条件として規定されてるからね。

725 :デフォルトの名無しさん:2008/12/07(日) 22:15:49
set とかは insert だしな。

726 :デフォルトの名無しさん:2008/12/09(火) 14:44:05
vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです

727 :デフォルトの名無しさん:2008/12/09(火) 15:04:51
vector<vector<int> > v;

728 :デフォルトの名無しさん:2008/12/09(火) 16:27:55
ありがとっ

729 :デフォルトの名無しさん:2008/12/09(火) 17:01:36
これって問題ある?

class CVector
{
  vector<int> A;
}

vector<CVector> B;


CVector.A.resize(10);
B.resize(10);

730 :デフォルトの名無しさん:2008/12/09(火) 17:03:22
class CVector
{
  vector<int> A;
}←セミコロンがない

vector<CVector> B;


CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);

731 :デフォルトの名無しさん:2008/12/09(火) 17:21:46
あそうか、こうしないとインスタンスが作れなかった


class CVectorSub
{
public:
  vector<int> A;
};

class CVectorMain
{
public:
  vector<CVector> B;
};

class C
{
public:
  CVectorSub vSub;
  CVectorMain vMain;

  void Resize()
  {
    vSub.resize(10);
    vMain.resize(10);
  }
};


732 :デフォルトの名無しさん:2008/12/09(火) 17:24:20
やばい
2次元配列じゃなくなってる
意味ねぇ

733 :デフォルトの名無しさん:2008/12/09(火) 17:39:28
あ!わかったthx!

class CVectorSub
{
public:
  vector<int> A;
};

class C
{
public:
  CVectorSub vSub;
  vector<CVectorSub> vMain;

  void Resize()
  {
    vSub.A,resize(100);
    vMain.resize(10);
  }
};

734 :デフォルトの名無しさん:2008/12/09(火) 17:44:36
うわ・・・これダメだ

735 :デフォルトの名無しさん:2008/12/09(火) 17:45:35
>>733
vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。
わかってるならいいんだけど。

エスパーすると
vector<vector<int> > vec;
vec.resize(10);
for(int i=0; i!=vec.size(); ++i)
{
vec[i].resize(10);
}
なんじゃないかと。
違ったら無視して。

736 :デフォルトの名無しさん:2008/12/09(火) 17:56:13
いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX

737 :デフォルトの名無しさん:2008/12/11(木) 11:12:04
2次元配列の初期化とポインタの使い方あってますか?

vector<vector<int>> vec(5, vector<int>(100, 0));
vector<vector<int>>* pVec = vec;
pVec[3]->resize(200);
pVec[3][180] = 12345;


738 :デフォルトの名無しさん:2008/12/11(木) 11:33:26
いいえ。

739 :デフォルトの名無しさん:2008/12/11(木) 11:37:41
>>737
> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >

2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。

740 :デフォルトの名無しさん:2008/12/11(木) 12:27:03
ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし

つーか何でポインタが出てくんの?w

741 :デフォルトの名無しさん:2008/12/11(木) 12:35:38
何がしたいかよく分からない例だが
そのまま直すとこんな感じか

vector< vector<int> > vec(5, vector<int>(100, 0));
vector< vector<int> > *pVec = &vec;
(*pVec)[3].resize( 200 );
(*pVec)[3][180] = 12345;

しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;

742 :デフォルトの名無しさん:2008/12/11(木) 12:44:08
ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい

vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!



743 :デフォルトの名無しさん:2008/12/11(木) 13:06:59
そこでテンプレート関数の出番ですよ

main()
{
vector< vector<int> > vint;
vector< vector<char> > vchar;
if(〜〜〜)
  test(vint);
else
  test(vchar);
}

templete<class T>
test(T &vector)
{
vector[3].resize(200);
vector[3][180] = 12345;
}

適当に書いたから間違ってるかも分からん

744 :デフォルトの名無しさん:2008/12/11(木) 13:27:33
>>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。

745 :デフォルトの名無しさん:2008/12/11(木) 13:40:36
いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ

746 :デフォルトの名無しさん:2008/12/11(木) 13:45:38
今更勉強するより0xまで待った方がいいかもなー

747 :デフォルトの名無しさん:2008/12/11(木) 23:41:07
それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか


748 :デフォルトの名無しさん:2008/12/12(金) 06:28:40
なに微妙に興奮してんのw

749 :デフォルトの名無しさん:2008/12/12(金) 07:10:55
>>748
オ○ニーしながらだからねw

750 :デフォルトの名無しさん:2008/12/12(金) 09:04:47
上級者すぐるw

751 :デフォルトの名無しさん:2008/12/13(土) 01:33:45
[SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)

752 :デフォルトの名無しさん:2008/12/13(土) 10:34:59
0x ってもうあと一年しか残ってないんだ

753 :デフォルトの名無しさん:2008/12/13(土) 12:13:07
もしかして 09 でなくて 0xa だったりして

754 :デフォルトの名無しさん:2008/12/13(土) 12:24:32
すみません、c++のカスタムアロケータでの質問なんですが
カスタムアロケータとしてmy_allocatorを作り、
それを指定したbasic_stringを
typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string;
と定義しました。

それでやりたいことなんですが
my_string ms = "ms test";
std::string ss = "ss test";
ms = ss;
と、アロケータの違うコンテナ同士で代入をしたいのです。

今はとりあえず
my_string ms = "ms est";
std::string ss = "ss test";
ms = ss.c_str();
としてますが、ちょっと不恰好で気になってしまいます。
なにかスマートな方法はありますでしょうか?




755 :デフォルトの名無しさん:2008/12/13(土) 12:50:12
assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());

756 :デフォルトの名無しさん:2008/12/13(土) 13:04:10
おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。

757 :デフォルトの名無しさん:2008/12/13(土) 13:19:49
ss.assign(ms.begin(), ms.end());

758 :デフォルトの名無しさん:2008/12/15(月) 18:59:03
STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。

759 :デフォルトの名無しさん:2008/12/15(月) 19:12:31
失敗ってどんな?

760 :758:2008/12/15(月) 19:15:39
>>759 insert()したときの戻り値の.secondが必ずfalseになる

761 :デフォルトの名無しさん:2008/12/15(月) 20:35:44
エラーが起きる最小限のソース貼ってみ

762 :758:2008/12/15(月) 21:15:36
↓にうpしときました
http://www3.uploda.org/uporg1858304.zip.html

Passはstlです

一応環境も書いときます
WinVista SP1
VS9

763 :デフォルトの名無しさん:2008/12/15(月) 22:26:08
一時オブジェクト?

764 :デフォルトの名無しさん:2008/12/15(月) 22:45:41
>>762
ttp://msdn.microsoft.com/en-us/library/ms632679.aspx
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。

765 :758:2008/12/15(月) 22:46:02
ローカルのものをmapにはinsert出来ないということですか?

766 :デフォルトの名無しさん:2008/12/15(月) 23:01:01
764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ

767 :758:2008/12/15(月) 23:11:12
なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。

768 :デフォルトの名無しさん:2008/12/15(月) 23:12:11
>>765

// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功

769 :デフォルトの名無しさん:2008/12/15(月) 23:18:39
わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn;
でいいじゃない

770 :758:2008/12/15(月) 23:25:16
無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw

771 :デフォルトの名無しさん:2008/12/16(火) 12:17:45
STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う

772 :758:2008/12/16(火) 17:26:11
CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。

773 :デフォルトの名無しさん:2008/12/17(水) 17:11:03
vector<int> vec;
vec.push_back(3, 10);
というふうに書けないのはなぜですか?
Insertで配列が動的に増えないで溢れるということは、これができないと、
vec.push_back(10);
vec.push_back(10);
vec.push_back(10);
と3行分の処理を書かないといけないとおもうのですが、他にいい方法はありませんか?

774 :デフォルトの名無しさん:2008/12/17(水) 17:29:28
resizeを使え

775 :デフォルトの名無しさん:2008/12/17(水) 17:29:37
vec.insert(vec.end(), 3, 10);
でよろしい

776 :デフォルトの名無しさん:2008/12/17(水) 17:30:24
fill_n(vec.begin(), 3, 10);

777 :デフォルトの名無しさん:2008/12/17(水) 17:35:08
>>773
for(int i=0;i!=3;++i)
vec.push_back(10);
っていう単純な話ではない?

ちょっと違うかもしれないがboostにこういうのがある。
ttp://www.kmonos.net/alang/boost/classes/assign.html

778 :デフォルトの名無しさん:2008/12/17(水) 17:36:23
>>775
それだとendを指定しておけば配列が3つ増えてくれるんですか?
endじゃなくて中間を指定すると要素は3つずれて配列数は減らないで後ろの3要素が消滅しませんか?


779 :デフォルトの名無しさん:2008/12/17(水) 17:38:03
3つずれて配列数は 増えないで 後ろの3要素が消滅
の間違えです

780 :デフォルトの名無しさん:2008/12/17(水) 17:45:35
増えます。
しません。

781 :デフォルトの名無しさん:2008/12/17(水) 17:48:04
>>776
これがfill_n一行でできるということでしょうか?

deque<int> deq;
deq.resize((deq.size()-1)+3;
deq.insert(deq.begin(), 3, 10);


782 :デフォルトの名無しさん:2008/12/17(水) 17:49:24
>>780
まじですか?本のどこを読み間違えたんだろう・・・
すいませんでした。

783 :デフォルトの名無しさん:2008/12/17(水) 17:56:13
解決しましたが、書きなおさせてください

deque<int> deq;
deq.resize((deq.size()-1)+3);
deq.push_front(10);
deq.push_front(10);
deq.push_front(10);

でした。もっと勉強しますありがとうございました。

784 :デフォルトの名無しさん:2008/12/17(水) 21:34:38
>>783
resizeは要らないから

785 :デフォルトの名無しさん:2008/12/18(木) 22:36:00
dequeでどんどん要素を追加していく場合はスタックにつまれるんですか?またはヒープ領域ですか?

786 :デフォルトの名無しさん:2008/12/18(木) 22:59:03
ヒープ

787 :デフォルトの名無しさん:2008/12/18(木) 23:11:18
フリーストア

788 :デフォルトの名無しさん:2008/12/18(木) 23:12:34
>>786
ありがとうございます。
どんどん増やしていってもう領域が確保できないってなったらなんかエラーがかえってきますか?

789 :デフォルトの名無しさん:2008/12/18(木) 23:13:50
>>788
帰ってくるかもしれないし、帰ってこないかもしれません。環境によっても振る舞いが変わりますので諦めてください。

790 :デフォルトの名無しさん:2008/12/18(木) 23:21:48
概念的にはstd::bad_allocが投げられることになっている。

791 :デフォルトの名無しさん:2008/12/19(金) 03:01:14
mapと(STLportの)unordered_mapの簡単な速度比較ベンチ書いて試してみたんだけど
どんな条件にしてもunordered_mapの方が速くなる。
一般的に言ってmapには自動的に順序付けされる以外の使いどころってある?
mapの方が速くなるようなコードや環境って割りとあるもの?

792 :デフォルトの名無しさん:2008/12/19(金) 04:48:45
>>788-790
領域が確保できないときはデフォルトのアロケータを使ってるなら std::bad_alloc が
投げられることになる。これは規格で決められていること。

「どんどん増やしていって」ということだと max_size() を超えたときの std::length_error が
先に飛んでくるかもしれない。

793 :デフォルトの名無しさん:2008/12/19(金) 04:53:07
>>791
スピードについてはハッシュの使える unordered_map より速くなることは少ないだろうね。
そう言えるからこそ新しく規格に盛り込まれたんだろうし。

ただしハッシュ関数が適切でないときに逆転する可能性は考えられると思う。

794 :デフォルトの名無しさん:2008/12/19(金) 12:33:35
>>791
順番に並べるという制約が付いたものとそうでないものを比べれば
余計な制約のない方が一般に高速に実装できるというのは当然じゃないかと思う

795 :デフォルトの名無しさん:2008/12/19(金) 20:39:06
vec.erase(vec[i], vec[i+2]);
これエラーになるんですが、
この場合のイテレータってどう書けばいいんですか?

796 :デフォルトの名無しさん:2008/12/19(金) 21:01:07
すいません解決しました
vec.begin+i

797 :デフォルトの名無しさん:2008/12/19(金) 21:09:28
>>792
MFC 使ってると代わりに CMemoryException 例外が投げられたりする。
一度これでハマった。

798 :791:2008/12/19(金) 21:36:00
>>793
なるほど、ハッシュ関数の質が効率に強く影響するのが特性であると。
整数のような単純なkeyではデメリットが表面化しないということか。

>>794
そうかもしれないけど、ハッシュコンテナが「一芸に秀でる」ような
アルゴリズムだったら一概に言えないかと思って。
元々はツリーの方が挿入・検索・削除の混在に強いと聞いたので試してみたら
それほどでもなかったという話だけど。

799 :デフォルトの名無しさん:2008/12/19(金) 21:44:30
ハッシュがデメリットになるっつーと、
ハッシュ値のとりうる範囲がやたら広いときくらいか?

800 :デフォルトの名無しさん:2008/12/19(金) 22:12:38
同じキーのデータが大量に入る可能性がある時とか

801 :デフォルトの名無しさん:2008/12/19(金) 22:58:25
>798
キーの衝突が発生しない限り、挿入、検索、削除のいずれもハッシュの方が高速だと思うんだが。O(1) vs O(log n) だよな?

802 :デフォルトの名無しさん:2008/12/19(金) 23:15:14
メモリ消費量なんつー尺度もありましてね

803 :デフォルトの名無しさん:2008/12/19(金) 23:16:10
「キーの衝突が発生しない限り」はな
実際にはその保証が難しい場合もある
そうすると最悪O(n)になっちゃうからリアルタイム性が求められる場合とかは使えない
そういうときはどんなに最悪でもO(logn)が保証される(適切に作られた)ツリーコンテナの方がいい

まあフツーのPCアプリなら何も考えずにハッシュコンテナでいいことが多いけど
常にそれでいいと考えてると落とし穴に嵌ることもあるという話だと思う

804 :デフォルトの名無しさん:2008/12/20(土) 01:38:35
hashtree

805 :デフォルトの名無しさん:2008/12/20(土) 04:11:23
>>798
テストコードを晒してくれ。
順序性が必要な時でも unordered_map の方が早かったんだよな?
itor++ とかするコードでだよな?
知らないみんなの勉強になるから頼む。

806 :デフォルトの名無しさん:2008/12/20(土) 07:18:22
>>796
括弧がない
vec.begin()+i
end()の方はどうなってる?

807 :デフォルトの名無しさん:2008/12/20(土) 15:51:26
>>805
噛みつくような所かそこ?

808 :デフォルトの名無しさん:2008/12/20(土) 17:58:45
yahohho- yahhohho-
no-bura yahho-

809 :デフォルトの名無しさん:2008/12/21(日) 00:11:13
>>807
C++厨だから仕方ない

810 :デフォルトの名無しさん:2008/12/21(日) 12:29:08
いや普通に疑問だろ

811 :デフォルトの名無しさん:2008/12/21(日) 20:29:40
おしりのあながかゆい

812 :デフォルトの名無しさん:2008/12/22(月) 09:27:16
>>811
虫がいるんだろう。
ポキールあげるから明日持って来なさい。

813 :デフォルトの名無しさん:2008/12/22(月) 20:48:58
ポキール懐かしい。
最近も使ってるのかな。

814 :デフォルトの名無しさん:2008/12/23(火) 07:52:43
deque< vector<int> > deq;
deq.push_front(vector<int>)

この型は演算子として使用できませんとでます。なんでですか?

815 :デフォルトの名無しさん:2008/12/23(火) 08:13:54
型名を関数の引数にはできない。

816 :デフォルトの名無しさん:2008/12/23(火) 08:21:54
thx

deque< vector<int> > deq;
vector<int> vec;
deq.push_front(vec);

これで動いた


817 :デフォルトの名無しさん:2008/12/23(火) 11:22:18
>>814
deq.push_front(vector<int>());
これならOK

818 :デフォルトの名無しさん:2008/12/23(火) 12:01:02
816の場合
同じインスタンスであるvecを配列に追加していったら
参照したときに全配列全部同じ値を共有している状態だと思うんだけど
実際中を見るとvector<int>が複数出来てた。
このときdeqから参照しないでvecを見るとどのdeqのvecが入ってるの?

819 :デフォルトの名無しさん:2008/12/23(火) 12:04:14
>>818
コピーコンストラクタとか代入演算子って知ってる?

820 :デフォルトの名無しさん:2008/12/23(火) 12:19:31
std::deque<std::vector<int> > deq;
std::vector<int> vec;

deq.push_front(vec);
deq.push_front(vec);
deq.push_front(vec);

deq[0].resize(10);
deq[1].resize(20);
deq[2].resize(30);

std::cout << deq[0].size() << ' ' << deq[1].size() << ' ' << deq[2].size() << std::endl;

つまり全部別物。

821 :デフォルトの名無しさん:2008/12/23(火) 19:24:03
それで、
std::vector<int> vec;
は一つじゃないですか。
deq[].sizeで値が変わるのは、まあわかってないのですが、置いといて、

vec.sizeとしたときに、どのdeqのなにが返るのか
あ、vecのサイズは0か。
vecが合計4つ存在してることになるのか。コピーコンストラクタがやっとわかった気がする
ありがとう!


822 :デフォルトの名無しさん:2008/12/23(火) 20:57:14
#if defined(_CONCEPT_CHECK_H) || defined(__CONCEPT_CHECKS_H) || defined(_STLPORT_VERSION)
  // SGI, STLPort, etc
  //_Tp* _M_start;
  //_Tp* _M_finish;
  //_Tp* _M_end_of_storage;
#elif defined(_RWSTD_VER) /*&& !defined(_STLPORT_VERSION)*/
  // Rougue Wave
  //size_type __buffer_size;
  //iterator __start;
  //iterator __finish;
# define _M_start __start
# define _M_finish __finish
#elif defined(_STD_BEGIN)
  // Dinkumware?
  //pointer _Myfirst; // pointer to beginning of array
  //pointer _Mylast; // pointer to current end of sequence
  //pointer _Myend; // pointer to end of array
# define _M_start _Myfirst
# define _M_finish _Mylast
#else
# error unknown STL vendor
#endif

#if !defined(_GLIBCXX_STD)
# define _M_impl (*this)
#endif

823 :デフォルトの名無しさん:2008/12/23(火) 20:58:20
class vectbuffer: public std::vector<char> {
public:
 void unintialize_force_resize(size_type size) {
  assert(size <= capacity());
  _M_impl._M_finish = _M_impl._M_start + size;
 }
};

#undef _M_impl
#undef _M_start
#undef _M_finish

これ、動かないメジャーな実装あるかな?
仕様外、保証外だというのは承知の上で
ファイルやネットワークからの読み込みバッファや
ファイル圧縮等の出力先なんかに使おうかと考えたんだけど。
まあresize()使うのが正しい方法だとは思うけどね。

今までreserve()だけしてバッファに使ってた
俺みたいな悪い奴はそんなに居ないか。

824 :デフォルトの名無しさん:2008/12/23(火) 21:12:08
#define reserve resizeはだめ?

825 :デフォルトの名無しさん:2008/12/23(火) 22:16:08
そこまでやるなら普通にバッファクラス作れと思わんでもない
大体初期化オーバーヘッド自体どうってことないしresizeでいいだろ

826 :デフォルトの名無しさん:2008/12/23(火) 22:18:46
その初期化オーバーヘッドが問題になってるのかもしれない

827 :デフォルトの名無しさん:2008/12/23(火) 22:32:26
newしてauto_ptrにかち込むだけでは物足りないのか

828 :デフォルトの名無しさん:2008/12/23(火) 22:37:05
わざわざvectorを継承する意味がわかんね

829 :デフォルトの名無しさん:2008/12/23(火) 22:38:26
>>825
作ったら作ったで車輪の再発明と言い出す奴が必ずいるという事実

830 :デフォルトの名無しさん:2008/12/23(火) 22:40:06
コンテナって継承向きじゃないよな確か
仮想デストラクタになってないし

831 :デフォルトの名無しさん:2008/12/23(火) 22:44:23
>>827
配列は(ry

まあ、例外安全とか単なるミスや検証の手間を防ぐ意味でも
vector<char>をバッファにというのは悪い考えではないでしょ。
ただ、それをresize()して使う場合の「無駄な初期化」をどう見るかと。

832 :デフォルトの名無しさん:2008/12/25(木) 04:23:12
vector<int> vec;
vec.resize(INT_MAX);

このコンテナにデータを効率よくいれるにはどう書けばいいですか?

int data[INT_MAX];
for(int i=0; i<INT_MAX; i++)
{
 vec[i] = data[i];
}

これめちゃくちゃ遅いんですけど他に手はありますか?

833 :デフォルトの名無しさん:2008/12/25(木) 04:34:54
std::copy

834 :デフォルトの名無しさん:2008/12/25(木) 04:46:13
そんなにメモリあるのか?

835 :デフォルトの名無しさん:2008/12/25(木) 05:19:53
>>832
assign() するとか。その場合は resize() 要らない。

836 :デフォルトの名無しさん:2008/12/25(木) 06:38:25
>>832
>834じゃないが、そりゃ無理だ。

837 :デフォルトの名無しさん:2008/12/25(木) 06:48:00
ヒント
64bit環境でも普通intは32bit
sizeof(int[INT_MAX])は8G

838 :デフォルトの名無しさん:2008/12/25(木) 06:57:01
それがvecとdataで16GiB。そんだけメモリ積んでるって、先ずないと思うのだが。

839 :デフォルトの名無しさん:2008/12/25(木) 06:58:56
アドレス空間は足りる(実行は出来る)ってことよ。
もちろん遅くて使い物にならないというのは同意。

840 :デフォルトの名無しさん:2008/12/25(木) 10:21:59
>>839
アドレス空間が足りていたとしても、スタックエリアが 8GB とかは絶対無理かと。

841 :デフォルトの名無しさん:2008/12/25(木) 12:47:12
>>832
INT_MAXはおいとくとして

vec.reserve(INT_MAX);
for(int i=0; i<INT_MAX; i++)
{
 vec.push_back(data[i]);
}
でいいんじゃない?

842 :デフォルトの名無しさん:2008/12/25(木) 12:57:28
わざわざループしなくてもassign()で一発じゃん

843 :デフォルトの名無しさん:2008/12/25(木) 13:00:28
あとは、vectorはメモリの連続が保証されてるんだから
memcpyあるいは環境依存で最も高速なメモリコピー手法を使うとか。

844 :デフォルトの名無しさん:2008/12/25(木) 13:01:39
>>841
さらに遅くなってそうだな

845 :デフォルトの名無しさん:2008/12/25(木) 17:45:15
もうループはcode smellだと思ってよさそうだな

846 :デフォルトの名無しさん:2008/12/25(木) 17:47:57
smellどころかループが時間食うなんて確定的に明らか

847 :デフォルトの名無しさん:2008/12/25(木) 18:13:38
そういやノンスメルのCM見なくなったな。キムコも。

848 :デフォルトの名無しさん:2008/12/25(木) 22:49:49
64ビット環境なら 8GB 使うくらいはあり得る話だが、それが遅いのは仕方が無い。
型が int だから memcpy でコピーすりゃいいが、それでも遅いのは遅いだろうな。

ただ、data はどうやって作ってんの? ってのが気になるな。
スタックに 8GB は無理だし、
静的に 8GB も取ってるとしてもどうなのよって感じだ。

849 :デフォルトの名無しさん:2008/12/25(木) 22:54:47
std::vector::resize の現在の仕様はウンコで、
サイズだけ指定した場合は
POD 型だろうがメモリがデフォルトコンストラクタで得られる値で初期化されてしまう。

C++0x では改善されているようだが、現状では
resize するだけでも初期化ルーチンが走ってしまい、
さらにその後 data のコピーが走ることになる。

コピーするだけなら、resize じゃなくて assign を使うこった。

850 :デフォルトの名無しさん:2008/12/26(金) 00:13:29
こんなの普通ファイル使うで。
てか質問者は大きいエリアという意味で、軽い気持ちでINT_MAXって
書いてしまっただけじゃないかと思うんだ。そんな端数必要な状況ってそうそうある?

851 :デフォルトの名無しさん:2008/12/26(金) 00:40:28
>>849
> C++0x では改善されている

詳しく。

852 :デフォルトの名無しさん:2008/12/26(金) 18:23:44
イテレーターが未初期化である場合に入れる、
ポインタに入れるNULLみたいな値ってありましたっけ?

853 :デフォルトの名無しさん:2008/12/26(金) 18:32:36
ありません。
というか、イテレータってなにかわかってんの。

854 :デフォルトの名無しさん:2008/12/26(金) 18:58:48
イテレータが「初期化」されているかどうかを判別する必要が
あるなら、それはプログラムがおかしい。コードを見直せ

855 :デフォルトの名無しさん:2008/12/26(金) 19:37:58
処理したかどうか判定したいなら、コンテナのend()の戻り値でも入れといて後で比較すれ

856 :デフォルトの名無しさん:2008/12/26(金) 20:40:09
例外発行しましょうね

857 :デフォルトの名無しさん:2008/12/26(金) 22:45:33
>>851
1引数の resize が追加された。

現行の規格では resize は2引数で、
第2引数は const T& value = T() になってる。
だから、メモリが確保された場合、
そのメモリは T() でコピーコンストラクトされる。

858 :デフォルトの名無しさん:2008/12/26(金) 22:56:11
>>857
ありがとう。

しかし、この変更は「改善」と言ってしまっていいんだろうか?
C++ 2003 での POD のゼロ初期化に依存していたコードが静かに壊れることに
なりそうだ。

859 :デフォルトの名無しさん:2008/12/26(金) 23:00:15
>>823的な動作(reserveも含む)が仕様に含まれるということかね。
>>858の言うように、同じ名前じゃ互換性の問題が出る可能性もあるだろうに。

860 :デフォルトの名無しさん:2008/12/26(金) 23:02:31
んーよく見たら "default constructed element" で埋めるって書いてあるな。
"default constructed" が "default initialized" という意味なら改良されてると読めるが、
規格中のほかの箇所では T() を指して "default constructed" と書いている箇所もある。
実は記述が紛らわしいだけで、 C++ 2003 と変わってないんじゃないか?

861 :デフォルトの名無しさん:2008/12/26(金) 23:05:32
C++0xドラフト(N2798) 23.2.6.2より
requires AllocatableElement<Alloc, T>
void resize(size_type sz);

Effects: If sz < size(), equivalent to erase(begin() + sz, end());. If size() < sz, appends sz
- size() default constructed elements to the sequence.

あれ?同じじゃね?

862 :デフォルトの名無しさん:2008/12/26(金) 23:17:27
1引数の resize() が追加されてるように見えるのは、値の指定方法が
値渡しから const 参照渡しに変わったからじゃない?
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679

対して、 resize() 時の初期値についての issue は見当たらない。
やっぱり変わってないんだと思う。しかし "default constructed elements" という
記述は "default initialized" との絡みで曖昧なマズイ状態になってると思う。

863 :デフォルトの名無しさん:2008/12/27(土) 00:07:27
default construct って、POD 型の場合は何もしないんじゃないの?

864 :デフォルトの名無しさん:2008/12/27(土) 00:18:29
>>863
default initialize ならそのとおり。でも default construct は T() のことかもしれない。
T() だとすると value initialize となって、 POD の場合は zero initialize になる。

865 :デフォルトの名無しさん:2008/12/27(土) 00:19:38
default constructという用語は今の規格には存在しないし
C++0xの最新ドラフトでも説明なしに使われてる(これはまずくないか)

default initializedは今の規格とC++0xで変わってて
今の規格では非PODはゼロ初期化することになってるが
C++0xの最新ドラフトでは非クラスは何もしないとなってる

866 :デフォルトの名無しさん:2008/12/27(土) 00:26:55
↓で一緒に挙げといてもらうのがいいかな?
http://d.hatena.ne.jp/faith_and_brave/20081224/1230109605

867 :デフォルトの名無しさん:2008/12/27(土) 00:50:56
またアキラ君か・・・

868 :デフォルトの名無しさん:2008/12/30(火) 15:45:23
こんにちは。逆順にソートされている配列に対して、
lower_bound(のようなもの)を適用することはできますか?
配列の代わりにvector<int>にしてreverse_iteratorを使えばよいということは分かるのですが、
配列のままで可能であればそれが良いなと思っています。お願いします。

869 :デフォルトの名無しさん:2008/12/30(火) 16:14:24
int a[N];
int* p = std::lower_bound(a, a + N, std::greater<int>());


870 :869:2008/12/30(火) 16:16:30
違うわ、1個引数抜けた
std::lower_bound(a, a + N, value, std::greater<int>());

871 :868:2008/12/30(火) 16:19:13
>>869さん
そうすれば良かったのですか、ありがとうございます。

872 :デフォルトの名無しさん:2008/12/31(水) 15:40:29
vector< vector<int> > m_vec;
size = 10;
m_vec.resize(size);
for(int i=0; i<= size; i++){
 m_vec[i].resize(10000, 0);
}

このあと、
for(int i=0; i<= size; i++){
 m_vec[i].resize(10, 0);
}

こうしたんですが、メモリの使用量が減りません。
繰り返すたびにどんどん増えていくんです。
どうすれば解放できるんでしょうか?



873 :デフォルトの名無しさん:2008/12/31(水) 15:48:45
別にvector用意してそっちに値コピーした後swapする


874 :デフォルトの名無しさん:2008/12/31(水) 15:51:17
googleの使い方を教えてあげたほうが、今後のためには親切だぞ。
http://www.google.co.jp/search?q=vector+%83%81%83%82%83%8A+%89%F0%95%FA

875 :デフォルトの名無しさん:2008/12/31(水) 16:03:04
>>872
vector<int>().swap(m_vec[i]); をsize分繰り返す

876 :デフォルトの名無しさん:2008/12/31(水) 16:16:10
待てよ

vector<vector<int> >().swap(m_vec) なら一発で行けるかも

877 :デフォルトの名無しさん:2008/12/31(水) 16:25:20
やってみた

int main()
{
std::vector<std::vector<int> > m_vec(10, std::vector<int>());

for(int i = 0; i < 10; i++)
m_vec[i].resize(1000000);

std::getchar();

std::vector<std::vector<int> >().swap(m_vec);

std::getchar();
}

一度目のgetchar() (タスクマネージャから)
40652K
二度目のgetchar() (タスクマネージャから)
1552K

うまく動いているようだ

878 :デフォルトの名無しさん:2008/12/31(水) 17:29:06
ありがとうございます!今まで小さい配列しか使ってなかったのでメモリが解放されないとは知りませんでした。
swapでなぜ解放されるかさっぱりわからないので勉強してきます。

vector< vector<int> >* m_vec;
m_vec = new vector< vector<int> >;
delete m_vec;

もしこうするとしたら、
*m_vec[i].resize(10000, 0);
2番目の引数がintからvector<_Ty>に変換できませんとエラーが出るのですが、ここはどう書けばいいんでしょうか

879 :デフォルトの名無しさん:2008/12/31(水) 18:09:27
>>877
だめです一部しか解放されません。

for(int i = 0; i < 10; i++)
 m_vec[i].resize(1000000);
}

for(int i = 0; i < 10; i++)
 vector<int>().swap(m_vec[i]);
}

これはなんのデータが残ってしまってるんでしょうか


880 :デフォルトの名無しさん:2008/12/31(水) 18:21:20
いやその・・・解放って・・・

881 :デフォルトの名無しさん:2008/12/31(水) 18:29:10
すいませんぜんぜん違うところをミスってました。メモリリーク地獄ですね。ありがとうございました。

882 :デフォルトの名無しさん:2009/01/01(木) 11:55:31
>>833
vector<int> vec(1000,100);
int i[1000];
copy(vec.begin, vec.end, i);

int配列にvectorって入らないんですけど。

883 :デフォルトの名無しさん:2009/01/01(木) 12:23:30
ここはお前の日記帳じゃねーんだ、チラシの裏にでも書いてろ、な

しかし今日は元旦だ。
めでたいので特別に教えてやろう。

std::copyはSTL用のアルゴリズムなんだから、int配列には対応してなくて当然。


884 :デフォルトの名無しさん:2009/01/01(木) 12:31:48
>>882
beginとendの後ろに括弧が足りない。

>>883
使えるよ。

885 :デフォルトの名無しさん:2009/01/01(木) 12:42:42
ポインタはランダムアクセスイテレータの要件を満たしている

886 :デフォルトの名無しさん:2009/01/01(木) 16:18:32
>>883
> std::copyはSTL用のアルゴリズムなんだから、int配列には対応してなくて当然。

C++の特殊化を根本的に勉強し直す必要がある。

887 :デフォルトの名無しさん:2009/01/01(木) 16:23:29
>>886
もし「特殊化」を明示的特殊化のつもりで使ったのならば、
お前も勉強しなおせ。そうではないなら失礼した。

888 :デフォルトの名無しさん:2009/01/01(木) 16:44:00
どちらにしろ検討外れだろ。
イテレータの種類について勉強しろ、ってのが正しい。

889 :デフォルトの名無しさん:2009/01/01(木) 16:53:38
総称型によるジェネリックプログラミングのことも忘れてはいけない

890 :デフォルトの名無しさん:2009/01/01(木) 18:16:19
()を入れたらコンパイルできました。ありがとうございました。

int* a;
a = new int[1000][10];
vector < ventor<int> > vec;
copy( vec[i].begin(), ven[i].end()-1, a[0][i]);

これはどうすればコンパイルできますか?
配列のバウンドが定数式ではありませんと出ちゃいます

891 :デフォルトの名無しさん:2009/01/01(木) 18:23:17
色々ダメすぎ

C++は適当に感覚でやって、なんとなく動いたらそれでいいやっつー
タイプの言語じゃないぞ
その調子でやってたらいつまで経っても物にならん

もっと簡単な言語からはじめるか、もっと基本的で低レベルなところから、ちゃんと
理解しながら進めろ

892 :デフォルトの名無しさん:2009/01/01(木) 18:59:27
>>887
変な奴w

893 :デフォルトの名無しさん:2009/01/01(木) 19:12:11
>>890
1. a の型がおかしい
new int[1000] は、int を 1000 個分確保する事を表す。
すなわち、これは int へのポインタで受ける。

new int[1000][10]; は、int[10] の配列を 1000 個分確保する事を表す。
すなわち、これは int[10] の配列へのポインタで受ける。
従って、a の宣言は int (*a)[10]; が正しい。
10 の部分は整数定数である必要があり、
サイズを変数で指定することはできない。

2. end に対する誤解
end() - 1 なんてすんな。end() でよろしい。
copy の第2引数には、最後の要素の次の要素を与える。
そして、end() は最後の要素の次の要素を与える。
だから、end() でよろしい。
(もっとも、1 個余分に作成しているのなら話は別だが)

3. copy の第3引数にはポインタまたはイテレータを与える。
a[0][i] じゃ単なる int になる。& を付けること。

4. 配列の配列のメモリ上の配置に対する無理解
a[1000][10] は、メモリ上には以下の順番で配置される。
a[0][0], a[0][1], a[0][2], a[0][3], ..., a[0][9], a[1][0], a[1][1], ...
copy に与えるのは &a[0][i] ではなく &a[i][0] にし、i は 0 〜 999 で回す。
この理解だと vec の resize 部分も怪しい可能性もあるので見直す事。
あと、&a[i][0] は a[i] と書いても良い。

894 :デフォルトの名無しさん:2009/01/01(木) 22:34:21
C++ で動けばいいや、だと悲惨な目にあいそうだな。
どの言語でもそうだといえばそうだが、 C++ は Java とかに
比べて安全装置少ないから危険。さらにバグではないとしても
どうしようもないコード書くようになりそう。

895 :デフォルトの名無しさん:2009/01/02(金) 10:07:09
>>893
詳しく教えていただきありがとうございます!
どうしてもint[10]の10の部分を変数にする方法はないのでしょうか

// data = 1000まで入る
// set = 10まで入る
int* a = new int[1000*10]
として、サイズだけは確保し、後からa[data][set]や、a[set][data]として自由に中身にアクセスできないんでしょうか?

vector<int> s(set);
int* a = new (*s)[data];
こうするとコンパイルは出来るのですが、vectorをべたデータにしたくて、ただのintの配列に置き換えたかったので
もしこれでaの受取側がただの配列と同じように中身を見れるのであれば、

vector< vector<int> > a;
a[set][data] を a[data][set] に置き換えて受取側がアクセスできるかを見た方がいいのではと思いました。
これを実行するアルゴリズムなどは用意されているのでしょうか?
すいませんアドバイスお願いします



896 :デフォルトの名無しさん:2009/01/02(金) 10:15:25
vector<int> s(set);
int* a = new (*s)[data];
すいませんこれコンパイルできてません。

897 :デフォルトの名無しさん:2009/01/02(金) 10:39:22
>>895
> int* a = new int[1000*10]
> として、サイズだけは確保し、後からa[data][set]や、a[set][data]として自由に中身にアクセスできないんでしょうか?
自分で書けばできないことはないが、やる必要がないと思う。
a[data*1000+set]
これで十分。

898 :897:2009/01/02(金) 10:40:37
ごめん間違えた。
a[data*10+set]

899 :デフォルトの名無しさん:2009/01/02(金) 11:15:41
ありがとうございます。書けました!

vector< vector<int> > vec;

data = new int[data*set];
for(int k=0; k< set; k++){
 for(int i=0; i< data; i++){
  data[k+(i*set)] = vec[k][i];
 }
}



900 :デフォルトの名無しさん:2009/01/02(金) 12:18:32
>>896
vector<vector<int> > (set, vector<int>(data)); じゃねーの?

901 :デフォルトの名無しさん:2009/01/03(土) 09:38:07
配列でやるなら、
int (*a)[10] = new int[20][10];
でできるよ。

902 :デフォルトの名無しさん:2009/01/03(土) 12:34:17
vector< vector<int> > v;
v.resize(5);
の場合、v[n] または v.at(n) で各要素にアクセス出来ますよね
これ list の場合どうすればいいでしょうか?

list< list<int> > lst;
lst.resize(5);
at() も operator[] も使えなくて詰まっています

903 :デフォルトの名無しさん:2009/01/03(土) 12:48:52
std::advance(i, n)はイテレーターiを距離n分移動します
なので
*std::advance(list.begin(), 5);
という式は概ねlist[5]のような意味を持ちます

904 :デフォルトの名無しさん:2009/01/03(土) 12:48:57
list はそもそもそういう使い方はあまりしないものだが、
どうしてもしたいという場合は

list< list<int> >::iterator it = lst.begin();
std::advance(it, 5);

で *it を使おう。

905 :デフォルトの名無しさん:2009/01/03(土) 12:50:55
>>902
listっていうのはそういうもの。
[]とかatを使いたいなら、listを選んだこと自体が間違い

906 :デフォルトの名無しさん:2009/01/03(土) 12:51:02
>>903
advance の使い方違わね?

907 :デフォルトの名無しさん:2009/01/03(土) 12:52:15
>>902
なんでlistにしたのか知らんが、listを選んだ理由よりも、
vectorを選ばなかった理由を考えると、そういう間違いや迷いは起きない

908 :デフォルトの名無しさん:2009/01/03(土) 12:54:44
vector, list, deque, set, map という色々な選択肢を
とりあえず検討してみれ。

909 :デフォルトの名無しさん:2009/01/03(土) 13:04:57
advanceの戻り値はvoidでしたねすんません

910 :デフォルトの名無しさん:2009/01/03(土) 21:07:49
boost::nextなら戻り値が使えるな

911 :902:2009/01/04(日) 00:45:40
>>903-910
遅くなりましたがありがとうございました。
やっぱり設計ミスですね
vector に変更するようにしてみます。

912 :デフォルトの名無しさん:2009/01/06(火) 22:12:35
コンテナにlistを好んで使う人たちを
スキリスト教徒と言うらしいね

913 :デフォルトの名無しさん:2009/01/06(火) 22:17:41
list厨はいっぱいいるけど
deque厨ってあんまりいないよね

914 :デフォルトの名無しさん:2009/01/06(火) 23:19:02
list便利だからな。検索は遅いけどヒットした結果はイテレータでキャッシュできるし。

915 :デフォルトの名無しさん:2009/01/07(水) 02:04:05
dequeって性能が中途半端なんだよね

916 :デフォルトの名無しさん:2009/01/07(水) 02:43:17
だが、それがいい。

917 :デフォルトの名無しさん:2009/01/07(水) 03:29:43
俺はアロケート間隔を指定できる自作のdequeを作った。
もちろんランダムアクセスイテレータ対応のちゃんとしたSTLコンテナ。そんなに長くはない。500行しかない。

918 :デフォルトの名無しさん:2009/01/07(水) 03:54:58
そういやstackのデフォルトがdequeなのってなんで?vectorの方が向いてそうなんだが

919 :デフォルトの名無しさん:2009/01/07(水) 03:57:23
>>918
たまに追加時間がやたらかかる stack とか、ちょっと怖い。

920 :デフォルトの名無しさん:2009/01/07(水) 04:04:56
もしかしてdequeってサイズが小さくなったときに解放するのか?
vectorだと確保したままだからなぁ

921 :デフォルトの名無しさん:2009/01/07(水) 04:09:54
そこあたりは流石に実装次第。

922 :デフォルトの名無しさん:2009/01/07(水) 04:46:47
>>918
サイズが不定の場合はvectorは性能が悪い。
連続性が必要なければ、ほとんどの場面でdequeの方がいい。

923 :デフォルトの名無しさん:2009/01/07(水) 13:34:17
deque舐めんな

924 :デフォルトの名無しさん:2009/01/07(水) 17:59:21
0xでarrayが入ったらvectorの存在意義はどうなるのかなぁ

925 :デフォルトの名無しさん:2009/01/07(水) 18:18:09
arrayは固定長だべ。
連続性と可変長が必要な用途には依然vectorが便利。

926 :デフォルトの名無しさん:2009/01/07(水) 18:22:31
でもその両方が必要な場合ってそんなに多くないよな
ないとは言わんが

927 :デフォルトの名無しさん:2009/01/07(水) 18:33:32
arrayってスタックから取るんだよな?
大き目のバッファとか、ヒープから取りたい場合はvectorかな。
それともscoped_arrayみたいなのは入るんだっけ?

928 :デフォルトの名無しさん:2009/01/07(水) 18:41:58
dequeといえばdequeからファイルに出力する場合って、
中身を一要素ずつ書き込むしかないのかな?

929 :デフォルトの名無しさん:2009/01/07(水) 18:49:13
boost::serializeとか

930 :デフォルトの名無しさん:2009/01/07(水) 19:02:22
dequeのためだけにserializeのコンパイルっすかw
それはいいとしても、serializeの中でやっぱり一要素ずつ書いてたら
導入する意味は薄い気が。

931 :デフォルトの名無しさん:2009/01/07(水) 19:03:49
ostream_iteratorか何かとcopyで

932 :デフォルトの名無しさん:2009/01/07(水) 19:45:06
連続性保証されてないなら、一要素ずつ書き込むしかないと思うが。

933 :デフォルトの名無しさん:2009/01/07(水) 19:51:56
dequeの実装に立ち入れば、チャンク毎に書き出すことも可能かもしれない。
駄菓子菓子、そもそもバッファリングされるから纏めて書いてもメリットは余り大きくはない。

934 :デフォルトの名無しさん:2009/01/07(水) 20:36:40
たとえばdeque<char>をンMBも書く場合なら、
関数コールのオーバーヘッドもバカにできない木が。

935 :デフォルトの名無しさん:2009/01/07(水) 20:38:09
インライン展開されるんじゃねーの?

936 :デフォルトの名無しさん:2009/01/08(木) 01:29:04
ディスク入出力のオーバーヘッドに比べれば…

937 :デフォルトの名無しさん:2009/01/08(木) 04:40:46
そもそもバイナリで書き出す必要があること自体、そんなに多くないだろ。

938 :デフォルトの名無しさん:2009/01/08(木) 08:54:15
連続性は保証されてなくても実際はある程度連続してるんだから、
その連続具合を得る方法とかあるのかなと思ったんだが、無いのか。

939 :デフォルトの名無しさん:2009/01/08(木) 11:20:26
試しにdeque<char>とvector<char>を5MBほど書き込んでみたら、
dequeがvectorの500倍ほどかかってワロタ
VCのdequeの実装をみたら中身リングバッファで連続してない場合でも
2分割でしかないのに、これはダメだろ。

940 :デフォルトの名無しさん:2009/01/08(木) 12:57:21
手元では全く同じだったぞ(STLport)

941 :デフォルトの名無しさん:2009/01/08(木) 13:41:09
deque をリングバッファで実装って、できるのか?
要素数がいっぱいになったときにどうすんの?

942 :デフォルトの名無しさん:2009/01/08(木) 13:49:46
リングバッファは間違いか

943 :デフォルトの名無しさん:2009/01/08(木) 14:15:42
>dequeをリングバッファ
バッファのリンクを順にたどっていくと一周するようにリンクしてあるってことだろうか。
それならリングバッファと言っていいと思う。
push_back()とpop_front()を対で繰り返すような処理の場合に
バッファを再確保しなくていいから、ありなんじゃないかな。
#固定長のリングバッファ上を使用領域がぐるぐる回る

バッファを追加するときの処理が面倒そうだけど。

944 :デフォルトの名無しさん:2009/01/08(木) 17:04:16
それって単に空になったチャンクを取っといて使いまわすだけじゃ…

945 :デフォルトの名無しさん:2009/01/08(木) 17:41:22
それって双方リストっていうんでないの?

946 :デフォルトの名無しさん:2009/01/08(木) 17:44:10
deque舐めんな

947 :デフォルトの名無しさん:2009/01/08(木) 21:44:30
char で試すとか馬鹿だろ。
しかもどうせ Debug モードなんじゃね?
コピーコンストラクタのあるクラスで試せ。

948 :デフォルトの名無しさん:2009/01/09(金) 09:19:29
vectorでもdequeでもコピーコンストラクタが走るのを避けるためにポインタ入れるほうが多くね?

949 :デフォルトの名無しさん:2009/01/09(金) 11:02:11
そうでもない。

950 :デフォルトの名無しさん:2009/01/09(金) 14:16:13
挿入/削除ぐらいじゃね?コピーコンストラクタのコストが気になるのって。
そんなに頻繁にするならlistでいいじゃん
vectorの再配置がいやならdequeでいいし

951 :デフォルトの名無しさん:2009/01/09(金) 19:48:35
vector は
・ 連続性が必要な場合
・ サイズの変更をあまり行わない場合
に使う。

deque は
・ 連続性は必要ない場合
・ 末端への要素の追加をよく行う場合
に使う。

952 :デフォルトの名無しさん:2009/01/09(金) 20:53:02
連続性が必要かつ、サイズの変更が頻繁に行われる場合は?

953 :デフォルトの名無しさん:2009/01/09(金) 20:55:02
本当にそんなことが必要かどうか
要件と設計を見直す

954 :デフォルトの名無しさん:2009/01/09(金) 21:05:48
>>952
エディタとか

955 :デフォルトの名無しさん:2009/01/09(金) 21:13:18
>>952
そんな都合のいいもん・・・

迷ったらvector使え

956 :デフォルトの名無しさん:2009/01/09(金) 21:14:34
>>952
まとめて確保しとけー

957 :デフォルトの名無しさん:2009/01/09(金) 21:35:18
>>952
性能をあきらめる。

これがもっとも普通だろ。

958 :デフォルトの名無しさん:2009/01/09(金) 21:40:59
>>954
エディタは普通listだろ
EmEditorがstd::listを使っているのは有名な話

959 :デフォルトの名無しさん:2009/01/09(金) 22:06:36
STLには無いけどギャップバッファとかお勧め。

とはいえ、小さいファイルしか扱わんなら
listとかvectorで十分と思うけどなー

960 :デフォルトの名無しさん:2009/01/09(金) 22:24:46
dequeでよくない?

961 :デフォルトの名無しさん:2009/01/09(金) 22:28:17
一方ロシアでは(ry

962 :デフォルトの名無しさん:2009/01/09(金) 22:30:52
Data Structures for Text Sequences
ってドキュメントがネットで読めるよ。
そこで一番推奨されていたのがPiece Tableって奴だったな。
が、linked listやgap bufferより複雑だ。
linked listは十分実用的で、出来合いのコンテナを利用できるのがいいな。

963 :デフォルトの名無しさん:2009/01/09(金) 22:44:18
unordered_map<size_t(行番号), string> とか
まぁ行単位のぶつ切りなので範囲コピーとかの速度はリストと変わらんが。

964 :デフォルトの名無しさん:2009/01/10(土) 00:24:08
>>952
STL限定で連続性を求めたらその時点でvectorしかないんじゃ

965 :デフォルトの名無しさん:2009/01/10(土) 00:50:49
値をガシガシ変更する時には list を使って、
データを作成し終えたら vector に変換する手もある。

966 :デフォルトの名無しさん:2009/01/10(土) 02:07:50
>>964
STLじゃないけどbasic_stringは…?

967 :デフォルトの名無しさん:2009/01/10(土) 02:08:22
>>966 C++0x を待て

968 :デフォルトの名無しさん:2009/01/10(土) 11:33:55
C++0xならvectorよりarrayだわ

969 :デフォルトの名無しさん:2009/01/10(土) 11:42:55
|
C++0x
C++0x
C++0x
|
|

970 :デフォルトの名無しさん:2009/01/10(土) 11:50:51
もう2009年何だからC++09と書けよ。それが嫌ならC++1xとでも書け。

971 :デフォルトの名無しさん:2009/01/10(土) 13:14:19
>>968
arrayってvectorと違ってヒープにメモリ取ろうとしたらまた別にメモリ管理が必要にならない?
scoped_arrayがc++0xに入るか知らないが、そっちだろ。

972 :デフォルトの名無しさん:2009/01/10(土) 13:57:17
vector<T>とvector<T*>でポリモーフィズムを実現してるんだけど、要素を追加するたびにポインタを更新しなきゃいけないから面倒
dequeなら連続性が保証されないから、要素追加でアドレスも変更されないんだよね?

973 :デフォルトの名無しさん:2009/01/10(土) 14:39:03
>>972
dequeは変更されるよ


974 :デフォルトの名無しさん:2009/01/10(土) 15:01:03
そういえば、「vectorは変更される」の対比として
「listは変更されない」という説明はやまほど見かけるけど
set(map)については見かけないんだよね。

この前、初めてsetについて明記してあるドキュメントを見たんだけど
これって、RW独自保証じゃなくて、規格で保証されてるよね?
http://docs.sun.com/source/820-2985/general/8_2.htm#826

975 :デフォルトの名無しさん:2009/01/10(土) 15:12:14
ttp://www.jisc.go.jp/
で「X3014」を検索してくれば

976 :デフォルトの名無しさん:2009/01/10(土) 15:58:44
14882:2003 23.1.2 Associative containers / 8
>The insert members shall not affect the validity of iterators and
>references to the container, and the erase members shall invalidate
>only iterators and references to the erased elements.
Associative containers ってのは set とか map の総称な。

977 :デフォルトの名無しさん:2009/01/10(土) 16:18:00
おー、ありがとう。

978 :デフォルトの名無しさん:2009/01/10(土) 17:02:53
>>973
マジで?簡単なサンプルコードでは大丈夫だったのに
大きめにresizeするかlist使うしかないってこと?

979 :デフォルトの名無しさん:2009/01/10(土) 17:06:32
>>974のリンクにも、 vector や deque とは異なり、と書いてあるよ。

980 :デフォルトの名無しさん:2009/01/10(土) 17:07:00
仕様をコードで試す習慣は止めろ。

981 :デフォルトの名無しさん:2009/01/10(土) 17:18:11
糞仕様を元に実装することを長年強いられると
そういう癖が付いちゃうんだよね仕方ないね

982 :978:2009/01/10(土) 17:34:55
>>979-980
仰るとおりです。
ランダムアクセスが欲しいんだけど、mapを使うかな。
他の人もありがとう。

983 :デフォルトの名無しさん:2009/01/10(土) 17:39:24
>>980
Rubyですねわかります

984 :デフォルトの名無しさん:2009/01/10(土) 17:59:08
仕様書読むだけでわかるってすごいな

985 :デフォルトの名無しさん:2009/01/10(土) 20:20:54
>>982
mapはランダムアクセスじゃないだろ
http://www.cplusplus.com/reference/stl/map/

986 :デフォルトの名無しさん:2009/01/10(土) 20:56:43
>>985
おまえは小学校から日本語を勉強し直せ。

987 :デフォルトの名無しさん:2009/01/10(土) 20:56:54
>>985
As associative containers, they are especially designed to be efficient accessing its elements by their key.なんでしょ?
Keyにintを使って代用しようかと

思ってたんだけど、>>972の使い方だとlist<T>とdeque<T*>の組み合わせなら再割り当ての問題は生じないね
自分の設計がアフォでした

988 :987:2009/01/10(土) 21:01:05
あ、でもlistじゃなくてmapなら要素の削除も簡単なのか
スレ汚し失礼、もう一度じっくり考えてみます

989 :デフォルトの名無しさん:2009/01/10(土) 23:34:57
>>988
「簡単」とか言うの禁止。
ビッグOとかで語れ。

990 :デフォルトの名無しさん:2009/01/10(土) 23:40:42
アークション!

991 :デフォルトの名無しさん:2009/01/11(日) 00:00:22
ランダウのO

992 :デフォルトの名無しさん:2009/01/11(日) 00:02:50
>>988
ここから好きなの探せ
ttp://ufcpp.net/study/stl/methods.html

993 :デフォルトの名無しさん:2009/01/11(日) 00:16:02
>>986
はぁ?

994 :デフォルトの名無しさん:2009/01/11(日) 00:45:55
うめ

995 :デフォルトの名無しさん:2009/01/11(日) 03:59:07
>>993
本当に頭悪いんだな

996 :デフォルトの名無しさん:2009/01/11(日) 05:19:21
>>993
ヒント:接続詞

997 :デフォルトの名無しさん:2009/01/11(日) 09:31:27
>>995-996
いや、マジでわからんでけどww
>>993 の発言のことだろ?

998 :デフォルトの名無しさん:2009/01/11(日) 09:32:49
間違った
>>985 の発言のことだろ?

999 :デフォルトの名無しさん:2009/01/11(日) 09:36:17
>>982「カレーが食いたいんだけど、ラーメンにしとくかな」
>>985「ラーメンはカレーじゃないだろ」

1000 :985:2009/01/11(日) 09:37:26
>>999
あーそういう意味か
わかった。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

207 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)