【C++】STL(Standard Template Library)相談室 10
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/08/26(火) 12:01:17前スレ
【C++】STL(Standard Template Library)相談室 9
http://pc11.2ch.net/test/read.cgi/tech/1204045410/
過去ログ・リンク・書籍紹介は >>2 以降
0002デフォルトの名無しさん
2008/08/26(火) 12:02:03http://pc11.2ch.net/test/read.cgi/tech/1198435319/
【C++】STL(Standard Template Library)相談室 7
http://pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
http://pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0003デフォルトの名無しさん
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/
0004デフォルトの名無しさん
2008/08/26(火) 12:05:01STL標準講座―標準テンプレートライブラリを利用した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/
0005デフォルトの名無しさん
2008/08/26(火) 12:06:01http://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
0006デフォルトの名無しさん
2008/08/27(水) 09:34:440007デフォルトの名無しさん
2008/08/29(金) 00:12:00set< set< int > > s;
set< set< int > >::iterator i( s.begin() );
i->insert( 12 );
をコンパイルすると、
error: passing 'const std::set<int, std::less<int>, std::allocator<int> >' as
'this' argument of 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, _Alloc>::const_iterator, bool>
std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>]' discards qualifiers
と言われる。
これは何が間違ってる?
0008デフォルトの名無しさん
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;
みたいにやると、「デリファレンスできねーよ、ばーかばーか」って
実行時エラーがでやがりまくりやがりますりやがりますり。
0009デフォルトの名無しさん
2008/08/29(金) 01:01:370010デフォルトの名無しさん
2008/08/29(金) 01:04:460011デフォルトの名無しさん
2008/08/29(金) 01:11:330012デフォルトの名無しさん
2008/08/29(金) 01:22:010013デフォルトの名無しさん
2008/08/29(金) 01:22:390014デフォルトの名無しさん
2008/08/29(金) 01:34:36「コンテナ内を巡回するには、 begin() で先頭を指す反復子を取得し、
反復子の値が end() と等しくなるまで反復子をインクリメントします。」
ってのも、実際にプログラムしたらエラーでる。
つか、気になったのは、シルト先生は for ループの条件に不等号を使うんだよね。
for ( int i = 0, i < 10, ++i )みたいに。
これはAccelerated C++ではやるべきじゃないって最初の方で書かれてる。
なぜなら、普遍の表明を正しく立てられなくなるし、エラーも発見しにくくなるから。
ループの終わりは正確に示すべきで、特に理由がなければ
for ( int i = 0, i != 10. ++i )のように書く方が良い、と。
こうすれば、ループが [0,10) であることを正しく表明できる。
どっちを信じたらいいんだ。
0015デフォルトの名無しさん
2008/08/29(金) 01:38:46簡単に要素のスキップとかできるし
0016デフォルトの名無しさん
2008/08/29(金) 01:50:51!= は任意のイテレータで使用可能である。
従って、後でコンテナの種類を入れ替えたりする可能性があるので!= が無難である。
というのが、STLのイテレータに関する結論。
(コンテナの種類を変更するのは、そんな簡単な仕事じゃなかったりするが。。。)
for 文の本体でカウンタの値を変更出来るのだから、
終了条件 i != 10 がいつも正しい表明とは限らない。
それが正しい表明なら != で書けば良いだろう。
i < 10 でも十分正しい表明であるケースは起こりうる。
ので、int カウンタに対しては、どちらでも良くて、時に応じて好きな方を選ぶ。
ただ、そんな細かい事より、もっと気を配るべき事は沢山ありそうだが。
0017デフォルトの名無しさん
2008/08/29(金) 01:58:10なるほど。納得。
0018デフォルトの名無しさん
2008/08/29(金) 01:59:470019デフォルトの名無しさん
2008/08/29(金) 02:03:100020デフォルトの名無しさん
2008/08/29(金) 03:49:59エラーメッセージを見る限り、i.operator ->の戻り値の型がconst set<int>になっているみたい。
これが正しいのか規格のsetのあたりみても分からなかった、すまん。
0021デフォルトの名無しさん
2008/08/29(金) 05:25:27// 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。
0022デフォルトの名無しさん
2008/08/29(金) 06:25:27set の iterator には const が付いてる。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
0023デフォルトの名無しさん
2008/08/29(金) 10:34:550024デフォルトの名無しさん
2008/08/29(金) 22:06:41そういうことは出来ないんですかね?
0025デフォルトの名無しさん
2008/08/29(金) 22:15:040026デフォルトの名無しさん
2008/08/29(金) 22:19:23どうやってやるですかね?
std::vector<std::vector> vec;
vec.push_back(std::vector<float>);
とかだと、vectorのtemplateの型を1行目で指定してないので、
compileがもちろん出来ないんですが。
0027デフォルトの名無しさん
2008/08/29(金) 22:30:040028デフォルトの名無しさん
2008/08/29(金) 22:32:54>>26のvecの第一要素はvector<double>で、
第二要素はvector<float>にしたいという意味です。
0029デフォルトの名無しさん
2008/08/29(金) 22:35:49std::vector<boost::any>
とか
std::vector<boost::variant<std::vector<double>, std::vector<float> > >
0030デフォルトの名無しさん
2008/08/30(土) 01:08:150031デフォルトの名無しさん
2008/08/30(土) 01:31:110032デフォルトの名無しさん
2008/08/30(土) 01:49:20そうだな
お前が作ったんじゃないもんな
0033デフォルトの名無しさん
2008/08/30(土) 01:53:05boostさんは謙虚なライブラリで大人気
あまり調子こくとリアルで痛い目を見て病院で栄養食を食べる事になる
0034デフォルトの名無しさん
2008/08/30(土) 05:33:14これを知ってるかどうかで生産性が違う
0035デフォルトの名無しさん
2008/08/30(土) 09:01:550036デフォルトの名無しさん
2008/08/30(土) 09:48:230037デフォルトの名無しさん
2008/08/30(土) 10:00:050038progress_display
2008/08/30(土) 18:19:550039デフォルトの名無しさん
2008/08/30(土) 21:33:290040デフォルトの名無しさん
2008/09/02(火) 22:43:240041デフォルトの名無しさん
2008/09/02(火) 22:45:460042デフォルトの名無しさん
2008/09/03(水) 11:53:07それ以降、そのデータへのアクセスは走査のみの場合
vector と list、Dotch?
0043デフォルトの名無しさん
2008/09/03(水) 11:58:40任意の位置への挿入削除が速いのがlist。
よってvectorかと。
0044デフォルトの名無しさん
2008/09/03(水) 12:47:33値を変更しても安全なんかな。
0045デフォルトの名無しさん
2008/09/03(水) 18:32:22コンストラクタ、デストラクタ内でclearするべき?
コンテナ自身、コンストラクタ、デストラクタで
clearは保証されてないんですか?
0046デフォルトの名無しさん
2008/09/03(水) 18:33:170047デフォルトの名無しさん
2008/09/03(水) 20:19:55みたいな、要素を共用するようなこと出来ませんか?
unionをtypedefしちゃえばいいんだろうけど、
文を短くできないかなぁと思ったんですが…
0048デフォルトの名無しさん
2008/09/03(水) 20:33:200049デフォルトの名無しさん
2008/09/03(水) 20:53:200050デフォルトの名無しさん
2008/09/03(水) 21:03:49d
0051デフォルトの名無しさん
2008/09/03(水) 23:23:510052sage
2008/09/20(土) 23:20:38hoge[0]=41;hoge[1]=10;hoge[2]=20;hoge[3]=2;....
となってるときに、hogeからある決められた数字以下の列だけを先頭から順番に
抜き出したいのですが、一行で書けるでしょうか?
よろしくお願いします。
0053デフォルトの名無しさん
2008/09/20(土) 23:26:320054デフォルトの名無しさん
2008/09/20(土) 23:37:420055デフォルトの名無しさん
2008/09/20(土) 23:38:04std::copy_ifでできるよ、と書こうと思ったら無かったorz
C++0xマダー
0056デフォルトの名無しさん
2008/09/21(日) 10:20:110xで標準になるかもしれないrange baseの<algorithm>, <numeric>が楽しみですね
0057デフォルトの名無しさん
2008/09/23(火) 19:57:36つまり,
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 .... // イテレータでないのでやはり無理
なにか良いアイディアはあるでしょうか?
0058デフォルトの名無しさん
2008/09/23(火) 20:10:27struct MapRedraw
{
void operator ()(std::multimap<int, Widget *>::value_type const& e) const
{
e.second->redraw();
}
};
for_each(widget_map.begin(), widget_map.end(), MapRedraw());
0060デフォルトの名無しさん
2008/09/23(火) 20:16:150061デフォルトの名無しさん
2008/09/23(火) 20:25:170062デフォルトの名無しさん
2008/09/23(火) 21:07:45まったくと言っていいくらい使う機会が無いなぁ、for_eachは。
まぁ、俺はそうだっていう単なるスタイルの話だけれど。
0063デフォルトの名無しさん
2008/09/23(火) 21:30:320064デフォルトの名無しさん
2008/09/23(火) 22:02:570065デフォルトの名無しさん
2008/09/23(火) 22:24:07for_each(widget_map | map_values | indirected
, bind(&Widget::redraw, _1));
0066デフォルトの名無しさん
2008/09/23(火) 22:26:14最後のindirectedは要らなくないか?
0067デフォルトの名無しさん
2008/09/23(火) 22:44:55確かにこの場合だと要らんね、指摘ありがとう
0068デフォルトの名無しさん
2008/09/23(火) 22:46:08× >>65
○ >>66
0069デフォルトの名無しさん
2008/09/23(火) 22:53:220070デフォルトの名無しさん
2008/09/27(土) 02:47:41添字よりiteratorのが早いんですか?
0071デフォルトの名無しさん
2008/09/27(土) 03:04:510072デフォルトの名無しさん
2008/09/27(土) 03:05:540073デフォルトの名無しさん
2008/09/27(土) 03:09:19ただ、一般的な話をすると
vectorはクラス/構造体であり、内部にポインタメンバを持っている。
そのため、[]で参照する時には、必ずメモリ上にベースアドレスを示す変数を読む必要がある。
一方、iteratorはただのポインタであり、レジスタ割付が可能。
そういう意味で、昔の「ポインタ/配列どちらが速い」論争とは意味が違う。
とはいえ、実装と最適化次第なのは当然。
0074デフォルトの名無しさん
2008/09/27(土) 13:58:29・ algorithm に渡す時はイテレータ
のような理由で、イテレータを使ったほうが、より C++ らしいとはいえるだろう。
0075デフォルトの名無しさん
2008/09/27(土) 14:48:130076デフォルトの名無しさん
2008/09/27(土) 14:54:45誰に言ってるの。
0077デフォルトの名無しさん
2008/09/27(土) 15:06:180078デフォルトの名無しさん
2008/09/27(土) 20:09:520079デフォルトの名無しさん
2008/09/28(日) 12:46:14find_ifアルゴリズムを使いたいのですが、
書籍やwebページを参照して
find_if(v.begin(), v.end(), IsTestes);
というふうに記述するとコンパイラがエラーを吐きます。
(IsTestedの行: error C3867: 関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために & を使用してください)
&を付けて関数ポインタにしても解決しませんでした。
これはVS2008がヘンなの? 俺が何か見落としてる?
0080デフォルトの名無しさん
2008/09/28(日) 12:48:44関数オブジェクトでぐぐるべき
0081デフォルトの名無しさん
2008/09/28(日) 13:30:09ありがとうございます。
関数オブジェクトに変えたら通りました。
0082デフォルトの名無しさん
2008/09/29(月) 13:56:19実装の話だが、VC++のChecked Iterator有効状態だとiteratorアクセスが遅く、
vectorの単なる走査だと生ポインタ取り出してインクリメントしたほうが速くなる
結果というのをどっかで見た
0083デフォルトの名無しさん
2008/09/29(月) 22:32:490084デフォルトの名無しさん
2008/09/30(火) 00:08:56デフォルトで安全なほうに振ってるからな
それ知らずにベンチマークして「遅いwww糞杉www」
って言ってる奴マジ恥ずかしい
0085デフォルトの名無しさん
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)++)
0086デフォルトの名無しさん
2008/10/03(金) 21:24:03解説しろといわれてもこまるほど
簡単なというか基本的なことしかでてきてない
コードなんだがなにが分からないの?
イテレータ知らないの?
0087デフォルトの名無しさん
2008/10/03(金) 22:10:28typeにはstd::vectorとかのコンテナ型を指定する。objはそのインスタンス。iはイテレータを使ったループ変数だ。
こんな風に使う。
std::vector<int> vecx;
(略).
foreach(std::vector,vecx,i)
{
std::cout<<*i;
}
0088デフォルトの名無しさん
2008/10/04(土) 05:58:22多少重い部品使っても全然平気。
0089デフォルトの名無しさん
2008/10/04(土) 09:28:460090デフォルトの名無しさん
2008/10/04(土) 11:03:460091デフォルトの名無しさん
2008/10/04(土) 11:42:58「#define foreach(type,obj,i)」のtypeを無くして引数を2個だけにできますか?
何に使うかはともかくとして、ちょっと気になった。
0092デフォルトの名無しさん
2008/10/04(土) 11:54:38BOOST_FOREACHを使う。
0093デフォルトの名無しさん
2008/10/04(土) 12:06:590094デフォルトの名無しさん
2008/10/04(土) 12:19:190095デフォルトの名無しさん
2008/10/04(土) 12:53:530096デフォルトの名無しさん
2008/10/04(土) 13:37:59std::vector<std::vector<int> > vec(10, std::vector<int>(10));
BOOST_FOREACH(std::vector<int>& row, vec)
BOOST_FOREACH(int& i, row)
i = 999;
0097デフォルトの名無しさん
2008/10/04(土) 13:44:59autoを使う
0098デフォルトの名無しさん
2008/10/05(日) 01:30:25autoは別スレの話題だ
typeofならギリギリ可
0099デフォルトの名無しさん
2008/10/05(日) 15:35:23いま、
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];
とかやっちゃってます。
0100デフォルトの名無しさん
2008/10/05(日) 15:42:29BOOST_FOREACHを使うとend()がキャッシュされる分高速化されるらしい。
0101デフォルトの名無しさん
2008/10/05(日) 15:57:14>>99のように 数値変数でループ回数を制御する方が速いことが多い
x86のような性能優先のCPUならどっちでも変わらないが
組み込みに使える普通のCPUだと差がつくことが多い
010299
2008/10/05(日) 16:14:17ちなみに、目的としては動的に確保できる多次元配列のアクセスを速く
したいんだけれども。array[][][]と同程度の速度が出たりしますか。
・・・なんて聞いてないで自分で実験してみればいいか^^;
BOOSTはデフォルトでビルドできないためソースを人に渡せないから、
速度の関係ないアルゴリズム検証用にしか使ってません。
0103デフォルトの名無しさん
2008/10/05(日) 16:19:220104デフォルトの名無しさん
2008/10/05(日) 16:27:35そうじゃなくてboost入れてない人がいるって話だろ
010599
2008/10/05(日) 16:48:34ソース書いて、アセンブラ見てみたんだけど、一見したところ変わらないみたい。
通常、静的な多次元配列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も同じような多重メモリアクセスをやってるような
気がするんだけど、遅くならないのかな。
0106デフォルトの名無しさん
2008/10/05(日) 16:56:160107デフォルトの名無しさん
2008/10/05(日) 16:58:03行毎に列の大きさを変えられる利便性とのトレードオフ
010899
2008/10/05(日) 17:16:38僕のケースでは大抵の場合は行毎のサイズは固定で、初期化の時から変化
しないって場合が多いので、1次元配列で確保してます。例えば画像デー
タみたいに、ユーザの入力にあわせて初期化サイズが変わるみたいな状況です。
この場合、データの規則性・連続性は保障されるので、構造的には静的多
次元配列と同じパフォーマンスが出せるはずですが、最適化してくれるものですか?
もし可能なら、変数沢山のマクロから解放されてソースも読みやすくなるし、
メモリリークもしないから非常に素敵なんだけどな・・・。
0109デフォルトの名無しさん
2008/10/05(日) 17:17:540110デフォルトの名無しさん
2008/10/06(月) 03:44:50結局の所自分で簡単なクラス作って使うのが無難
0111デフォルトの名無しさん
2008/10/15(水) 12:18:18vectorの要素0から99までの最大値をmax_elementで求める
vectorの要素100から199までの最大値をmax_elementで求める
vectorの要素200から299までの最大値をmax_elementで求める
省略
という処理をしたいんですが、どのようにすればいいでしょうか?
0112デフォルトの名無しさん
2008/10/15(水) 12:22:41b = *max_element(&v[100], &v[200]);
c = *max_element(&v[200], &v[300]);
0113デフォルトの名無しさん
2008/10/15(水) 12:36:310114デフォルトの名無しさん
2008/10/15(水) 12:37:38それで出来るはずだと思って試していたら、他の所でミスしてましたorz。
iteratorを使って
ループ文中で
if(count%100){
a=*max_element(iterator,ここが分からない);
}
という風にiteratorを基準に、後ろ100個目までを範囲指定することを出来ませんか?
0115デフォルトの名無しさん
2008/10/15(水) 12:41:30a=*max_element(iterator, iterator + 100);
0116デフォルトの名無しさん
2008/10/15(水) 12:42:360117デフォルトの名無しさん
2008/10/15(水) 12:53:310118デフォルトの名無しさん
2008/10/19(日) 00:12:46ポインタの配列なの?
0119デフォルトの名無しさん
2008/10/19(日) 00:21:37そのものじゃないはず
0120デフォルトの名無しさん
2008/10/19(日) 01:13:31単にポインタをtypedefしている実装もあれば、classにしてる実装もあるって
聞いたような気がする夢をみたかもしれない
0121デフォルトの名無しさん
2008/10/19(日) 16:43:31vector<vector<hoge> >::iterator
のことかい。
0122デフォルトの名無しさん
2008/10/19(日) 17:21:14でもどっちにしても話が合わない気がする
0123デフォルトの名無しさん
2008/10/19(日) 17:24:230124デフォルトの名無しさん
2008/10/19(日) 17:37:420125デフォルトの名無しさん
2008/10/19(日) 18:30:230126デフォルトの名無しさん
2008/10/19(日) 18:44:130127118
2008/10/20(月) 09:02:02vector<int>::iteratorみたいなもんです。書き方が悪かったですね。すみません
2Dライブラリだったらピクセルデータの配列を引数
3Dライブラリだったら座標データの配列を引数
にとる関数がありますけど、そういう関数にvectorで管理してるデータを
渡したいときは、どのようにしてますか?
私は、vectorに入ってるデータのサイズ分の配列を作って、そいつに入れてから
ライブラリの関数に渡すってことをしてたんですけど、もっとスマートな方法って
ないですか?
0128デフォルトの名無しさん
2008/10/20(月) 09:33:27でもvectorの内容がメモリ上で連続している保証はある
だからvがvector<T>なら、Tの配列を要求する関数に&v[0]を渡しても大丈夫
イテレータitに対応するポインタを渡したければ&*itのようにすればいい
0129デフォルトの名無しさん
2008/10/20(月) 12:26:11vector便利過ぎる
0130デフォルトの名無しさん
2008/10/21(火) 09:58:32Win32 APIを使う場合は、配列を使わない訳にはいかないから、
何番目という数字が必要な場合が出てくるし、
配列要素アクセスでは、i < vec.size()の記述でないとおかしいから。
0131デフォルトの名無しさん
2008/10/21(火) 10:52:18vectorでインデックスなんか使ったこと無いな。
algorithmを使う場合は、イテレータを使わない訳にはいかないから、
beginとendが必要な場合が出てくるし、
イテレータアクセスでは、i != vec.end()の記述でないとおかしいから。
0132デフォルトの名無しさん
2008/10/21(火) 12:22:45地球上の誰も興味のない話を唐突にされても。
0133デフォルトの名無しさん
2008/10/21(火) 19:53:510134デフォルトの名無しさん
2008/10/21(火) 20:01:15インデックスでいいじゃんでも C++ 使うならイテレータつかったほうがいいのかなーどうしよー
と迷うに迷って混在させてgdgdになってる俺みたいな人には重要な話
0135デフォルトの名無しさん
2008/10/21(火) 20:26:300136デフォルトの名無しさん
2008/10/21(火) 20:51:16対象のvectorが見えてるのに型が判らないってどういう状況だ?
0137デフォルトの名無しさん
2008/10/21(火) 21:01:51早くautoが欲しい。
0138デフォルトの名無しさん
2008/10/21(火) 21:04:220139デフォルトの名無しさん
2008/10/22(水) 13:30:52各種LL言語が有用性を示してるじゃん
0140デフォルトの名無しさん
2008/10/22(水) 13:36:500141デフォルトの名無しさん
2008/10/22(水) 19:03:29typedef 一回書けば解決
0142デフォルトの名無しさん
2008/10/22(水) 21:04:19mapとかつかったらもっと効率よくなりますか?ソートするキーはdouble型の値で、降順です。
0143デフォルトの名無しさん
2008/10/22(水) 21:30:53読み込んでいる間にソートされるので。
もしメモリ間の転送であっても速いとは思う
0144デフォルトの名無しさん
2008/10/22(水) 21:40:54pairでdouble型とchar型のメンバを作って、doubleをキーにソートって感じにしたいんですが、どうしたらいいですか?
char型のメンバは重複する場合もあります。
0145デフォルトの名無しさん
2008/10/22(水) 21:46:00整数とかポインタなら、数千まではvectorの方が一般的に他のコンテナよりも速い
0146デフォルトの名無しさん
2008/10/22(水) 21:49:310147デフォルトの名無しさん
2008/10/22(水) 21:50:320148デフォルトの名無しさん
2008/10/22(水) 21:51:290149デフォルトの名無しさん
2008/10/22(水) 21:52:150150デフォルトの名無しさん
2008/10/22(水) 22:02:120151デフォルトの名無しさん
2008/10/22(水) 22:03:050152デフォルトの名無しさん
2008/10/22(水) 22:13:56実測してみます
0153デフォルトの名無しさん
2008/10/22(水) 22:18:40double dist;
char name[20];
}DIST;
int main(){
std::set<DIST> distance;
distance.insert( 200 ); →2要素を代入するにはどうすればいいですか?
}
0154デフォルトの名無しさん
2008/10/22(水) 22:22:03DIST型のオブジェクトを渡すべきところへ200を渡してどーすんですか
0155デフォルトの名無しさん
2008/10/22(水) 22:36:25領域を増やしていくならsetのほうがはやい
0156デフォルトの名無しさん
2008/10/22(水) 22:37:13渡し方がわかりません。ソートに使うキーはdoubleのほうです
0157デフォルトの名無しさん
2008/10/22(水) 22:40:53std::pairでくるんで渡せ
0158デフォルトの名無しさん
2008/10/22(水) 22:54:03struct 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";
}
0159デフォルトの名無しさん
2008/10/22(水) 22:54:46こうですか?
0160デフォルトの名無しさん
2008/10/22(水) 22:56:05通りません・・・
0161デフォルトの名無しさん
2008/10/22(水) 22:56:51これ頭に付けてるよな
#include <iostream>
#include <cstring>
#include <set>
0162デフォルトの名無しさん
2008/10/22(水) 23:02:07コピペみすってました・・・
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;
}
};
これがどういうことをしてるのかわかりません。
0163デフォルトの名無しさん
2008/10/22(水) 23:07:19まず二要素を一度に代入できるように、DISTにコンストラクタを付けた。
こうする事によって一時オブジェクトが生成できるようになる。
次にソートの基準をdoubleにするために、叙述関数もしくは関数オブジェクト
を書かなければならないが、この場合は関数オブジェクトを書いている。
というのもstd::setのデフォルトの比較基準はless<DIST>となり、これは
存在しないので、自分で書かなければならないからだ。そこで比較関数
オブジェクトにCompを使う事にして自分で書いている。
0164デフォルトの名無しさん
2008/10/22(水) 23:09:370165デフォルトの名無しさん
2008/10/22(水) 23:20:44class 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";
}
0166デフォルトの名無しさん
2008/10/23(木) 02:37:33DIST dist;
distance.insert(dist);
0167デフォルトの名無しさん
2008/10/23(木) 19:19:10}
という関数に
char mozi[256];で宣言された文字列をfunc(mozi)みたいに渡せますか?
0168デフォルトの名無しさん
2008/10/23(木) 19:20:020169デフォルトの名無しさん
2008/10/23(木) 19:21:300170デフォルトの名無しさん
2008/10/23(木) 19:23:210171デフォルトの名無しさん
2008/10/23(木) 19:26:390172デフォルトの名無しさん
2008/10/24(金) 00:21:210173デフォルトの名無しさん
2008/10/25(土) 03:20:25basic_string<char>でテンプレートだし。
0174デフォルトの名無しさん
2008/10/25(土) 04:09:49馬鹿発見
0175デフォルトの名無しさん
2008/10/25(土) 08:24:14ん・・あぁ・・そうだね・・・・
0176デフォルトの名無しさん
2008/10/25(土) 10:01:54const char *を引数にとるコンストラクタを持つ文字列クラスは、STL固有ではありません。
0177デフォルトの名無しさん
2008/10/25(土) 17:43:470178デフォルトの名無しさん
2008/10/25(土) 18:02:210179デフォルトの名無しさん
2008/10/25(土) 18:47:47const T* だよ
>>178
STLであろうがなかろうが全部自前で似たようなものを作れるぞ
0180デフォルトの名無しさん
2008/10/25(土) 20:47:060181デフォルトの名無しさん
2008/10/25(土) 21:03:120182デフォルトの名無しさん
2008/10/25(土) 21:23:120183デフォルトの名無しさん
2008/10/25(土) 21:36:55もともとのAlexanderのSTLにはbasic_string<>は無かった。
しかし、標準化の過程でSTLコンテナに適合するようにされた。
basic_string<>がalgorithmと重複するようなメンバ関数を持っていたり、
しかもそれがイテレータではなくsize_typeを扱ったりするのはその名残。
0184デフォルトの名無しさん
2008/10/27(月) 10:23:42>basic_string<char>でテンプレートだし。
てのが気になるなあ…
「stream I/O もテンプレートだからSTL」とか言い出しかねない勢い。
0185デフォルトの名無しさん
2008/10/27(月) 12:46:36「C++コンパイラに付いてくるtemplate classを使ったもの全部=STL」
と思っている人は多い気がする
実用上困る事項でもないし・・・
0186デフォルトの名無しさん
2008/10/27(月) 15:08:26今回も「ああ、またですか」てなもんだ。
でもbasic_stringはもう
仲間に入れてあげてもいいと思うんだ。
0187デフォルトの名無しさん
2008/10/27(月) 16:00:31basic_stringなんてC++標準化委員会も「失敗作だった」と
認めているじゃないか
0188デフォルトの名無しさん
2008/10/27(月) 20:21:300189デフォルトの名無しさん
2008/10/27(月) 20:55:00たまにこのスレを斜め読みするものとしては
そういう話が定期的に回ってくれると
自身の無知加減がよくわかるから助かるよ。
basic_stringって曰くがあったのか・・・(´・ω・)
0190デフォルトの名無しさん
2008/10/28(火) 01:35:540191デフォルトの名無しさん
2008/10/28(火) 01:47:14認めてたぞ
0192デフォルトの名無しさん
2008/10/28(火) 01:50:21認めてたぞ
0193デフォルトの名無しさん
2008/10/28(火) 04:45:29認めてたぞ
0194デフォルトの名無しさん
2008/10/28(火) 11:11:110195デフォルトの名無しさん
2008/10/28(火) 11:40:210196デフォルトの名無しさん
2008/10/28(火) 20:20:17そのなかで一番出現率が高い文字列を探すには
STLのどんなデータ構造とアルゴリズムをつかえばいいでしょうか?
0197デフォルトの名無しさん
2008/10/28(火) 20:43:380198デフォルトの名無しさん
2008/10/28(火) 20:44:070199デフォルトの名無しさん
2008/10/28(火) 20:48:020200デフォルトの名無しさん
2008/10/28(火) 20:51:580201デフォルトの名無しさん
2008/10/28(火) 21:02:460202デフォルトの名無しさん
2008/10/28(火) 21:25:400203デフォルトの名無しさん
2008/10/28(火) 21:27:190204デフォルトの名無しさん
2008/10/28(火) 21:32:400205デフォルトの名無しさん
2008/10/28(火) 21:36:06struct a {
func() {}
};
struct b {
vector <a> va:
};
とあって、for_eachアルゴリズムでva内のfuncを呼び出すには
どのような書き方をすればいいのでしょうか?mem_fun_refと
bind2ndを組み合わせるのでしょうか?
0206デフォルトの名無しさん
2008/10/28(火) 21:44:530207デフォルトの名無しさん
2008/10/28(火) 22:11:52連想配列ですよね?stringがキーでintが値ってことですか?
0208デフォルトの名無しさん
2008/10/28(火) 22:14:090209デフォルトの名無しさん
2008/10/28(火) 22:17:420210デフォルトの名無しさん
2008/10/28(火) 22:30:23map<string,int> test;
test["hoge"]++;
sort(test.begin(), test.end(), greater<int>());
こうですか?
0211デフォルトの名無しさん
2008/10/28(火) 22:40:03挿入した時点でキーで自動的にソートされてるんだから
全部要素を挿入したらvectorにでも全要素をコピーして
今度はint基準でソートすればよい
0212デフォルトの名無しさん
2008/10/28(火) 22:41:26ちょっとやってみます
0213デフォルトの名無しさん
2008/10/28(火) 22:43:39最大値を知りたいのではなく、最大値をとるキーをしりたいんです
0214デフォルトの名無しさん
2008/10/28(火) 22:51:170215デフォルトの名無しさん
2008/10/28(火) 22:55:46struct 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);
}
0216デフォルトの名無しさん
2008/10/28(火) 22:58:140217デフォルトの名無しさん
2008/10/28(火) 22:59:29ちょっと解読してみます
0218デフォルトの名無しさん
2008/10/28(火) 23:01:17挿入が楽
それだけ
0219デフォルトの名無しさん
2008/10/28(火) 23:03:530220デフォルトの名無しさん
2008/10/28(火) 23:04:51O(n)で済むぞ
0221デフォルトの名無しさん
2008/10/28(火) 23:05:45えっとどうするんですか?
0222デフォルトの名無しさん
2008/10/28(火) 23:07:06シークエンスの最大値を求めるのにいちいちソートするのか?お前さんは
0223デフォルトの名無しさん
2008/10/28(火) 23:09:36イテレータを回すだけ
最大値が知りたいだけならそれでいい
0224デフォルトの名無しさん
2008/10/28(火) 23:11:330225デフォルトの名無しさん
2008/10/28(火) 23:12:10単純でいて意外と深いのかもしれないw
0226デフォルトの名無しさん
2008/10/28(火) 23:17:42string 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++;
}
}
こうしたんですが、値自体はどうやって参照するんですか?
0227デフォルトの名無しさん
2008/10/28(火) 23:21:000228デフォルトの名無しさん
2008/10/28(火) 23:23:120229デフォルトの名無しさん
2008/10/28(火) 23:25:51int 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;
}
コンパイルはできるんですが、とまります・・・
0230デフォルトの名無しさん
2008/10/28(火) 23:27:09そうなんですよね。その辺は工夫でできそうです
0231デフォルトの名無しさん
2008/10/28(火) 23:29:41なんちって
0232デフォルトの名無しさん
2008/10/28(火) 23:30:49しかし動かないです・・・
0233デフォルトの名無しさん
2008/10/28(火) 23:34:12>string maxkey='\0';
が良くない。これはstring maxkey=NULL; と同じ意味になる。
つまりアドレス0をアクセスする文字列で初期化しようとする。
0234デフォルトの名無しさん
2008/10/28(火) 23:35:440235デフォルトの名無しさん
2008/10/28(火) 23:37:58if文内で代入するので問題ないかと思ったんですが・・・
>つまりアドレス0をアクセスする文字列で初期化しようとする。
??
0236デフォルトの名無しさん
2008/10/28(火) 23:38:35×つまりアドレス0をアクセスする文字列で初期化しようとする。
○つまりアドレス0から始まるC文字列で初期化しようとする。
処理系によっては文字列が大きすぎて止まり、他の処理系では
アドレス0をアクセスするのでセグメントエラーで止まったりする。
0237デフォルトの名無しさん
2008/10/28(火) 23:39:170238デフォルトの名無しさん
2008/10/28(火) 23:40:39charだけを引数に取るコンストラクタがないため、
暗黙の変換でconst char*を引数に取るコンストラクタが呼ばれてしまう。
0239デフォルトの名無しさん
2008/10/28(火) 23:40:400240デフォルトの名無しさん
2008/10/28(火) 23:51:420241デフォルトの名無しさん
2008/10/28(火) 23:55:17map<string,int> test;
while(){
if(条件){ }
}
として、条件が成立したときだけ、testを初期化(すべてのキーに対して値を0にしたい)したいのですが、どうすればいいですか?
0242デフォルトの名無しさん
2008/10/28(火) 23:55:37だから、std::string::string(0) が呼ばれてしまう。
この意味をよく考えてみろ。
0243デフォルトの名無しさん
2008/10/28(火) 23:59:24イテレータを回して全てのsecondに0を代入するしかないだろ
0244デフォルトの名無しさん
2008/10/29(水) 00:00:28map<string,int> test;
}
ではだめですか?
0245デフォルトの名無しさん
2008/10/29(水) 00:04:15それはまずい。if文の外側のtestが隠蔽されてしまう。
0246デフォルトの名無しさん
2008/10/29(水) 00:08:100247デフォルトの名無しさん
2008/10/29(水) 00:08:27map<string,int> test;
while(){
if(){
map<string,int> test;
}
}
でもですか?
0248デフォルトの名無しさん
2008/10/29(水) 00:10:01同じ事だ。
>>246
うむ・・・釣られてるのやもしれぬ
0249デフォルトの名無しさん
2008/10/29(水) 00:15:380250デフォルトの名無しさん
2008/10/29(水) 00:19:30・差し当たってSTLよりも先にstringの予備知識を付ける
・スコープの意味を理解する
これは最低限やっておく事をお勧めする
0251デフォルトの名無しさん
2008/10/29(水) 00:20:280252デフォルトの名無しさん
2008/10/29(水) 00:29:30itr->second = 0;
itr++;
}
初期化はこんな感じですかね?
firstのstringの初期化もいりますか?itr>first="";としたらコンパイルできなかったので・・・
0253デフォルトの名無しさん
2008/10/29(水) 00:35:55なんでそんなことがしたいんだよ!
0254デフォルトの名無しさん
2008/10/29(水) 00:39:00お前は一度STL標準講座の本を買ってきてサンプルプログラムを
全部手で打ち込んで走らせて実行してみろ。
俺はそうやって覚えた。
0255デフォルトの名無しさん
2008/10/29(水) 00:40:340256デフォルトの名無しさん
2008/10/29(水) 04:25:30その頻度でいちいち書き込まれちゃかなわん。
ていうか、ある疑問を自力で解こうと動く過程で、副作用的に身につく多くの事柄こそが
実質的には学習のメインだと思うんだが(疑問を1つ解決する度に、幾つもの新知識が身につく)、
いちいち質問してたらその一番大事な効能が激減するぞ。
0257デフォルトの名無しさん
2008/10/29(水) 06:08:330258デフォルトの名無しさん
2008/10/29(水) 07:53:270259デフォルトの名無しさん
2008/10/29(水) 08:05:31C では int だけど C++ では char 。
0261デフォルトの名無しさん
2008/10/29(水) 10:43:00何も考えず「あほ」呼ばわりする程度には馬鹿なんですね。
0262デフォルトの名無しさん
2008/10/29(水) 12:49:340263デフォルトの名無しさん
2008/10/29(水) 13:28:070264デフォルトの名無しさん
2008/10/29(水) 17:05:21だからあのときあれほどC++相談室とスレ分けるなと言ったのに・・・
0265デフォルトの名無しさん
2008/10/29(水) 17:08:29一緒にしたら荒れて収拾付かなくならなくないか?
C++相談室が過疎ってるから丁度いいのかもしれんけど
0266デフォルトの名無しさん
2008/10/29(水) 21:05:440267デフォルトの名無しさん
2008/10/30(木) 17:12:36Bの順で並び替えるにはどうすればいいの?
0268デフォルトの名無しさん
2008/10/30(木) 17:17:32Aで安全ソート
ってことか?
0269デフォルトの名無しさん
2008/10/30(木) 17:52:56>>267
あ1 あ2 あ3 い7 い9 う4 う5 う6
てな感じ?
0270デフォルトの名無しさん
2008/10/30(木) 22:02:56安全じゃなくて安定だろ
0271デフォルトの名無しさん
2008/10/31(金) 00:01:290272デフォルトの名無しさん
2008/10/31(金) 07:46:270273デフォルトの名無しさん
2008/10/31(金) 07:54:360274デフォルトの名無しさん
2008/10/31(金) 08:11:40ほんとにそういうアルゴリズムがあるんだよな
最初見たときギャグかと思ったが
http://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88
0275デフォルトの名無しさん
2008/10/31(金) 08:54:380276デフォルトの名無しさん
2008/10/31(金) 08:54:400277デフォルトの名無しさん
2008/10/31(金) 09:48:11erase()はしてない、参照前にpush_back()をした
push_back()すると以前のイテレータが無効になるのか?
0278デフォルトの名無しさん
2008/10/31(金) 09:52:06無効になるコンテナもある。vectorとかdequeとか。
無効にならないコンテナもある。listとかmapとか。
0279デフォルトの名無しさん
2008/10/31(金) 12:25:13場所を保持できないので必要なデータをとるときに
最初から検索しなきゃならないので不便だな
listに変更する
0280デフォルトの名無しさん
2008/10/31(金) 12:29:080281デフォルトの名無しさん
2008/10/31(金) 12:58:070282デフォルトの名無しさん
2008/10/31(金) 13:13:010283デフォルトの名無しさん
2008/10/31(金) 15:29:090284デフォルトの名無しさん
2008/10/31(金) 15:45:12参照やポインタは無効にならない。
微妙に便利な時もあるかもしれない。
0285デフォルトの名無しさん
2008/10/31(金) 16:25:56参照とかポインタは変わるだろ
0286デフォルトの名無しさん
2008/10/31(金) 16:57:59dequeだと変わらない
0287デフォルトの名無しさん
2008/10/31(金) 17:25:060288デフォルトの名無しさん
2008/10/31(金) 17:48:20> but has no effect on the validity of references to elements of the deque.
先頭と末尾への挿入は、イテレータは無効にするが要素への参照は無効にしない。
0289デフォルトの名無しさん
2008/10/31(金) 17:53:240290デフォルトの名無しさん
2008/10/31(金) 17:53:27deque<T>の仕様をとてつもなく乱暴に要約すると、
vector<T*>みたいな構造になってる。
だから拡張されても要素自体のアドレスは変わらない。
0291デフォルトの名無しさん
2008/10/31(金) 17:55:250292デフォルトの名無しさん
2008/10/31(金) 18:37:10ランダムアクセスできるだけでメモリは続いてないでしょ?
0293デフォルトの名無しさん
2008/11/01(土) 01:17:190294デフォルトの名無しさん
2008/11/01(土) 01:20:500295デフォルトの名無しさん
2008/11/01(土) 01:21:280296デフォルトの名無しさん
2008/11/01(土) 01:29:230297デフォルトの名無しさん
2008/11/01(土) 01:49:09っていうデータをまとめた記事(英語)が以前貼られてたね。
0298デフォルトの名無しさん
2008/11/01(土) 09:50:07・ランダムアクセスしたい
・要素を加えたり抜いたりすることがある
そういうときに使う。
vectorでやると要素の追加・削除で領域を連続にするためのコストがかかる。
0299デフォルトの名無しさん
2008/11/01(土) 11:40:49イテレータが無効になる場合ある?
0300デフォルトの名無しさん
2008/11/01(土) 11:48:270301デフォルトの名無しさん
2008/11/01(土) 12:57:270302デフォルトの名無しさん
2008/11/01(土) 14:17:32結局 vector<list<something>::iterator> みたいなのを使うことになって
vector が登場する罠
0303デフォルトの名無しさん
2008/11/01(土) 17:56:00boost::multi_index
の話しに
0304デフォルトの名無しさん
2008/11/02(日) 00:29:30vc7,8は16bytes
gcc3.4.4(cygwni)は512bytes
vcの16って小さくね?
stringなんかはlistと同じになっちゃわないか
このサイズを指定できるdequeがほしいんだが
boostにあったりするかなあ
0305sage
2008/11/02(日) 02:27:17listのiteratorって、
要素の追加とか削除とかして要素数が変わってしまっても、
そのまま使える保証はあるんでしょうか?
要素の参照は保証されている思うんですが、iteratorが使えるのか。
VCでは実際動くみたいですが言語仕様的にいかがなものか。
ぜひアドバイスおねがいします。
0306デフォルトの名無しさん
2008/11/02(日) 02:48:550307デフォルトの名無しさん
2008/11/02(日) 02:51:240308sage
2008/11/02(日) 03:15:01ブラボーlist!使いやすさ爆発です。
そして以後ちゃんと仕様書読むようにします。
ありがとうございました。m(_ _)m
0309デフォルトの名無しさん
2008/11/02(日) 10:20:030310デフォルトの名無しさん
2008/11/02(日) 11:41:22今は結構まともだよ
0311デフォルトの名無しさん
2008/11/02(日) 12:10:26書いてないだけで、これ以外にもあるのかもしれないがw
http://msdn.microsoft.com/en-us/library/x84h5b78.aspx
0312デフォルトの名無しさん
2008/11/02(日) 13:37:160313デフォルトの名無しさん
2008/11/02(日) 13:45:550314デフォルトの名無しさん
2008/11/02(日) 14:30:28ATL(笑)
0315デフォルトの名無しさん
2008/11/02(日) 15:35:160316デフォルトの名無しさん
2008/11/02(日) 15:45:000317デフォルトの名無しさん
2008/11/02(日) 20:53:06翻訳的な意味で
0318デフォルトの名無しさん
2008/11/04(火) 13:56:24C++Builder2009にはBoost標準添付だったが
0319デフォルトの名無しさん
2008/11/04(火) 14:33:060320デフォルトの名無しさん
2008/11/05(水) 11:45:38mapを宣言したとき、intの領域は初期化されているんでしょうか?
されていないとしたら、
map<string,int>::iterator itr;
map<string,int>::iterator itrEnd;
itr = hoge.begin();
itrEnd = hoge.end();
while(itr != itrEnd){
itr->second = 0;
itr++;
}
のように初期化すればいいんですかね?
0321デフォルトの名無しさん
2008/11/05(水) 11:58:440322デフォルトの名無しさん
2008/11/05(水) 12:00:490323デフォルトの名無しさん
2008/11/05(水) 12:12:160324デフォルトの名無しさん
2008/11/05(水) 12:33:11だけだと map コンテナの中身は空っぽだから
string も int もまだ領域確保されていなくて
デフォルト初期化も値初期化もはじまっていない
空のコンテナの begin() と end() は無効な要素を指している
無効な要素に対するアクセスは失敗する
itr->second = 0; // やっちゃらめぇ
だと思います
0325デフォルトの名無しさん
2008/11/05(水) 12:47:23そうなるなら>>320を走らせちゃってもアクセス違反にはならないが
0326デフォルトの名無しさん
2008/11/05(水) 12:51:39なるほど
void func(){
map<string int> hoge;
}
の関数内で宣言した場合、関数が呼び出される度に 空っぽになるんでしょうか?
0327デフォルトの名無しさん
2008/11/05(水) 13:04:070328デフォルトの名無しさん
2008/11/05(水) 13:16:46とやればちゃんと0から加算されるんですか?
0329デフォルトの名無しさん
2008/11/05(水) 13:17:25規格書に書いてあるの?
0330デフォルトの名無しさん
2008/11/05(水) 13:18:24vectorとmapを混同するな
0331デフォルトの名無しさん
2008/11/05(水) 13:19:34規格ではmapにoperator[]を適用した場合もしそのキーが
存在しない時はデフォルトのコンストラクタで初期化される
決まりになってるからint()、つまり0から始まる
0332デフォルトの名無しさん
2008/11/05(水) 13:22:4323.1.7
0333デフォルトの名無しさん
2008/11/05(水) 13:25:49どの辺を混同していますか?
0334デフォルトの名無しさん
2008/11/05(水) 13:25:53サンクス
これは目から鱗だ
0335デフォルトの名無しさん
2008/11/05(水) 20:23:33++it とかするけど it+=8 のような感じで8個分移動する方法はないの?
0336デフォルトの名無しさん
2008/11/05(水) 20:26:55advance
0337デフォルトの名無しさん
2008/11/05(水) 20:27:320338デフォルトの名無しさん
2008/11/05(水) 20:36:44あと、ある値を持つコンテナを検索する関数を作ったのだが
見つからなかった場合NULLを返そう思ったら
itにNULL代入できない。しかも it ==0とか演算も不可
このような場合みんなはどうしてるん?
0339デフォルトの名無しさん
2008/11/05(水) 20:40:21end返すのはいやなのか?
0340デフォルトの名無しさん
2008/11/05(水) 20:47:320341デフォルトの名無しさん
2008/11/05(水) 21:25:090342デフォルトの名無しさん
2008/11/05(水) 21:28:590343デフォルトの名無しさん
2008/11/05(水) 21:33:230344デフォルトの名無しさん
2008/11/05(水) 21:53:290345デフォルトの名無しさん
2008/11/05(水) 22:49:22find_if( List.begin(), List.end(), compare( 引数1 、 引数2 ) );
0346デフォルトの名無しさん
2008/11/05(水) 22:56:090347デフォルトの名無しさん
2008/11/06(木) 16:02:53vcのstdext::hash_mapならreverse_iteratorがあるぞ
0348デフォルトの名無しさん
2008/11/07(金) 00:51:20_STLP_USE_STATIC_LIBを指定すると
↓と言われてリンクできません。
ファイル 'stlportstld_statix.5.1.lib' を開くことができません。
stlportstld_static.5.1.libならあるんですけど。バグですか?
0349デフォルトの名無しさん
2008/11/07(金) 01:02:220350デフォルトの名無しさん
2008/11/07(金) 01:12:470351デフォルトの名無しさん
2008/11/08(土) 12:18:23下記の処理が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;
}
0352デフォルトの名無しさん
2008/11/08(土) 12:36:59const size = m_item.size();
for(j = 0; j < size; ...
キミのままだと、jのループ後とにm_item.size()関数が評価される。
0353デフォルトの名無しさん
2008/11/08(土) 12:47:16vector使う前に
#define _SECURE_SCL 0を入れると良い感じらしい
あと、まさかとは思うけどDebug版じゃなくて
Release版で実行してないとかはないよね?
0354デフォルトの名無しさん
2008/11/08(土) 12:58:480355デフォルトの名無しさん
2008/11/08(土) 12:59:390356デフォルトの名無しさん
2008/11/08(土) 13:01:240357デフォルトの名無しさん
2008/11/08(土) 13:02:150358デフォルトの名無しさん
2008/11/08(土) 14:00:460359デフォルトの名無しさん
2008/11/08(土) 14:07:46>>352が主な原因だったようです。>>353でも多少改善しました。
二重ループをやめて、qsort()でもしてから一重ループで探すというのもいいかもしれませんが、
アルゴリズムを変更しないとVBより遅くなるというのは腑に落ちませんね。
ベクターは使い方次第でパフォーマンスに劇的に影響するようで、なんか怖いです。
0360デフォルトの名無しさん
2008/11/08(土) 14:24:53if (int i = 0; i < tbl.size(); i++) tbl[i] ・・・
みたいな使い方と、
配列で、
if (int i = 0; i < TBL_SIZE; i++) tbl[i] ・・・
みたいな使い方をした場合、
Debugビルドで最適化なしだと数十倍の差で、Releaseビルドで、最適化ありだと、二倍程度の差だった。
0361デフォルトの名無しさん
2008/11/08(土) 14:26:010362デフォルトの名無しさん
2008/11/08(土) 14:31:04VB知らないんだけど、この場合のm_item_numってなに?
それ次第では、そもそも「内容は全く同じ」という認識が間違ってたことに。
0363デフォルトの名無しさん
2008/11/08(土) 14:35:47>for( i= 1; i< 0xFFFF; i++ ){
for( i= 1; i<= 0xFFFF; i++ ){
調べてる要素が違ってるなら50倍違ってもおかしくはないけど。
あとは計測時間が短すぎて時間を計ってるタイマーの精度の違いが出てるとか
とりあえず>>351のコードをReleaseビルド&_SECURE_SCLでコンパイルしてVBより50倍も遅いなんてことあり得ないだろ。
0364デフォルトの名無しさん
2008/11/08(土) 14:53:51ちゃんと最適化かけたか?
0365デフォルトの名無しさん
2008/11/08(土) 15:06:100366351
2008/11/08(土) 15:08:04なんかデバッグなしにしたり最適化とかするとエラーが出てコンパイルできなかったので、何となく諦めてました。
>>359をやった上で最適化まですると、VBより速くなりました。
めでたしめでたし。
0367デフォルトの名無しさん
2008/11/08(土) 15:10:020368デフォルトの名無しさん
2008/11/08(土) 15:12:420369デフォルトの名無しさん
2008/11/08(土) 15:14:42あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ
Itemがidをもつぐらいなら用途にあってる可能性高いし
0370デフォルトの名無しさん
2008/11/08(土) 15:20:360371デフォルトの名無しさん
2008/11/08(土) 15:27:41ちょっとよく分かりませんが、勉強してみます。
今はVBのコードをC++にツラツラ置き換える作業だけをやってます。
VBの配列 → std::vector
VBのString → std::string
という置き換えで、今のところこれ以上のSTLの知識はありません。
アルゴリズムを下手に変えると、新たにバグが混入することになるので。
0372デフォルトの名無しさん
2008/11/08(土) 15:33:360373デフォルトの名無しさん
2008/11/08(土) 15:40:280374デフォルトの名無しさん
2008/11/08(土) 15:44:24>for( i= 1; i< 0xFFFF; i++ ){
0375デフォルトの名無しさん
2008/11/08(土) 16:03:45enum { 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");
}
0376375
2008/11/08(土) 17:05:13参照の参照が怖いのと面倒臭いのが難点だと思いました
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");
}
0377デフォルトの名無しさん
2008/11/08(土) 17:39:340378デフォルトの名無しさん
2008/11/08(土) 18:08:480379デフォルトの名無しさん
2008/11/09(日) 02:37:20ostringstream を使用する方法がメジャー?
0380デフォルトの名無しさん
2008/11/09(日) 02:39:59たぶん sprintf を使う人のほうが多い。
snprintf が C++ 標準に入ればさらに増えるかもしれない。
結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。
0381デフォルトの名無しさん
2008/11/09(日) 02:54:15利用者が多いのは何か理由があるの?
0382デフォルトの名無しさん
2008/11/09(日) 02:55:450383デフォルトの名無しさん
2008/11/09(日) 03:10:24だいたい10倍くらい遅いと書かれていた。
0384デフォルトの名無しさん
2008/11/09(日) 03:30:02printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて
細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、
というのもある。
C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし
「C++らしくない」という良くわからない理由で嫌う人も。
また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。
0385デフォルトの名無しさん
2008/11/09(日) 03:54:570386デフォルトの名無しさん
2008/11/09(日) 04:07:58stream のことなら、たぶんそんなもん。
そういえば C++0x でもこの点は特に改善されたような話を聞かないな。
boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。
0387デフォルトの名無しさん
2008/11/09(日) 10:57:41boost::lexical_cast を使うがよい
結局 stringstream 使ってるんだけどな
0388デフォルトの名無しさん
2008/11/09(日) 11:53:14char確保しなくてもいいよ。
std::string str;
int a = 123;
str.resize(256,0);
sprintf((char*)str.c_str(), "%d", a);
str = str.substr(0, str.find('\0'));
0389デフォルトの名無しさん
2008/11/09(日) 12:04:570390デフォルトの名無しさん
2008/11/09(日) 12:06:070391デフォルトの名無しさん
2008/11/09(日) 12:23:41c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ
っていうかconst外して書き込むなんて無茶苦茶にもほどがある
0392デフォルトの名無しさん
2008/11/09(日) 12:24:08#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;
}
なるへそ
0393デフォルトの名無しさん
2008/11/09(日) 12:27:03問題ないの?
0394デフォルトの名無しさん
2008/11/09(日) 12:29:46か、漢だ!
0395デフォルトの名無しさん
2008/11/09(日) 12:30:560396デフォルトの名無しさん
2008/11/09(日) 12:41:02スタック上に領域確保してれば
char配列となんら変わらん
0397デフォルトの名無しさん
2008/11/09(日) 12:46:24大概はそうだが、規格には反するな
0398デフォルトの名無しさん
2008/11/09(日) 13:07:49使い方の問題。
ユーザー入力をフォーマット文字列に使おうとする大バカと
最大文字数の指定方法を知らないバカがそう言ってるだけ。
0399デフォルトの名無しさん
2008/11/09(日) 13:18:32具体的に何の関数を言ってるかわからんけど、
すくなくともsprintfはあぶない
0400デフォルトの名無しさん
2008/11/09(日) 13:28:49くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!
0401デフォルトの名無しさん
2008/11/09(日) 13:31:44具体的にどこが危ないのか教えてよ
「使い方を間違えたら危ない」というレベルの話なら
「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから
0402デフォルトの名無しさん
2008/11/09(日) 13:39:40え?最大文字数を指定できないじゃん
それが危険だと思えないならまぁ好きにするといいよ
0403デフォルトの名無しさん
2008/11/09(日) 13:42:38100文字以上有るかもしれないユーザ入力を与えるとかね。
0404デフォルトの名無しさん
2008/11/09(日) 13:44:110405デフォルトの名無しさん
2008/11/09(日) 13:46:22char buff[100]
sprintf(buff, "%.80s", user_input);
これのどこが危ないって?
0406デフォルトの名無しさん
2008/11/09(日) 13:47:280407デフォルトの名無しさん
2008/11/09(日) 13:48:08しかも STL スレで・・・。
ostringstream か boost::format を使っとけ。
0408デフォルトの名無しさん
2008/11/09(日) 14:00:20そういうことを分かって使う分にはいいけど、
実際に使う人間が必ずしも分かっているとは限らないし、
分かっていても、うっかりやってしまう危険性があるよね。
0409デフォルトの名無しさん
2008/11/09(日) 14:04:25色々出力したりロケールが絡むと出力結果の予想がしんどいだろ
0410デフォルトの名無しさん
2008/11/09(日) 14:08:01特に>>399はわざわざ>>398に対して言ってるんだから
もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。
そりゃ、切捨て前提という仕様は良くないとか
全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど
それとセキュリティ的な問題は全く別だから。
柔軟性だって例えば
std::vecotr<char> buff;
buff.resize(???);
sprintf(&buff[0], "%.*s", buff.size()-1, str);
のような使い方である程度確保できるし。
>>409
「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
0411デフォルトの名無しさん
2008/11/09(日) 14:13:43> 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
この一行が>>409の話とは全く別の話なのは、そういうジョークなの?
0412デフォルトの名無しさん
2008/11/09(日) 14:14:330413デフォルトの名無しさん
2008/11/09(日) 14:14:53そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから
例えば
sprintf(filename, "file-%.80s%d.dat", input, num);
のような形式でも、充分に最大値は予想できるし。
あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。
0414デフォルトの名無しさん
2008/11/09(日) 14:17:55ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。
0415デフォルトの名無しさん
2008/11/09(日) 14:19:43十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、
世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。
0416409
2008/11/09(日) 14:19:58いやだから
出力結果の予想が困難→バッファ長の予想が困難
セキュリティ的にあぶなくね?
という話し
気をつけて使え
って話しなら
そうですね
としか言えないけど
みなミスりがちだからsnprintfとかVC++のセキュア関数とか
あるんじゃないの?
0417デフォルトの名無しさん
2008/11/09(日) 14:32:40全然>>398への反論になってない。
「使い方を知らないのが問題」なだけでは
「セキュリティ的に問題がある」ということにはならないから。
まあ、416の言いたいことはもっともだし
他にもっと良い選択肢があるならそちらを使うべきなのは確か。
でも残念ながら標準ではない。
ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。
>>398の最下行を無視して>>402と反論するような人が>>399みたいに書くわけだから。
0418デフォルトの名無しさん
2008/11/09(日) 14:35:28別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。
多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
例えば>>405のようにね。
0419デフォルトの名無しさん
2008/11/09(日) 14:37:36ええええー
0420デフォルトの名無しさん
2008/11/09(日) 14:38:200421デフォルトの名無しさん
2008/11/09(日) 14:41:24当然過ぎて困りますが
ユーザー入力の部分の最大量は>>405のように制限して
その上で他の部分の見積もりが多少違っていても大丈夫なように
ということですけど。
0422デフォルトの名無しさん
2008/11/09(日) 14:42:37当然というか大前提だと思っていましたが、皆さんは違うのですか。
認識の違いですね。
0423デフォルトの名無しさん
2008/11/09(日) 14:44:220424デフォルトの名無しさん
2008/11/09(日) 14:48:54とすると、
同じように、
使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない
ということになりますね。
つまり、
C++をやめましょう、と。
Javaあたりがよろしいでしょうか。
実際、世間の潮流もそういう流れになってますしね。
0425デフォルトの名無しさん
2008/11/09(日) 14:49:50%.fを使ってください
0426デフォルトの名無しさん
2008/11/09(日) 14:52:52sprintf(buf, "%10.0f", 1e100);
0427デフォルトの名無しさん
2008/11/09(日) 15:02:23snprintf(s, sizeof(s), …
ってやっとけば安全だけど、
sprintf()は人間が数えないといけないじゃん。
>>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、
書式が複雑になってくると、ミスる可能性がでてくるよ。
てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。
0428デフォルトの名無しさん
2008/11/09(日) 15:04:36そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。
0429デフォルトの名無しさん
2008/11/09(日) 15:05:040430デフォルトの名無しさん
2008/11/09(日) 15:07:32printf("%.2u", -1);
の時に必ず2桁に収まると思う人は居ませんね。
これと同様に最大桁数が見積もれる点は変わらないと思いますが。
いや、最大桁数はbit数に依存するので環境依存ですけど。
>>427
だからsnprintfはC++においては非標準だって。
それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。
「C++はセキュリティ的に問題がある」というのと同様。
0431デフォルトの名無しさん
2008/11/09(日) 15:07:470432デフォルトの名無しさん
2008/11/09(日) 15:10:570xでは標準になるのかなぁ
0433デフォルトの名無しさん
2008/11/09(日) 15:12:100434デフォルトの名無しさん
2008/11/09(日) 15:13:400435デフォルトの名無しさん
2008/11/09(日) 15:20:11ドラフト 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.
0436デフォルトの名無しさん
2008/11/09(日) 15:23:460437デフォルトの名無しさん
2008/11/09(日) 15:28:25doubleの最大桁数を常に見込んでバッファを確保するとでも?
%fを使わずに、素直に%gを使えば済むじゃん。
そういう使いこなしを必要とするからsprintf()は難しいと言うなら判るが、
使いこなしてもいないのに語ろうとするな。
0438デフォルトの名無しさん
2008/11/09(日) 15:33:240439デフォルトの名無しさん
2008/11/09(日) 16:00:48std::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の書式指定能力の高さは最強。
0440デフォルトの名無しさん
2008/11/09(日) 16:02:21その場合だとstr.size()は0が返るよ。
あと規格は大切にね。
0441デフォルトの名無しさん
2008/11/09(日) 16:03:16ごめん勘違いした。
でもその書き方は受け入れられない。
0442デフォルトの名無しさん
2008/11/09(日) 16:05:420443デフォルトの名無しさん
2008/11/09(日) 16:06:480444デフォルトの名無しさん
2008/11/09(日) 16:13:280445デフォルトの名無しさん
2008/11/09(日) 16:17:17× (char*)str.c_str()
○ &str[0]
あと、せっかくだから sprintf_s() の戻り値使えよ。
0446デフォルトの名無しさん
2008/11/09(日) 16:30:07規格ではstd::stringのメモリ上の連続性は保証されていない。
std::vectorと混同するな
0447デフォルトの名無しさん
2008/11/09(日) 16:33:390448デフォルトの名無しさん
2008/11/09(日) 16:35:470449デフォルトの名無しさん
2008/11/09(日) 16:38:17C++0x で連続性は保証されるようになるし、
現状のどの実装でも連続性は成り立っている。
0450デフォルトの名無しさん
2008/11/09(日) 16:41:45http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
まぁ現時点で保証が無いというのは確かなんだけどね。
0451デフォルトの名無しさん
2008/11/09(日) 17:38:58std::vector<TCHAR> buffer(count);
_stprintf_s(&buffer[0], count, _T("%d"), 777);
0452デフォルトの名無しさん
2008/11/09(日) 17:52:090453デフォルトの名無しさん
2008/11/09(日) 18:42:07そういう話をしたいのなら実装依存スレへ逝け
0454デフォルトの名無しさん
2008/11/09(日) 18:43:16そういう話をしたいのなら実装依存スレへ逝け
0455デフォルトの名無しさん
2008/11/09(日) 19:54:23"list iterators incompatible" という例外が発生しました。これはどういったエラーでしょうか?
開発環境はVisualStudio2005 AcademicEditionです。
0456デフォルトの名無しさん
2008/11/09(日) 20:01:130457デフォルトの名無しさん
2008/11/09(日) 20:06:15目的は、stringの中身をすべて小文字に変換したいのです。
#include <string>
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>
string aa = "AbCdEfG";
transform(aa.begin(),aa.end(),aa.begin(),tolower)
で、aaの中身をすべて小文字に変換できません。
理由はわかりますでしょうか?
0458デフォルトの名無しさん
2008/11/09(日) 20:10:50とりあえずコンパイルエラーだろ。
エラーの意味がわからんということならエラーメッセージ晒せ。
0459デフォルトの名無しさん
2008/11/09(日) 20:14:200460デフォルトの名無しさん
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>)'
よろしくどうぞおねがいします。
0461デフォルトの名無しさん
2008/11/09(日) 20:23:26ttp://www.hsjp.net/upload/src/up51891.txt
本来の拡張子は.hppです。ごちゃごちゃしててすみません。
103行目のupdate_etc()関数が怪しいと思っているのですが…
0462デフォルトの名無しさん
2008/11/09(日) 20:24:530463デフォルトの名無しさん
2008/11/09(日) 20:32:13たぶん、こういう関数オブジェクトを作ってそれを渡せばいいよ。
struct my_tolower : std::unary_function<char, char>
{
char operator ()(char c) const
{
return std::tolower(c);
}
};
0464デフォルトの名無しさん
2008/11/09(日) 20:54:01通った
typeof(aa)::value_type : char
tolower : int(*)(int)
でtolowerをchar(*)(char)と型推論しようとして失敗してる
なので正確にキャストして与えてやればおk?
0465デフォルトの名無しさん
2008/11/09(日) 20:57:12まずはデバッガのバックトレースを見たりブレークポイントつかったりしてあたりつければいいよ
segvだろうが、unhandled exceptionだろうがどこで発生したか分かるから
0466デフォルトの名無しさん
2008/11/09(日) 21:00:18>>460の最後の行の中にunresolved overloaded function typeってのがあるでしょ。
C++では、tolowerが多重定義されているのだが、
それではテンプレート引数の型が決定できないということでエラーになる。
だから、>>464のようにキャストが必要になる。>>463みたいに他の方法も考えられる。
0467デフォルトの名無しさん
2008/11/09(日) 21:06:27>>464
>>460
ありがとうございます。
なるほどよく分かりました!
0468デフォルトの名無しさん
2008/11/09(日) 21:21:38ありがとうございます。とりあえずどこで投げてるのか絞り込んでみます。
ただ、list iterators incompatibleというのがどういう状態を指すのか、よくわからないのです。
0469デフォルトの名無しさん
2008/11/09(日) 21:37:510470デフォルトの名無しさん
2008/11/09(日) 22:01:54そういう方法もあるのですね
listの中を覗いてみます。
ありがとうございます
0471デフォルトの名無しさん
2008/11/12(水) 11:38:030472デフォルトの名無しさん
2008/11/12(水) 12:13:18速度は実測が基本。
一般的に、 push_back() を繰り返す場合、配列要素のメモリ確保回数が増えるので
遅くなる可能性が高くて、それでも push_back() ならコピーコンストラクタが使われるので
要素の型によっては代入に比べて速い可能性もある。
0473デフォルトの名無しさん
2008/11/12(水) 20:00:120474デフォルトの名無しさん
2008/11/12(水) 22:12:15dequeってどうだろう
0475デフォルトの名無しさん
2008/11/12(水) 22:21:59reserveしたらシステムからメモリを持ってくる時間は稼げるけどvector
と違ってメモリの再配置は起きにくいんだよね
0476デフォルトの名無しさん
2008/11/12(水) 23:24:270477デフォルトの名無しさん
2008/11/12(水) 23:32:370478デフォルトの名無しさん
2008/11/13(木) 01:13:27だから一概に実装に依るとも言えない
0479デフォルトの名無しさん
2008/11/13(木) 07:48:57まあ最初から要素数が判ってるならvector一択だけど
0480デフォルトの名無しさん
2008/11/13(木) 20:37:08list,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が悲鳴を上げたのでこれ以上のテスト回数は勘弁
0481デフォルトの名無しさん
2008/11/13(木) 20:41:180482デフォルトの名無しさん
2008/11/13(木) 20:58:12>480と同条件、上限20万個として計測してみた。
平均5.5秒くらいだった
0483デフォルトの名無しさん
2008/11/13(木) 23:21:570484デフォルトの名無しさん
2008/11/13(木) 23:51:070485デフォルトの名無しさん
2008/11/14(金) 00:18:06http://msdn.microsoft.com/ja-jp/library/eye126ky.aspx
0486デフォルトの名無しさん
2008/11/14(金) 00:33:54状況次第
listのほうが向いてる使い方もあるしね
0487デフォルトの名無しさん
2008/11/14(金) 00:54:300488デフォルトの名無しさん
2008/11/14(金) 00:55:31あれ?そんなことできたっけ・・・?
0489デフォルトの名無しさん
2008/11/14(金) 01:01:03リストは不向きってことか
0490デフォルトの名無しさん
2008/11/14(金) 01:14:52今のご時世でも初心者にリンクリストを教えたがる間抜けが後を絶たない。
普通にstd::vectorを使えるように仕込んでおけば、std::listを使うのも苦労はないだろうに。
0491デフォルトの名無しさん
2008/11/14(金) 01:15:39途中の削除もdequeは結構速い。
listは削除してもイテレータが無効にならないのが利点かな。
04921/2
2008/11/14(金) 15:46:52長くなってしまったので申し訳ありませんが分割投稿します。
環境: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;
04932/2
2008/11/14(金) 15:47:25上のような構造体が有りまして、一番下のdataBlockをリストとして扱っているのですが、
dataBlock tmp;
/* 〜 データ作成処理 〜 */
/* 〜 挿入先探索 〜 */
insert(itr,tmp);
とデータを挿入してリストを覗くと途中までしか正しくデータが入っていません。
データ作成過程で"",NULL,0.0fと全て初期値を用いてデータを初期化しているのですが、
data[0]->mainNode.varDat[0].variable
以降のデータが未初期化のまま生成されています。
構造体を入れ子にする前は正しく動いていたのですが、
listを扱う際は構造体を入れ子で扱うとNG等の制約があるのでしょうか。
ご教授お願いいたします。
0494デフォルトの名無しさん
2008/11/14(金) 15:53:19・初期化の部分が不完全か
・未初期化というのが勘違いか
・リスト操作がバグってるか
のいずれかしかないが、心当たりがないなら何か見逃してるんだろう
そのようなNG的制約は無いので大丈夫
0495492
2008/11/14(金) 16:04:13(※(int)はキャストではなく型を説明上明示するために便宜的につけた物です。紛らわしくてすみません。)
例えば仮データ(tmp)で、
(int)materialNumを0で初期化したのがリストのデータでは
(int)materialNumが-33686019になってしまっているので、
>・リスト操作がバグってる
のでしょうかね……
ありがとうございます。制約は無いときいて安心しました。
もう少し追ってみます。
0496492
2008/11/14(金) 16:30:43色々弄ってみたところ、構造体のメンバの記述順を入れ替えると正確に入るデータと入らないデータが出てきました。
詳しく調べたところ、連結しようとしている構造体は180byteで、リストで正しく入るのは96byteの領域まででした。
数字的にこれって多分仕様ですよねぇ……
0497デフォルトの名無しさん
2008/11/14(金) 18:55:54ちゃんとdeep-copyせんと。
0498デフォルトの名無しさん
2008/11/14(金) 19:59:55/* 〜 データ作成処理 〜 */
dataBlock tmpB;
tmpB = tmpA;
ってやって、tmpAとtmpBは同じ内容の独立したオブジェクトになる?
0499デフォルトの名無しさん
2008/11/14(金) 20:04:280500492
2008/11/14(金) 21:01:27>>498さんのを実行してみたところ、同内容の独立したオブジェクトに成りました。
deep-copyなのですが、
/* 〜データ作成処理〜 */
を抜けた後、tmpに全ての値がきちんと入っていることを確認し、
data.insert(itr,tmp);
でインサートを行っているのですがコピーに関してはlist側で処理されている様で、
こちら側からコピー処理を定義することが出来るのでしょうか。
0501デフォルトの名無しさん
2008/11/14(金) 21:50:22コピー演算子をオーバーロード。
0502デフォルトの名無しさん
2008/11/15(土) 00:35:090503492
2008/11/15(土) 01:20:38構造体のメモリ領域と他のクラスのメモリ領域が被ってる……
0504デフォルトの名無しさん
2008/11/15(土) 03:13:32インターフェースとしてはこんなかんじで
class IDAllocator{
uint32_t T AllocID();
void FreeID(uint32_t id);
};
クライアントコードに対して、一意なIDを割り当てるのですが、
IDを使い終わった後は返却し、後ほど再利用できる様にしたいです。
IDを割り当てる際に、現在使われてないIDの内、最小の数値のIDを返す仕様にしたいのですが、
STL的にかっちょいい実装方法を教えてください
今のところ割り当て済みのIDをvectorに記録しておいて、0から1ずつ増やしてvectorに無いIDがあれば
それを使うというどう考えても効率の悪いやり方でやっています
0505デフォルトの名無しさん
2008/11/15(土) 03:44:370506デフォルトの名無しさん
2008/11/15(土) 03:48:120507デフォルトの名無しさん
2008/11/15(土) 09:29:56何も代入されてないときなど、別の変数でフラグ保持するのは面倒だと思うので
0508デフォルトの名無しさん
2008/11/15(土) 09:59:37有効/無効状態をチェックするなとか、
そもそもインテレータって何とか。
0509デフォルトの名無しさん
2008/11/15(土) 14:38:280510デフォルトの名無しさん
2008/11/16(日) 01:05:27splice 使えばできるはず。
0511デフォルトの名無しさん
2008/11/16(日) 01:53:37ttp://www.geocities.jp/ky_webid/cpp/library/008.html
0512デフォルトの名無しさん
2008/11/16(日) 01:57:21どこがどうおかしいと思うのか書けやカス
0513デフォルトの名無しさん
2008/11/16(日) 11:21:200514デフォルトの名無しさん
2008/11/16(日) 12:11:130515デフォルトの名無しさん
2008/11/16(日) 12:14:510516デフォルトの名無しさん
2008/11/16(日) 12:16:410517デフォルトの名無しさん
2008/11/16(日) 12:24:52MIRROR_X = SCALE | ROTATE
を意図して書いてあるならな。
0518デフォルトの名無しさん
2008/11/16(日) 12:35:100519デフォルトの名無しさん
2008/11/16(日) 12:50:45二大不要物(笑)
0520デフォルトの名無しさん
2008/11/16(日) 12:54:390521デフォルトの名無しさん
2008/11/16(日) 13:04:540522デフォルトの名無しさん
2008/11/16(日) 13:08:23この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。
0523デフォルトの名無しさん
2008/11/16(日) 13:10:340524デフォルトの名無しさん
2008/11/16(日) 13:13:370525デフォルトの名無しさん
2008/11/16(日) 13:16:23上級者のあなたがおすすめするサイトを教えてください
0526デフォルトの名無しさん
2008/11/16(日) 13:20:55>>519
0527522
2008/11/16(日) 13:23:15したがって、申し訳ないが期待には応えられない。
ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。
中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。
0528デフォルトの名無しさん
2008/11/16(日) 13:34:140529デフォルトの名無しさん
2008/11/16(日) 13:35:070530デフォルトの名無しさん
2008/11/16(日) 13:44:26enumだとアセンブラソースから使えないから
0531デフォルトの名無しさん
2008/11/16(日) 13:54:37そもそもビットフラグで使うとは限らないわけで…
0532デフォルトの名無しさん
2008/11/16(日) 14:08:21unionに失礼だろw
0533デフォルトの名無しさん
2008/11/16(日) 16:05:410534デフォルトの名無しさん
2008/11/17(月) 09:37:020535デフォルトの名無しさん
2008/11/17(月) 15:37:45enumなんかは割りと使ってるんだけど
0536デフォルトの名無しさん
2008/11/17(月) 15:48:34使うこともあるよ。Cでbitsetもどきを実装するときとか。
0537デフォルトの名無しさん
2008/11/17(月) 17:54:370538デフォルトの名無しさん
2008/11/17(月) 18:04:00unionは環境に激しく依存するから、使わない方がいい。
・本音
いまどきビッグエンディアンとか無いだろw
0539デフォルトの名無しさん
2008/11/17(月) 18:11:150540デフォルトの名無しさん
2008/11/17(月) 18:14:14サーバ系では未だにSunが頑張っているから無視できないのよね。
0541デフォルトの名無しさん
2008/11/17(月) 18:33:05おそらく今でも使ってる
0542デフォルトの名無しさん
2008/11/17(月) 18:45:550543デフォルトの名無しさん
2008/11/17(月) 18:50:130544デフォルトの名無しさん
2008/11/17(月) 18:59:060545デフォルトの名無しさん
2008/11/17(月) 19:17:140546デフォルトの名無しさん
2008/11/17(月) 19:19:570547デフォルトの名無しさん
2008/11/17(月) 22:16:380548デフォルトの名無しさん
2008/11/17(月) 23:10:130549デフォルトの名無しさん
2008/11/17(月) 23:51:08俺はエンディアン入れ替えたいからunion使ってる。
union {
double a;
char b[8];
}
0550デフォルトの名無しさん
2008/11/17(月) 23:54:30画像処理でもエンディアン入れ替えなんてよくやるでしょ
全部littleで済むと思ってる人ってどういう世界に生きてるんだ?
0551デフォルトの名無しさん
2008/11/18(火) 00:08:270552デフォルトの名無しさん
2008/11/18(火) 00:11:46そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない)
というのがエンディアン決め打ちのコーディングだと思う。
0553デフォルトの名無しさん
2008/11/18(火) 00:14:190554デフォルトの名無しさん
2008/11/18(火) 00:41:30例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。
0555554
2008/11/18(火) 00:51:28まぁ、unionは使わないけれど。
0556デフォルトの名無しさん
2008/11/18(火) 00:53:15実行時ならできるんだが
0557デフォルトの名無しさん
2008/11/18(火) 00:58:320558デフォルトの名無しさん
2008/11/18(火) 01:50:26コンパイル環境のエンディアンを?
それとも、ターゲット環境?
0559デフォルトの名無しさん
2008/11/18(火) 01:58:09VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。
0560デフォルトの名無しさん
2008/11/18(火) 13:28:05PDP-11位だしな変態なの
0561デフォルトの名無しさん
2008/11/18(火) 14:44:19お前はSun、IBM、MIPSを敵に回した。
0562デフォルトの名無しさん
2008/11/19(水) 16:25:22array.reserve(array.size());
でぴったりのサイズに変わるかと思ったのですが変わりません。
大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が
メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。
何かいい方法はないでしょうか?
0563デフォルトの名無しさん
2008/11/19(水) 16:28:100564デフォルトの名無しさん
2008/11/19(水) 16:32:010565デフォルトの名無しさん
2008/11/19(水) 16:36:13§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()になる保証はない。
0566デフォルトの名無しさん
2008/11/19(水) 16:37:52equal to the previous value of capacity() otherwise.
ともあるから、縮小しようとしてもcapacity()は変化しない事になる。
詰まるところ>>563のようにスワップ技法に頼るしかない。
0568デフォルトの名無しさん
2008/11/21(金) 01:13:58そんなの聞いたことないって言われました
ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…)
普通に使いますよね?
0569デフォルトの名無しさん
2008/11/21(金) 01:17:070570デフォルトの名無しさん
2008/11/21(金) 01:18:50iterandにしたら多少出てくるけど、まぁスズメの涙ね
0571デフォルトの名無しさん
2008/11/21(金) 01:24:17iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで
あっちでは普通の言葉かもしれないと思ってたんですが
じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう
「イテレータが指してるコンテナ」ですか?
0572デフォルトの名無しさん
2008/11/21(金) 01:24:23vector<int>::iterator it;
だと
vectorが「イテランド」になんの?
0573デフォルトの名無しさん
2008/11/21(金) 01:27:10vector<int> v;
vector<int>::iterator it = v.begin();
なら、itはvのイテレータで、vはitのイテランドです
0574デフォルトの名無しさん
2008/11/21(金) 01:38:030575デフォルトの名無しさん
2008/11/21(金) 03:09:590576デフォルトの名無しさん
2008/11/21(金) 03:40:26それは意味が全然違う
0577デフォルトの名無しさん
2008/11/21(金) 03:50:390578デフォルトの名無しさん
2008/11/21(金) 12:37:360579デフォルトの名無しさん
2008/11/21(金) 12:54:20オペレータ⇔オペランド
からの類推でわかるけどさ。
それより世間一般ではイテレータなんだろうが、
俺はついついイタレータと読み書きしてしまう今日この頃。
0580デフォルトの名無しさん
2008/11/21(金) 13:15:51おいたが過ぎますぞ
0581デフォルトの名無しさん
2008/11/21(金) 17:24:110582デフォルトの名無しさん
2008/11/21(金) 17:52:19内輪以外では使うのを控えることにします
ありがとうございました
0583デフォルトの名無しさん
2008/11/22(土) 02:05:310584デフォルトの名無しさん
2008/11/22(土) 02:41:160585デフォルトの名無しさん
2008/11/22(土) 15:27:410586デフォルトの名無しさん
2008/11/22(土) 15:47:040587デフォルトの名無しさん
2008/11/22(土) 16:56:130588デフォルトの名無しさん
2008/11/22(土) 17:09:09よーし家族みんなでイテランドにでもいくか〜
0589デフォルトの名無しさん
2008/11/22(土) 17:16:390590デフォルトの名無しさん
2008/11/22(土) 17:32:300591デフォルトの名無しさん
2008/11/22(土) 17:46:290592デフォルトの名無しさん
2008/11/22(土) 18:29:32X.erase( I.base() );
で I が示す要素の隣を消去するので I はまだ使えますよね。
VC8 で I を使うと assert で止まるんですけど。
0593デフォルトの名無しさん
2008/11/22(土) 18:55:160594デフォルトの名無しさん
2008/11/22(土) 19:24:060595デフォルトの名無しさん
2008/11/22(土) 19:29:510596デフォルトの名無しさん
2008/11/22(土) 19:56:150597デフォルトの名無しさん
2008/11/22(土) 19:57:280598デフォルトの名無しさん
2008/11/22(土) 20:06:38使えない
0599デフォルトの名無しさん
2008/11/22(土) 20:25:38一度変換しないとだめでしょうか?
0600デフォルトの名無しさん
2008/11/22(土) 21:06:580601デフォルトの名無しさん
2008/11/22(土) 21:10:43ロケールの問題とか
0602デフォルトの名無しさん
2008/11/22(土) 21:19:34std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。
0603デフォルトの名無しさん
2008/11/22(土) 21:23:310604デフォルトの名無しさん
2008/11/22(土) 21:30:160605デフォルトの名無しさん
2008/11/22(土) 21:51:060606デフォルトの名無しさん
2008/11/22(土) 21:54:040607デフォルトの名無しさん
2008/11/22(土) 21:58:170608デフォルトの名無しさん
2008/11/22(土) 21:59:340609デフォルトの名無しさん
2008/11/22(土) 22:03:38void 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が初期化されないようにしたいです。
0610デフォルトの名無しさん
2008/11/22(土) 22:04:090611デフォルトの名無しさん
2008/11/22(土) 22:11:52void func(deque<HOGE> &pairs){
}
main(){
func(pairs);
}
こうですかね?
0612デフォルトの名無しさん
2008/11/22(土) 22:15:07むちゃくちゃだ。
0613デフォルトの名無しさん
2008/11/22(土) 22:20:120614デフォルトの名無しさん
2008/11/22(土) 22:22:480615デフォルトの名無しさん
2008/11/22(土) 22:35:40プログラムが終わった後にdequeが初期化されるって、
atexit内で初期化したいのか
0616デフォルトの名無しさん
2008/11/22(土) 23:14:48ちょっと表現を間違えました。
0617デフォルトの名無しさん
2008/11/22(土) 23:44:460618デフォルトの名無しさん
2008/11/23(日) 00:42:48const int *mage = &hoge;
のような方法でするのかな?と思ったんですが
セオリーな方法はどんな書き方なんでしょうか
0619デフォルトの名無しさん
2008/11/23(日) 00:45:270620618
2008/11/23(日) 00:45:590621デフォルトの名無しさん
2008/11/23(日) 00:47:430622デフォルトの名無しさん
2008/11/23(日) 00:52:100623デフォルトの名無しさん
2008/11/23(日) 00:53:45つまりprivateなvectorの、先頭アドレスを返すような関数作って
それをconst int * で受け取り(もちろんサイズも)、
そのconst int * を走査するのかな?と思ったけど
書き方がわかんないから>>618になってしまった
ゴメンナサイ(´・ω・`)
0624デフォルトの名無しさん
2008/11/23(日) 00:58:230625デフォルトの名無しさん
2008/11/23(日) 01:02:010626デフォルトの名無しさん
2008/11/23(日) 01:09:49スキャンって・・・?
丸ごとコピーしてそれを返す?
内部でiterator保持して呼び出す毎に進める?
現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`)
ちなみに具体的にはintではなく
x,y座標が入ってるpair<int,int>で
これを取得してGUIでリアルタイムに線を引きたい
という状況です
0627デフォルトの名無しさん
2008/11/23(日) 01:23:53>>618の走査 == >>621のスキャン
だろOKJK
それから情報後出しって嫌われるの知らないかね
いいから黙ってソースコードべたっと貼れ
0628デフォルトの名無しさん
2008/11/23(日) 01:27:260629618
2008/11/23(日) 02:19:18GUIライブラリ使ってる上に携帯厨なんです(ノ∀`)
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;
}
こうしてみた
コーディングスタイル云々は勘弁してつかーさい
0630デフォルトの名無しさん
2008/11/23(日) 02:28:250631デフォルトの名無しさん
2008/11/23(日) 14:43:29int function(string &buff){
}
main(){
string buff:
function(buff);
}
mainで宣言したstringに関数で値を入れるには、これであってます?
0632デフォルトの名無しさん
2008/11/23(日) 14:45:30いいよ。
0633デフォルトの名無しさん
2008/11/23(日) 14:50:04functionでの代入時は
buff ="mozi";
みたいな感じでいいですか?
0634デフォルトの名無しさん
2008/11/23(日) 14:51:30単に値を渡すだけなら参照にしてるな。
0635デフォルトの名無しさん
2008/11/23(日) 14:56:47それでいいよ。
値を渡すだけでも、返してもらうときでも参照でいいよ。
const のあるなしで区別すればOK
0636デフォルトの名無しさん
2008/11/23(日) 14:57:54M$ なんかが当初そういう方針だった気がするな。
NULL チェックが必要になるから個人的には微妙なんだが・・・。
0637デフォルトの名無しさん
2008/11/23(日) 16:31:25賛成。
それとは別に、俺は std::string 程度なら値を返すようにしたい。
function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。
また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。
オーバーロードして両方のバージョンを用意すればいいだけだけど。
0638デフォルトの名無しさん
2008/11/23(日) 19:27:34int& function(string &buff){
0639デフォルトの名無しさん
2008/11/23(日) 19:28:40いや、引数の話だよ。
0640デフォルトの名無しさん
2008/11/23(日) 19:58:24int function(int&, double& )とかした場合
function( 1, 0.1) は使えないだろ
こんな使い方禁止?
0641デフォルトの名無しさん
2008/11/23(日) 20:05:30直前のカキコとか見れよ。
引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、
そういう使い方は意味ないだろ。
0642デフォルトの名無しさん
2008/11/24(月) 19:24:39プログラムを作っているのですが、
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));
などと書ければよいのですが・・
0643デフォルトの名無しさん
2008/11/24(月) 19:27:10read<short>(input) とかいう関数でも作れば良いんじゃない?
0644デフォルトの名無しさん
2008/11/24(月) 20:13:34short header1, header2;
if(input >> header1 >> header2) {
// ...
}
0645デフォルトの名無しさん
2008/11/24(月) 20:26:01そんな餌に(AAry
0646642
2008/11/25(火) 01:57:17こんなのを作ってみました。
template<class T>
std::istream& read(std::istream& is, T& data)
{
return is.read(reinterpret_cast<char*>(&data), sizeof(T));
}
>>644
それって、inputが文字列なら良いですが、
バイナリ読みしたい場合はダメですよね?
0647デフォルトの名無しさん
2008/11/25(火) 16:50:03listで添え字アクセスのようなことをやる場合は、
list<int>::iterator it = list.begin();
for(size_t i= 0; i< index; i++ ) it++;
みたいなことをやらないといけないの?
挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、
indexを使ったアクセスも多いので、なんかブサイクですね。
いい方法ないですか?
0648デフォルトの名無しさん
2008/11/25(火) 16:55:04コンテナの種類とランダムアクセスイテレータに関して
も少し理解を深めといた方が。
0649デフォルトの名無しさん
2008/11/25(火) 16:57:49std::advance()
0650デフォルトの名無しさん
2008/11/25(火) 17:16:49ランダムアクセスをしたいならvectorを使うべきだと?
一般論ではそうでしょう。
しかし、
vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。
listの場合は配列要素の数にかかわらずコストは一定です。
だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、
処理速度的に最適なものを選びたいと思っています。
それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。
>>649
listの要素の入れ替えをしたくはないのです。
0651デフォルトの名無しさん
2008/11/25(火) 17:22:20つdeque
ランダムアクセスできて挿入も速い
0652デフォルトの名無しさん
2008/11/25(火) 17:26:38私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。
0653デフォルトの名無しさん
2008/11/25(火) 17:41:22dequeは途中の挿入も(そこそこ)速いんだよ。
dequeの仕様を満たそうとすると、どうしてもそういう実装になる。
0654デフォルトの名無しさん
2008/11/25(火) 18:02:08要件がいまいちつかめないので何ともいえないけど、
規格を眺めてlistが最適だと思うなら仕方がないんじゃない?
listはランダムアクセス出来ないしね。
でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ
0655デフォルトの名無しさん
2008/11/25(火) 18:14:47要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
0656デフォルトの名無しさん
2008/11/25(火) 18:39:03何言っても意味ないよ
そういうのはほっとくに限る
0657デフォルトの名無しさん
2008/11/25(火) 18:44:27ときどきランダムアクセスが必要ならstd::advanceで
0658デフォルトの名無しさん
2008/11/25(火) 18:51:510659デフォルトの名無しさん
2008/11/25(火) 18:58:49配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。
0660デフォルトの名無しさん
2008/11/25(火) 19:05:31何が?
0661デフォルトの名無しさん
2008/11/25(火) 19:28:06STLにはないけど
0662デフォルトの名無しさん
2008/11/25(火) 19:31:05おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな
0663デフォルトの名無しさん
2008/11/25(火) 19:35:42釣りだったとしても痛くも痒くもない
0664デフォルトの名無しさん
2008/11/25(火) 20:03:280665デフォルトの名無しさん
2008/11/25(火) 20:30:10んなもんわざわざ使うなら普通にlistでもいいと思うけどな
0666デフォルトの名無しさん
2008/11/25(火) 20:40:43http://www5c.biglobe.ne.jp/~ecb/cpp/07_15.html
要素の追加(追加場所をイタレーターで指定) 定数時間
とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?
0667デフォルトの名無しさん
2008/11/25(火) 21:02:51listの代わりに何が良いかは質問してないようによめるのだが
0668デフォルトの名無しさん
2008/11/25(火) 21:04:52insertのことだと思うが
0669デフォルトの名無しさん
2008/11/25(火) 21:11:14setにはイテレータを指定するinsertと指定しないinsertがあるよ
0670デフォルトの名無しさん
2008/11/25(火) 21:15:27クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?
0671デフォルトの名無しさん
2008/11/25(火) 21:17:35ないです。
0672デフォルトの名無しさん
2008/11/25(火) 21:18:02vectorから取り除いたときのdeleteし忘れ
0673デフォルトの名無しさん
2008/11/25(火) 21:20:48オブジェクトの多重参照
0674デフォルトの名無しさん
2008/11/25(火) 21:54:32multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?
count関数がありますけど使い方が・・・
huga.count("hogehoge");みたいな感じで使いたいんです
0675デフォルトの名無しさん
2008/11/25(火) 22:04:16count_if()
0676デフォルトの名無しさん
2008/11/25(火) 23:21:30サンクス deleteしなきゃだったんだな
ありがとう
0677デフォルトの名無しさん
2008/11/26(水) 00:50:01ptr_vectorでも使えば
0678デフォルトの名無しさん
2008/11/26(水) 11:06:22KOUZOUTAI data[100];
partial_sort( data, data + 10 ,data+100, Sortpred1)
ってできますけど
vector<KOUZOUTAI> data(size);
partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1)
ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?
0679デフォルトの名無しさん
2008/11/26(水) 11:18:38data.begin() + 10
0680デフォルトの名無しさん
2008/11/26(水) 12:37:31Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
0681デフォルトの名無しさん
2008/11/26(水) 15:34:21std::set<C::const_iterator,C::iterator>
を作って変換しろ
0682デフォルトの名無しさん
2008/11/26(水) 15:46:58std::set, std::map の検索は普通の実装で対数時間
0683デフォルトの名無しさん
2008/11/26(水) 18:49:39大体の実装なら通るよ
細かいこと気にすんなってwwwww
0684デフォルトの名無しさん
2008/11/26(水) 20:24:230685デフォルトの名無しさん
2008/11/27(木) 01:02:08とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
0686デフォルトの名無しさん
2008/11/27(木) 01:35:37定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>
0687デフォルトの名無しさん
2008/11/30(日) 15:23:23WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?
0688デフォルトの名無しさん
2008/11/30(日) 15:44:30できるか?
0689デフォルトの名無しさん
2008/11/30(日) 15:57:26>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;
0690デフォルトの名無しさん
2008/11/30(日) 16:29:300691デフォルトの名無しさん
2008/11/30(日) 17:38:110692デフォルトの名無しさん
2008/11/30(日) 17:41:320693デフォルトの名無しさん
2008/11/30(日) 17:45:420694デフォルトの名無しさん
2008/11/30(日) 18:34:070695デフォルトの名無しさん
2008/11/30(日) 19:02:340696デフォルトの名無しさん
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
--
どんなデータ構造にするのが手頃か相談に乗ってくれまいか。
0697デフォルトの名無しさん
2008/12/04(木) 00:17:040698デフォルトの名無しさん
2008/12/04(木) 00:26:09aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
0699デフォルトの名無しさん
2008/12/04(木) 00:31:120700デフォルトの名無しさん
2008/12/04(木) 00:32:120701デフォルトの名無しさん
2008/12/04(木) 00:51:58なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。
0702デフォルトの名無しさん
2008/12/04(木) 01:17:48S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら
0703デフォルトの名無しさん
2008/12/04(木) 01:34:40string type, id, name;
bool operator<(const Entry &a) const { return type < a.type; }
};
multiset<Entry> entries;
でequal_range使わせるかな
0704デフォルトの名無しさん
2008/12/04(木) 02:41:110705696=698
2008/12/04(木) 06:11:17なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。
# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
0706デフォルトの名無しさん
2008/12/04(木) 20:31:19eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?
vec.erase(vec[5])
vec[5].erase()
みたいなことはできませんか?
0707デフォルトの名無しさん
2008/12/04(木) 20:34:310708706
2008/12/04(木) 20:36:560709デフォルトの名無しさん
2008/12/04(木) 22:10:140710デフォルトの名無しさん
2008/12/04(木) 22:28:47とどうでもいい回顧
0711デフォルトの名無しさん
2008/12/04(木) 22:29:42数学的に、単独の方が違和感あると思われ。
0712デフォルトの名無しさん
2008/12/04(木) 22:34:590713デフォルトの名無しさん
2008/12/05(金) 00:12:570714デフォルトの名無しさん
2008/12/05(金) 00:21:250715デフォルトの名無しさん
2008/12/05(金) 10:23:090716デフォルトの名無しさん
2008/12/05(金) 18:00:270717デフォルトの名無しさん
2008/12/06(土) 15:46:46にpusu_back()は定数時間ですか?それと
buff[0]みたいなアクセスはありですか?
0718デフォルトの名無しさん
2008/12/06(土) 16:32:10buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。
あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。
答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
0719デフォルトの名無しさん
2008/12/06(土) 16:39:40そんなのはいいから答え教えろかす
0720デフォルトの名無しさん
2008/12/06(土) 16:46:120721デフォルトの名無しさん
2008/12/06(土) 16:49:17operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています
0722デフォルトの名無しさん
2008/12/06(土) 17:45:09> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?
0723デフォルトの名無しさん
2008/12/06(土) 18:13:350724デフォルトの名無しさん
2008/12/06(土) 18:18:330725デフォルトの名無しさん
2008/12/07(日) 22:15:490726デフォルトの名無しさん
2008/12/09(火) 14:44:052次元目も動的にしたいんです
0727デフォルトの名無しさん
2008/12/09(火) 15:04:510728デフォルトの名無しさん
2008/12/09(火) 16:27:550729デフォルトの名無しさん
2008/12/09(火) 17:01:36class CVector
{
vector<int> A;
}
vector<CVector> B;
CVector.A.resize(10);
B.resize(10);
0730デフォルトの名無しさん
2008/12/09(火) 17:03:22{
vector<int> A;
}←セミコロンがない
vector<CVector> B;
CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);
0731デフォルトの名無しさん
2008/12/09(火) 17:21:46class 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);
}
};
0732デフォルトの名無しさん
2008/12/09(火) 17:24:202次元配列じゃなくなってる
意味ねぇ
0733デフォルトの名無しさん
2008/12/09(火) 17:39:28class CVectorSub
{
public:
vector<int> A;
};
class C
{
public:
CVectorSub vSub;
vector<CVectorSub> vMain;
void Resize()
{
vSub.A,resize(100);
vMain.resize(10);
}
};
0734デフォルトの名無しさん
2008/12/09(火) 17:44:360735デフォルトの名無しさん
2008/12/09(火) 17:45:35vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。
わかってるならいいんだけど。
エスパーすると
vector<vector<int> > vec;
vec.resize(10);
for(int i=0; i!=vec.size(); ++i)
{
vec[i].resize(10);
}
なんじゃないかと。
違ったら無視して。
0736デフォルトの名無しさん
2008/12/09(火) 17:56:13それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX
0737デフォルトの名無しさん
2008/12/11(木) 11:12:04vector<vector<int>> vec(5, vector<int>(100, 0));
vector<vector<int>>* pVec = vec;
pVec[3]->resize(200);
pVec[3][180] = 12345;
0738デフォルトの名無しさん
2008/12/11(木) 11:33:260739デフォルトの名無しさん
2008/12/11(木) 11:37:41> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >
2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。
0740デフォルトの名無しさん
2008/12/11(木) 12:27:03大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし
つーか何でポインタが出てくんの?w
0741デフォルトの名無しさん
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入れたらりサイズのコストがやばそうだな^^;
0742デフォルトの名無しさん
2008/12/11(木) 12:44:08本2冊読んで> >の間のスペースがわからないのがやばい
vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!
0743デフォルトの名無しさん
2008/12/11(木) 13:06:59main()
{
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;
}
適当に書いたから間違ってるかも分からん
0744デフォルトの名無しさん
2008/12/11(木) 13:27:33共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。
0745デフォルトの名無しさん
2008/12/11(木) 13:40:36コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ
0746デフォルトの名無しさん
2008/12/11(木) 13:45:380747デフォルトの名無しさん
2008/12/11(木) 23:41:07あ、老後の楽しみか
0748デフォルトの名無しさん
2008/12/12(金) 06:28:400749デフォルトの名無しさん
2008/12/12(金) 07:10:55オ○ニーしながらだからねw
0750デフォルトの名無しさん
2008/12/12(金) 09:04:470751デフォルトの名無しさん
2008/12/13(土) 01:33:450752デフォルトの名無しさん
2008/12/13(土) 10:34:590753デフォルトの名無しさん
2008/12/13(土) 12:13:070754デフォルトの名無しさん
2008/12/13(土) 12:24:32カスタムアロケータとして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();
としてますが、ちょっと不恰好で気になってしまいます。
なにかスマートな方法はありますでしょうか?
0755デフォルトの名無しさん
2008/12/13(土) 12:50:12std::copy(ss.begin(), ss.end(), ms.begin());
0756デフォルトの名無しさん
2008/12/13(土) 13:04:10ありがとうございます。参考にして作ってみます。
0757デフォルトの名無しさん
2008/12/13(土) 13:19:490758デフォルトの名無しさん
2008/12/15(月) 18:59:03map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
0759デフォルトの名無しさん
2008/12/15(月) 19:12:310761デフォルトの名無しさん
2008/12/15(月) 20:35:440762758
2008/12/15(月) 21:15:36http://www3.uploda.org/uporg1858304.zip.html
Passはstlです
一応環境も書いときます
WinVista SP1
VS9
0763デフォルトの名無しさん
2008/12/15(月) 22:26:080764デフォルトの名無しさん
2008/12/15(月) 22:45:41ttp://msdn.microsoft.com/en-us/library/ms632679.aspx
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
0765758
2008/12/15(月) 22:46:020766デフォルトの名無しさん
2008/12/15(月) 23:01:01自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
0767758
2008/12/15(月) 23:11:12つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
0768デフォルトの名無しさん
2008/12/15(月) 23:12:11つ
// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功
0769デフォルトの名無しさん
2008/12/15(月) 23:18:39hoge[ hWnd ]=lpfn;
でいいじゃない
0771デフォルトの名無しさん
2008/12/16(火) 12:17:450772758
2008/12/16(火) 17:26:11find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。
0773デフォルトの名無しさん
2008/12/17(水) 17:11:03vec.push_back(3, 10);
というふうに書けないのはなぜですか?
Insertで配列が動的に増えないで溢れるということは、これができないと、
vec.push_back(10);
vec.push_back(10);
vec.push_back(10);
と3行分の処理を書かないといけないとおもうのですが、他にいい方法はありませんか?
0774デフォルトの名無しさん
2008/12/17(水) 17:29:280775デフォルトの名無しさん
2008/12/17(水) 17:29:37でよろしい
0776デフォルトの名無しさん
2008/12/17(水) 17:30:240777デフォルトの名無しさん
2008/12/17(水) 17:35:08for(int i=0;i!=3;++i)
vec.push_back(10);
っていう単純な話ではない?
ちょっと違うかもしれないがboostにこういうのがある。
ttp://www.kmonos.net/alang/boost/classes/assign.html
0778デフォルトの名無しさん
2008/12/17(水) 17:36:23それだとendを指定しておけば配列が3つ増えてくれるんですか?
endじゃなくて中間を指定すると要素は3つずれて配列数は減らないで後ろの3要素が消滅しませんか?
0779デフォルトの名無しさん
2008/12/17(水) 17:38:03の間違えです
0780デフォルトの名無しさん
2008/12/17(水) 17:45:35しません。
0781デフォルトの名無しさん
2008/12/17(水) 17:48:04これがfill_n一行でできるということでしょうか?
deque<int> deq;
deq.resize((deq.size()-1)+3;
deq.insert(deq.begin(), 3, 10);
0782デフォルトの名無しさん
2008/12/17(水) 17:49:24まじですか?本のどこを読み間違えたんだろう・・・
すいませんでした。
0783デフォルトの名無しさん
2008/12/17(水) 17:56:13deque<int> deq;
deq.resize((deq.size()-1)+3);
deq.push_front(10);
deq.push_front(10);
deq.push_front(10);
でした。もっと勉強しますありがとうございました。
0784デフォルトの名無しさん
2008/12/17(水) 21:34:38resizeは要らないから
0785デフォルトの名無しさん
2008/12/18(木) 22:36:000786デフォルトの名無しさん
2008/12/18(木) 22:59:030787デフォルトの名無しさん
2008/12/18(木) 23:11:180788デフォルトの名無しさん
2008/12/18(木) 23:12:34ありがとうございます。
どんどん増やしていってもう領域が確保できないってなったらなんかエラーがかえってきますか?
0789デフォルトの名無しさん
2008/12/18(木) 23:13:50帰ってくるかもしれないし、帰ってこないかもしれません。環境によっても振る舞いが変わりますので諦めてください。
0790デフォルトの名無しさん
2008/12/18(木) 23:21:480791デフォルトの名無しさん
2008/12/19(金) 03:01:14どんな条件にしてもunordered_mapの方が速くなる。
一般的に言ってmapには自動的に順序付けされる以外の使いどころってある?
mapの方が速くなるようなコードや環境って割りとあるもの?
0792デフォルトの名無しさん
2008/12/19(金) 04:48:45領域が確保できないときはデフォルトのアロケータを使ってるなら std::bad_alloc が
投げられることになる。これは規格で決められていること。
「どんどん増やしていって」ということだと max_size() を超えたときの std::length_error が
先に飛んでくるかもしれない。
0793デフォルトの名無しさん
2008/12/19(金) 04:53:07スピードについてはハッシュの使える unordered_map より速くなることは少ないだろうね。
そう言えるからこそ新しく規格に盛り込まれたんだろうし。
ただしハッシュ関数が適切でないときに逆転する可能性は考えられると思う。
0794デフォルトの名無しさん
2008/12/19(金) 12:33:35順番に並べるという制約が付いたものとそうでないものを比べれば
余計な制約のない方が一般に高速に実装できるというのは当然じゃないかと思う
0795デフォルトの名無しさん
2008/12/19(金) 20:39:06これエラーになるんですが、
この場合のイテレータってどう書けばいいんですか?
0796デフォルトの名無しさん
2008/12/19(金) 21:01:07vec.begin+i
0797デフォルトの名無しさん
2008/12/19(金) 21:09:28MFC 使ってると代わりに CMemoryException 例外が投げられたりする。
一度これでハマった。
0798791
2008/12/19(金) 21:36:00なるほど、ハッシュ関数の質が効率に強く影響するのが特性であると。
整数のような単純なkeyではデメリットが表面化しないということか。
>>794
そうかもしれないけど、ハッシュコンテナが「一芸に秀でる」ような
アルゴリズムだったら一概に言えないかと思って。
元々はツリーの方が挿入・検索・削除の混在に強いと聞いたので試してみたら
それほどでもなかったという話だけど。
0799デフォルトの名無しさん
2008/12/19(金) 21:44:30ハッシュ値のとりうる範囲がやたら広いときくらいか?
0800デフォルトの名無しさん
2008/12/19(金) 22:12:380801デフォルトの名無しさん
2008/12/19(金) 22:58:25キーの衝突が発生しない限り、挿入、検索、削除のいずれもハッシュの方が高速だと思うんだが。O(1) vs O(log n) だよな?
0802デフォルトの名無しさん
2008/12/19(金) 23:15:140803デフォルトの名無しさん
2008/12/19(金) 23:16:10実際にはその保証が難しい場合もある
そうすると最悪O(n)になっちゃうからリアルタイム性が求められる場合とかは使えない
そういうときはどんなに最悪でもO(logn)が保証される(適切に作られた)ツリーコンテナの方がいい
まあフツーのPCアプリなら何も考えずにハッシュコンテナでいいことが多いけど
常にそれでいいと考えてると落とし穴に嵌ることもあるという話だと思う
0804デフォルトの名無しさん
2008/12/20(土) 01:38:350805デフォルトの名無しさん
2008/12/20(土) 04:11:23テストコードを晒してくれ。
順序性が必要な時でも unordered_map の方が早かったんだよな?
itor++ とかするコードでだよな?
知らないみんなの勉強になるから頼む。
0806デフォルトの名無しさん
2008/12/20(土) 07:18:22括弧がない
vec.begin()+i
end()の方はどうなってる?
0807デフォルトの名無しさん
2008/12/20(土) 15:51:26噛みつくような所かそこ?
0808デフォルトの名無しさん
2008/12/20(土) 17:58:45no-bura yahho-
0809デフォルトの名無しさん
2008/12/21(日) 00:11:13C++厨だから仕方ない
0810デフォルトの名無しさん
2008/12/21(日) 12:29:080811デフォルトの名無しさん
2008/12/21(日) 20:29:400812デフォルトの名無しさん
2008/12/22(月) 09:27:16虫がいるんだろう。
ポキールあげるから明日持って来なさい。
0813デフォルトの名無しさん
2008/12/22(月) 20:48:58最近も使ってるのかな。
0814デフォルトの名無しさん
2008/12/23(火) 07:52:43deq.push_front(vector<int>)
この型は演算子として使用できませんとでます。なんでですか?
0815デフォルトの名無しさん
2008/12/23(火) 08:13:540816デフォルトの名無しさん
2008/12/23(火) 08:21:54deque< vector<int> > deq;
vector<int> vec;
deq.push_front(vec);
これで動いた
0817デフォルトの名無しさん
2008/12/23(火) 11:22:18deq.push_front(vector<int>());
これならOK
0818デフォルトの名無しさん
2008/12/23(火) 12:01:02同じインスタンスであるvecを配列に追加していったら
参照したときに全配列全部同じ値を共有している状態だと思うんだけど
実際中を見るとvector<int>が複数出来てた。
このときdeqから参照しないでvecを見るとどのdeqのvecが入ってるの?
0819デフォルトの名無しさん
2008/12/23(火) 12:04:14コピーコンストラクタとか代入演算子って知ってる?
0820デフォルトの名無しさん
2008/12/23(火) 12:19:31std::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;
つまり全部別物。
0821デフォルトの名無しさん
2008/12/23(火) 19:24:03std::vector<int> vec;
は一つじゃないですか。
deq[].sizeで値が変わるのは、まあわかってないのですが、置いといて、
vec.sizeとしたときに、どのdeqのなにが返るのか
あ、vecのサイズは0か。
vecが合計4つ存在してることになるのか。コピーコンストラクタがやっとわかった気がする
ありがとう!
0822デフォルトの名無しさん
2008/12/23(火) 20:57:14// 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
0823デフォルトの名無しさん
2008/12/23(火) 20:58:20public:
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()だけしてバッファに使ってた
俺みたいな悪い奴はそんなに居ないか。
0824デフォルトの名無しさん
2008/12/23(火) 21:12:080825デフォルトの名無しさん
2008/12/23(火) 22:16:08大体初期化オーバーヘッド自体どうってことないしresizeでいいだろ
0826デフォルトの名無しさん
2008/12/23(火) 22:18:460827デフォルトの名無しさん
2008/12/23(火) 22:32:260828デフォルトの名無しさん
2008/12/23(火) 22:37:050829デフォルトの名無しさん
2008/12/23(火) 22:38:26作ったら作ったで車輪の再発明と言い出す奴が必ずいるという事実
0830デフォルトの名無しさん
2008/12/23(火) 22:40:06仮想デストラクタになってないし
0831デフォルトの名無しさん
2008/12/23(火) 22:44:23配列は(ry
まあ、例外安全とか単なるミスや検証の手間を防ぐ意味でも
vector<char>をバッファにというのは悪い考えではないでしょ。
ただ、それをresize()して使う場合の「無駄な初期化」をどう見るかと。
0832デフォルトの名無しさん
2008/12/25(木) 04:23:12vec.resize(INT_MAX);
このコンテナにデータを効率よくいれるにはどう書けばいいですか?
int data[INT_MAX];
for(int i=0; i<INT_MAX; i++)
{
vec[i] = data[i];
}
これめちゃくちゃ遅いんですけど他に手はありますか?
0833デフォルトの名無しさん
2008/12/25(木) 04:34:540834デフォルトの名無しさん
2008/12/25(木) 04:46:130835デフォルトの名無しさん
2008/12/25(木) 05:19:53assign() するとか。その場合は resize() 要らない。
0836デフォルトの名無しさん
2008/12/25(木) 06:38:25>834じゃないが、そりゃ無理だ。
0837デフォルトの名無しさん
2008/12/25(木) 06:48:0064bit環境でも普通intは32bit
sizeof(int[INT_MAX])は8G
0838デフォルトの名無しさん
2008/12/25(木) 06:57:010839デフォルトの名無しさん
2008/12/25(木) 06:58:56もちろん遅くて使い物にならないというのは同意。
0840デフォルトの名無しさん
2008/12/25(木) 10:21:59アドレス空間が足りていたとしても、スタックエリアが 8GB とかは絶対無理かと。
0841デフォルトの名無しさん
2008/12/25(木) 12:47:12INT_MAXはおいとくとして
vec.reserve(INT_MAX);
for(int i=0; i<INT_MAX; i++)
{
vec.push_back(data[i]);
}
でいいんじゃない?
0842デフォルトの名無しさん
2008/12/25(木) 12:57:280843デフォルトの名無しさん
2008/12/25(木) 13:00:28memcpyあるいは環境依存で最も高速なメモリコピー手法を使うとか。
0844デフォルトの名無しさん
2008/12/25(木) 13:01:39さらに遅くなってそうだな
0845デフォルトの名無しさん
2008/12/25(木) 17:45:150846デフォルトの名無しさん
2008/12/25(木) 17:47:570847デフォルトの名無しさん
2008/12/25(木) 18:13:380848デフォルトの名無しさん
2008/12/25(木) 22:49:49型が int だから memcpy でコピーすりゃいいが、それでも遅いのは遅いだろうな。
ただ、data はどうやって作ってんの? ってのが気になるな。
スタックに 8GB は無理だし、
静的に 8GB も取ってるとしてもどうなのよって感じだ。
0849デフォルトの名無しさん
2008/12/25(木) 22:54:47サイズだけ指定した場合は
POD 型だろうがメモリがデフォルトコンストラクタで得られる値で初期化されてしまう。
C++0x では改善されているようだが、現状では
resize するだけでも初期化ルーチンが走ってしまい、
さらにその後 data のコピーが走ることになる。
コピーするだけなら、resize じゃなくて assign を使うこった。
0850デフォルトの名無しさん
2008/12/26(金) 00:13:29てか質問者は大きいエリアという意味で、軽い気持ちでINT_MAXって
書いてしまっただけじゃないかと思うんだ。そんな端数必要な状況ってそうそうある?
0851デフォルトの名無しさん
2008/12/26(金) 00:40:28> C++0x では改善されている
詳しく。
0852デフォルトの名無しさん
2008/12/26(金) 18:23:44ポインタに入れるNULLみたいな値ってありましたっけ?
0853デフォルトの名無しさん
2008/12/26(金) 18:32:36というか、イテレータってなにかわかってんの。
0854デフォルトの名無しさん
2008/12/26(金) 18:58:48あるなら、それはプログラムがおかしい。コードを見直せ
0855デフォルトの名無しさん
2008/12/26(金) 19:37:580856デフォルトの名無しさん
2008/12/26(金) 20:40:090857デフォルトの名無しさん
2008/12/26(金) 22:45:331引数の resize が追加された。
現行の規格では resize は2引数で、
第2引数は const T& value = T() になってる。
だから、メモリが確保された場合、
そのメモリは T() でコピーコンストラクトされる。
0858デフォルトの名無しさん
2008/12/26(金) 22:56:11ありがとう。
しかし、この変更は「改善」と言ってしまっていいんだろうか?
C++ 2003 での POD のゼロ初期化に依存していたコードが静かに壊れることに
なりそうだ。
0859デフォルトの名無しさん
2008/12/26(金) 23:00:15>>858の言うように、同じ名前じゃ互換性の問題が出る可能性もあるだろうに。
0860デフォルトの名無しさん
2008/12/26(金) 23:02:31"default constructed" が "default initialized" という意味なら改良されてると読めるが、
規格中のほかの箇所では T() を指して "default constructed" と書いている箇所もある。
実は記述が紛らわしいだけで、 C++ 2003 と変わってないんじゃないか?
0861デフォルトの名無しさん
2008/12/26(金) 23:05:32requires 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.
あれ?同じじゃね?
0862デフォルトの名無しさん
2008/12/26(金) 23:17:27値渡しから const 参照渡しに変わったからじゃない?
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#679
対して、 resize() 時の初期値についての issue は見当たらない。
やっぱり変わってないんだと思う。しかし "default constructed elements" という
記述は "default initialized" との絡みで曖昧なマズイ状態になってると思う。
0863デフォルトの名無しさん
2008/12/27(土) 00:07:270864デフォルトの名無しさん
2008/12/27(土) 00:18:29default initialize ならそのとおり。でも default construct は T() のことかもしれない。
T() だとすると value initialize となって、 POD の場合は zero initialize になる。
0865デフォルトの名無しさん
2008/12/27(土) 00:19:38C++0xの最新ドラフトでも説明なしに使われてる(これはまずくないか)
default initializedは今の規格とC++0xで変わってて
今の規格では非PODはゼロ初期化することになってるが
C++0xの最新ドラフトでは非クラスは何もしないとなってる
0866デフォルトの名無しさん
2008/12/27(土) 00:26:55http://d.hatena.ne.jp/faith_and_brave/20081224/1230109605
0867デフォルトの名無しさん
2008/12/27(土) 00:50:560868デフォルトの名無しさん
2008/12/30(火) 15:45:23lower_bound(のようなもの)を適用することはできますか?
配列の代わりにvector<int>にしてreverse_iteratorを使えばよいということは分かるのですが、
配列のままで可能であればそれが良いなと思っています。お願いします。
0869デフォルトの名無しさん
2008/12/30(火) 16:14:24int* p = std::lower_bound(a, a + N, std::greater<int>());
0870869
2008/12/30(火) 16:16:30std::lower_bound(a, a + N, value, std::greater<int>());
0872デフォルトの名無しさん
2008/12/31(水) 15:40:29size = 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);
}
こうしたんですが、メモリの使用量が減りません。
繰り返すたびにどんどん増えていくんです。
どうすれば解放できるんでしょうか?
0873デフォルトの名無しさん
2008/12/31(水) 15:48:450874デフォルトの名無しさん
2008/12/31(水) 15:51:17http://www.google.co.jp/search?q=vector+%83%81%83%82%83%8A+%89%F0%95%FA
0875デフォルトの名無しさん
2008/12/31(水) 16:03:04vector<int>().swap(m_vec[i]); をsize分繰り返す
0876デフォルトの名無しさん
2008/12/31(水) 16:16:10vector<vector<int> >().swap(m_vec) なら一発で行けるかも
0877デフォルトの名無しさん
2008/12/31(水) 16:25:20int 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
うまく動いているようだ
0878デフォルトの名無しさん
2008/12/31(水) 17:29:06swapでなぜ解放されるかさっぱりわからないので勉強してきます。
vector< vector<int> >* m_vec;
m_vec = new vector< vector<int> >;
delete m_vec;
もしこうするとしたら、
*m_vec[i].resize(10000, 0);
2番目の引数がintからvector<_Ty>に変換できませんとエラーが出るのですが、ここはどう書けばいいんでしょうか
0879デフォルトの名無しさん
2008/12/31(水) 18:09:27だめです一部しか解放されません。
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]);
}
これはなんのデータが残ってしまってるんでしょうか
0880デフォルトの名無しさん
2008/12/31(水) 18:21:200881デフォルトの名無しさん
2008/12/31(水) 18:29:100882デフォルトの名無しさん
2009/01/01(木) 11:55:31vector<int> vec(1000,100);
int i[1000];
copy(vec.begin, vec.end, i);
int配列にvectorって入らないんですけど。
0883デフォルトの名無しさん
2009/01/01(木) 12:23:30しかし今日は元旦だ。
めでたいので特別に教えてやろう。
std::copyはSTL用のアルゴリズムなんだから、int配列には対応してなくて当然。
0884デフォルトの名無しさん
2009/01/01(木) 12:31:48beginとendの後ろに括弧が足りない。
>>883
使えるよ。
0885デフォルトの名無しさん
2009/01/01(木) 12:42:420886デフォルトの名無しさん
2009/01/01(木) 16:18:32> std::copyはSTL用のアルゴリズムなんだから、int配列には対応してなくて当然。
C++の特殊化を根本的に勉強し直す必要がある。
0887デフォルトの名無しさん
2009/01/01(木) 16:23:29もし「特殊化」を明示的特殊化のつもりで使ったのならば、
お前も勉強しなおせ。そうではないなら失礼した。
0888デフォルトの名無しさん
2009/01/01(木) 16:44:00イテレータの種類について勉強しろ、ってのが正しい。
0889デフォルトの名無しさん
2009/01/01(木) 16:53:380890デフォルトの名無しさん
2009/01/01(木) 18:16:19int* a;
a = new int[1000][10];
vector < ventor<int> > vec;
copy( vec[i].begin(), ven[i].end()-1, a[0][i]);
これはどうすればコンパイルできますか?
配列のバウンドが定数式ではありませんと出ちゃいます
0891デフォルトの名無しさん
2009/01/01(木) 18:23:17C++は適当に感覚でやって、なんとなく動いたらそれでいいやっつー
タイプの言語じゃないぞ
その調子でやってたらいつまで経っても物にならん
もっと簡単な言語からはじめるか、もっと基本的で低レベルなところから、ちゃんと
理解しながら進めろ
0892デフォルトの名無しさん
2009/01/01(木) 18:59:27変な奴w
0893デフォルトの名無しさん
2009/01/01(木) 19:12:111. 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] と書いても良い。
0894デフォルトの名無しさん
2009/01/01(木) 22:34:21どの言語でもそうだといえばそうだが、 C++ は Java とかに
比べて安全装置少ないから危険。さらにバグではないとしても
どうしようもないコード書くようになりそう。
0895デフォルトの名無しさん
2009/01/02(金) 10:07:09詳しく教えていただきありがとうございます!
どうしても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] に置き換えて受取側がアクセスできるかを見た方がいいのではと思いました。
これを実行するアルゴリズムなどは用意されているのでしょうか?
すいませんアドバイスお願いします
0896デフォルトの名無しさん
2009/01/02(金) 10:15:25int* a = new (*s)[data];
すいませんこれコンパイルできてません。
0897デフォルトの名無しさん
2009/01/02(金) 10:39:22> int* a = new int[1000*10]
> として、サイズだけは確保し、後からa[data][set]や、a[set][data]として自由に中身にアクセスできないんでしょうか?
自分で書けばできないことはないが、やる必要がないと思う。
a[data*1000+set]
これで十分。
0898897
2009/01/02(金) 10:40:37a[data*10+set]
0899デフォルトの名無しさん
2009/01/02(金) 11:15:41vector< 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];
}
}
0900デフォルトの名無しさん
2009/01/02(金) 12:18:32vector<vector<int> > (set, vector<int>(data)); じゃねーの?
0901デフォルトの名無しさん
2009/01/03(土) 09:38:07int (*a)[10] = new int[20][10];
でできるよ。
0902デフォルトの名無しさん
2009/01/03(土) 12:34:17v.resize(5);
の場合、v[n] または v.at(n) で各要素にアクセス出来ますよね
これ list の場合どうすればいいでしょうか?
list< list<int> > lst;
lst.resize(5);
at() も operator[] も使えなくて詰まっています
0903デフォルトの名無しさん
2009/01/03(土) 12:48:52なので
*std::advance(list.begin(), 5);
という式は概ねlist[5]のような意味を持ちます
0904デフォルトの名無しさん
2009/01/03(土) 12:48:57どうしてもしたいという場合は
list< list<int> >::iterator it = lst.begin();
std::advance(it, 5);
で *it を使おう。
0905デフォルトの名無しさん
2009/01/03(土) 12:50:55listっていうのはそういうもの。
[]とかatを使いたいなら、listを選んだこと自体が間違い
0906デフォルトの名無しさん
2009/01/03(土) 12:51:02advance の使い方違わね?
0907デフォルトの名無しさん
2009/01/03(土) 12:52:15なんでlistにしたのか知らんが、listを選んだ理由よりも、
vectorを選ばなかった理由を考えると、そういう間違いや迷いは起きない
0908デフォルトの名無しさん
2009/01/03(土) 12:54:44とりあえず検討してみれ。
0909デフォルトの名無しさん
2009/01/03(土) 13:04:570910デフォルトの名無しさん
2009/01/03(土) 21:07:490912デフォルトの名無しさん
2009/01/06(火) 22:12:35スキリスト教徒と言うらしいね
0913デフォルトの名無しさん
2009/01/06(火) 22:17:41deque厨ってあんまりいないよね
0914デフォルトの名無しさん
2009/01/06(火) 23:19:020915デフォルトの名無しさん
2009/01/07(水) 02:04:050916デフォルトの名無しさん
2009/01/07(水) 02:43:170917デフォルトの名無しさん
2009/01/07(水) 03:29:43もちろんランダムアクセスイテレータ対応のちゃんとしたSTLコンテナ。そんなに長くはない。500行しかない。
0918デフォルトの名無しさん
2009/01/07(水) 03:54:580919デフォルトの名無しさん
2009/01/07(水) 03:57:23たまに追加時間がやたらかかる stack とか、ちょっと怖い。
0920デフォルトの名無しさん
2009/01/07(水) 04:04:56vectorだと確保したままだからなぁ
0921デフォルトの名無しさん
2009/01/07(水) 04:09:540922デフォルトの名無しさん
2009/01/07(水) 04:46:47サイズが不定の場合はvectorは性能が悪い。
連続性が必要なければ、ほとんどの場面でdequeの方がいい。
0923デフォルトの名無しさん
2009/01/07(水) 13:34:170924デフォルトの名無しさん
2009/01/07(水) 17:59:210925デフォルトの名無しさん
2009/01/07(水) 18:18:09連続性と可変長が必要な用途には依然vectorが便利。
0926デフォルトの名無しさん
2009/01/07(水) 18:22:31ないとは言わんが
0927デフォルトの名無しさん
2009/01/07(水) 18:33:32大き目のバッファとか、ヒープから取りたい場合はvectorかな。
それともscoped_arrayみたいなのは入るんだっけ?
0928デフォルトの名無しさん
2009/01/07(水) 18:41:58中身を一要素ずつ書き込むしかないのかな?
0929デフォルトの名無しさん
2009/01/07(水) 18:49:130930デフォルトの名無しさん
2009/01/07(水) 19:02:22それはいいとしても、serializeの中でやっぱり一要素ずつ書いてたら
導入する意味は薄い気が。
0931デフォルトの名無しさん
2009/01/07(水) 19:03:490932デフォルトの名無しさん
2009/01/07(水) 19:45:060933デフォルトの名無しさん
2009/01/07(水) 19:51:56駄菓子菓子、そもそもバッファリングされるから纏めて書いてもメリットは余り大きくはない。
0934デフォルトの名無しさん
2009/01/07(水) 20:36:40関数コールのオーバーヘッドもバカにできない木が。
0935デフォルトの名無しさん
2009/01/07(水) 20:38:090936デフォルトの名無しさん
2009/01/08(木) 01:29:040937デフォルトの名無しさん
2009/01/08(木) 04:40:460938デフォルトの名無しさん
2009/01/08(木) 08:54:15その連続具合を得る方法とかあるのかなと思ったんだが、無いのか。
0939デフォルトの名無しさん
2009/01/08(木) 11:20:26dequeがvectorの500倍ほどかかってワロタ
VCのdequeの実装をみたら中身リングバッファで連続してない場合でも
2分割でしかないのに、これはダメだろ。
0940デフォルトの名無しさん
2009/01/08(木) 12:57:210941デフォルトの名無しさん
2009/01/08(木) 13:41:09要素数がいっぱいになったときにどうすんの?
0942デフォルトの名無しさん
2009/01/08(木) 13:49:460943デフォルトの名無しさん
2009/01/08(木) 14:15:42バッファのリンクを順にたどっていくと一周するようにリンクしてあるってことだろうか。
それならリングバッファと言っていいと思う。
push_back()とpop_front()を対で繰り返すような処理の場合に
バッファを再確保しなくていいから、ありなんじゃないかな。
#固定長のリングバッファ上を使用領域がぐるぐる回る
バッファを追加するときの処理が面倒そうだけど。
0944デフォルトの名無しさん
2009/01/08(木) 17:04:160945デフォルトの名無しさん
2009/01/08(木) 17:41:220946デフォルトの名無しさん
2009/01/08(木) 17:44:100947デフォルトの名無しさん
2009/01/08(木) 21:44:30しかもどうせ Debug モードなんじゃね?
コピーコンストラクタのあるクラスで試せ。
0948デフォルトの名無しさん
2009/01/09(金) 09:19:290949デフォルトの名無しさん
2009/01/09(金) 11:02:110950デフォルトの名無しさん
2009/01/09(金) 14:16:13そんなに頻繁にするならlistでいいじゃん
vectorの再配置がいやならdequeでいいし
0951デフォルトの名無しさん
2009/01/09(金) 19:48:35・ 連続性が必要な場合
・ サイズの変更をあまり行わない場合
に使う。
deque は
・ 連続性は必要ない場合
・ 末端への要素の追加をよく行う場合
に使う。
0952デフォルトの名無しさん
2009/01/09(金) 20:53:020953デフォルトの名無しさん
2009/01/09(金) 20:55:02要件と設計を見直す
0954デフォルトの名無しさん
2009/01/09(金) 21:05:48エディタとか
0955デフォルトの名無しさん
2009/01/09(金) 21:13:18そんな都合のいいもん・・・
迷ったらvector使え
0956デフォルトの名無しさん
2009/01/09(金) 21:14:34まとめて確保しとけー
0957デフォルトの名無しさん
2009/01/09(金) 21:35:18性能をあきらめる。
これがもっとも普通だろ。
0958デフォルトの名無しさん
2009/01/09(金) 21:40:59エディタは普通listだろ
EmEditorがstd::listを使っているのは有名な話
0959デフォルトの名無しさん
2009/01/09(金) 22:06:36とはいえ、小さいファイルしか扱わんなら
listとかvectorで十分と思うけどなー
0960デフォルトの名無しさん
2009/01/09(金) 22:24:460961デフォルトの名無しさん
2009/01/09(金) 22:28:170962デフォルトの名無しさん
2009/01/09(金) 22:30:52ってドキュメントがネットで読めるよ。
そこで一番推奨されていたのがPiece Tableって奴だったな。
が、linked listやgap bufferより複雑だ。
linked listは十分実用的で、出来合いのコンテナを利用できるのがいいな。
0963デフォルトの名無しさん
2009/01/09(金) 22:44:18まぁ行単位のぶつ切りなので範囲コピーとかの速度はリストと変わらんが。
0964デフォルトの名無しさん
2009/01/10(土) 00:24:08STL限定で連続性を求めたらその時点でvectorしかないんじゃ
0965デフォルトの名無しさん
2009/01/10(土) 00:50:49データを作成し終えたら vector に変換する手もある。
0966デフォルトの名無しさん
2009/01/10(土) 02:07:50STLじゃないけどbasic_stringは…?
0967デフォルトの名無しさん
2009/01/10(土) 02:08:220968デフォルトの名無しさん
2009/01/10(土) 11:33:550969デフォルトの名無しさん
2009/01/10(土) 11:42:55C++0x
C++0x
C++0x
|
|
0970デフォルトの名無しさん
2009/01/10(土) 11:50:510971デフォルトの名無しさん
2009/01/10(土) 13:14:19arrayってvectorと違ってヒープにメモリ取ろうとしたらまた別にメモリ管理が必要にならない?
scoped_arrayがc++0xに入るか知らないが、そっちだろ。
0972デフォルトの名無しさん
2009/01/10(土) 13:57:17dequeなら連続性が保証されないから、要素追加でアドレスも変更されないんだよね?
0973デフォルトの名無しさん
2009/01/10(土) 14:39:03dequeは変更されるよ
0974デフォルトの名無しさん
2009/01/10(土) 15:01:03「listは変更されない」という説明はやまほど見かけるけど
set(map)については見かけないんだよね。
この前、初めてsetについて明記してあるドキュメントを見たんだけど
これって、RW独自保証じゃなくて、規格で保証されてるよね?
http://docs.sun.com/source/820-2985/general/8_2.htm#826
0975デフォルトの名無しさん
2009/01/10(土) 15:12:14で「X3014」を検索してくれば
0976デフォルトの名無しさん
2009/01/10(土) 15:58:44>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 の総称な。
0977デフォルトの名無しさん
2009/01/10(土) 16:18:000978デフォルトの名無しさん
2009/01/10(土) 17:02:53マジで?簡単なサンプルコードでは大丈夫だったのに
大きめにresizeするかlist使うしかないってこと?
0979デフォルトの名無しさん
2009/01/10(土) 17:06:320980デフォルトの名無しさん
2009/01/10(土) 17:07:000981デフォルトの名無しさん
2009/01/10(土) 17:18:11そういう癖が付いちゃうんだよね仕方ないね
0983デフォルトの名無しさん
2009/01/10(土) 17:39:24Rubyですねわかります
0984デフォルトの名無しさん
2009/01/10(土) 17:59:080985デフォルトの名無しさん
2009/01/10(土) 20:20:54mapはランダムアクセスじゃないだろ
http://www.cplusplus.com/reference/stl/map/
0986デフォルトの名無しさん
2009/01/10(土) 20:56:43おまえは小学校から日本語を勉強し直せ。
0987デフォルトの名無しさん
2009/01/10(土) 20:56:54As associative containers, they are especially designed to be efficient accessing its elements by their key.なんでしょ?
Keyにintを使って代用しようかと
思ってたんだけど、>>972の使い方だとlist<T>とdeque<T*>の組み合わせなら再割り当ての問題は生じないね
自分の設計がアフォでした
0988987
2009/01/10(土) 21:01:05スレ汚し失礼、もう一度じっくり考えてみます
0989デフォルトの名無しさん
2009/01/10(土) 23:34:57「簡単」とか言うの禁止。
ビッグOとかで語れ。
0990デフォルトの名無しさん
2009/01/10(土) 23:40:420991デフォルトの名無しさん
2009/01/11(日) 00:00:220992デフォルトの名無しさん
2009/01/11(日) 00:02:50ここから好きなの探せ
ttp://ufcpp.net/study/stl/methods.html
0993デフォルトの名無しさん
2009/01/11(日) 00:16:02はぁ?
0994デフォルトの名無しさん
2009/01/11(日) 00:45:550995デフォルトの名無しさん
2009/01/11(日) 03:59:07本当に頭悪いんだな
0996デフォルトの名無しさん
2009/01/11(日) 05:19:21ヒント:接続詞
0998デフォルトの名無しさん
2009/01/11(日) 09:32:49>>985 の発言のことだろ?
0999デフォルトの名無しさん
2009/01/11(日) 09:36:17>>985「ラーメンはカレーじゃないだろ」
1000985
2009/01/11(日) 09:37:26あーそういう意味か
わかった。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。