1 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:09:22 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.44【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1194016813/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
116 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 08:30:42 ] >>114 きっと、 変数名=関数名(引数); て形自体が一つの構文だと思ってるんだろうな 戻り値を受け取る構文
117 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 08:34:31 ] >>93 数学で、 hoge = (26 × 176 - 25 × 24) / √((26 × 23 - 5 × 5) × (26 × 6 - 7 × 10)) と書いても、計算の仕方のルールがあるから、正しい結果を出せるでしょ。 それと同じで、sqrt()を先に計算して、その戻り値を使って / を計算するルールがあるから。
118 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 08:36:06 ] int func(int z) { return z * 2; } a = 8 + func(5); って文があるとコンパイラは a = 8 + 10; a = 18; って感じで処理する
119 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 08:43:37 ] 断定口調かよ
120 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:00:02 ] ディレクトリ構造をメモリに保存するにはどうしたらいいですか? ファイルに連番を付けてファイルのはパスがわかるようにしたいです
121 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:01:47 ] 多分木がいいとおもうのですが簡潔な方法有りますか
122 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:45:50 ] >>120-121 とりあえず自分でやれよ。具体的にわかんないところがあったら相談してもいいからさ。
123 名前:デフォルトの名無しさん [2007/12/10(月) 09:46:43 ] 前スレの一人用チャットです。 ┌──┐ │ │←出力用子ウィンドウ 入力ウィンドウに文字を打ち、エンターキーが押されたら └──┘ 出力ウィンドウに文字が表示されるようにしたい。 ┌──┐←入力用子ウィンドウ └──┘ ソースttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5461.txt winspectorでチェックしたところ、そもそもエンターキーが押された信号が出ていなかったので、 子ウィンドウのウィンドウプロシージャも作ったんですが、今度は入力用子ウィンドウが表示されなくなりました。 プログラムを開始してすぐにエンターキーを押すとメッセージボックスが出るので、入力用子ウィンドウ自体は どこかに作られていると思うんですが、自分の設置した場所には見当たりません。 猫でも〜を読んでもどこが間違っているのか分からないんですが、どうしたら子ウィンドウが表示されますか。 あと、まだ中身を作っていないのに、GUI?だけでやたら手こずってるんですが、こんなもんですか?
124 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:50:44 ] 特警しか思い出せなかった orz
125 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 10:27:15 ] 動的確保の変数って int *n=new int; と定義するんですか? なんかいつも*nとして使えなくて不便なんですが 配列の場合は静的と同じですが なんとかなりますか
126 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 10:33:35 ] >>123 C/C++でGUIはめんどい。そんなもん。 >>125 それであってる。deleteを忘れるなよ。 最後の行がよくわからない。
127 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 10:37:26 ] int a[10]; としたものとint *a=new int [10]; の使い方は同じなのに 変数だと違います
128 名前:デフォルトの名無しさん [2007/12/10(月) 10:48:13 ] >>123 SetWindowLongをやめればとりあえず表示された
129 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 10:57:45 ] >>123 130行目の引数がおかしいお エディットコントロールのデフォルトウィンドウプロシージャが呼ばれてない
130 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 10:58:54 ] int **p; としたとき p[100]は、領域確保しなくてもつねにアクセスできますか? アドレスの配列を作りたいのですが
131 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:01:28 ] これはエラーになります どうすればいいですか? int **p,n=100; p[10000]=&n; cout<<*p[10000];
132 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:03:56 ] これはエラーになりません ポインタ配列も動的確保などしないと使えませんか? int* *p= new int* [20000]; int n=100; p[10000]=&n; cout<<*p[10000];
133 名前:123 mailto:sage [2007/12/10(月) 11:04:25 ] >>129 うあああああ!!DefProcにしたらできました!! ありがとうございます!!
134 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:15:44 ] 多分木構造出来ましたよ #include <iostream> #include <string> #include <vector> using namespace std; class tree{ public: string data; vector< tree* > p; }; tree* create(string data){ tree *node=new tree; node->data=data; return node; } void insert(tree *node, string data ){ node->p.push_back( create(data) );}
135 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 12:08:55 ] 自分のIPアドレスを取得するにはどうしたらいいのでしょうか? C言語、Windowsでお願いします。
136 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 12:30:48 ] >>135 ipconfia
137 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:28:58 ] 複数のIP持ってる場合もあるしなあ
138 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:31:42 ] NICを全部あげるんだ
139 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:32:17 ] >>135 gethostbyname("")で取得 ipconfigの結果を解析
140 名前:135 mailto:sage [2007/12/10(月) 13:44:23 ] プログラムの中でipconfigを実行するにはどのようにすれば いいのでしょうか? 参考になるようなサイトを教えていただけると嬉しいです。
141 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:56:44 ] system() CreateProcess() あとはパイプとか適当にぐぐれ
142 名前:135 mailto:sage [2007/12/10(月) 14:03:05 ] >>141 ありがとうございます。 早速調べてみます
143 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 14:29:09 ] >>131-132 int *a; ポインタはアドレスを入れるための変数と考えるんだ。 int *a[100]; ポインタ配列は、アドレスを入れるための変数からなる配列 int **a; ポインタのポインタは、ややこしいが (アドレスを入れるための変数の)アドレスを入れるための変数 きちんと整理して理解しておいた方が良いよ。
144 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 20:15:27 ] クラスのコンストラクタ呼び出しや初期化リスト以外で、変数を int x(0); のように初期化するのってキモイですか?
145 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 20:35:11 ] かなり初歩的な質問だけど、ボタンのCaptionをプログラム内で変えるのってどうやるの?
146 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:12:53 ] SetWindowText() Win32APIスレへ
147 名前:デフォルトの名無しさん [2007/12/10(月) 22:41:06 ] unsigned long a ,b; int N; とします。 Nは大きいです。 printf(" time=%f[s]\n", (a-b)/N); だとうまく表示されるんですが、 cout<<"time= "<<(a-b)/N<<"\n";だと0になってしまいます。 coutを使って書きたいのでアドバイスお願いします
148 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:43:54 ] >>147 どちらもうまく表示されない double N; としろ。
149 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:45:31 ] >>148 ああ!わかりました
150 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 23:45:42 ] >>144 そんなのキモイなんて言ってたら引数付きコンストラクタしかないクラスで 変数が作れないだろ。
151 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 23:54:39 ] いや、だから彼はPOD型に使うのはキモいかと言ってるんだと思うよ
152 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 23:58:49 ] 書き方が統一できていいじゃないか
153 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 00:01:56 ] 一歩間違えると関数宣言になって意味不明なエラー出るから、っていうかそうなったことがあるから、 ちょっと怖いかな。 C からやってる人のこと考えても、あからさまな利点が無い限りやめといたほうがいいと思う。
154 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 00:13:54 ] >>150-153 皆様ご意見ありがとうございます。 関数と間違えられたので止めといたほうがよさそうですね。
155 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 04:57:40 ] VCです クラスのメンバー変数を、コンストラクタの初期化子で、初期化する事はできますし、 推奨もされていますが、クラスのメンバー関数は、コンストラクターの 初期化子で初期化するのは、できませんよね? ていうか、メンバー関数に初期化という、概念は無いですよね?
156 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 04:58:30 ] >>155 関数を初期化? 関数ポインタではなくて?
157 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:04:48 ] >>156 >>関数を初期化? そこを迷っているんです、メンバー関数の持つ変数は初期化できても メンバー関数に初期化なんて、概念は無いですよねやっぱり >関数ポインタではなくて? 関数ポインタなら初期化できるんでしょうか?
158 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:08:44 ] >>157 そもそも何を実現したいのかわからない。 具体的にどのような記述でどういう動作になるのを期待してるの?
159 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:17:59 ] >そもそも何を実現したいのかわからない。 今Effective C++読んでいて、Cしか知らないので、 目新しいことが多くて、C++の作法というか、スタイルに戸惑っているところです 具体的に何を期待するとかという意味はありません、ふと思ったまでです。
160 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:25:14 ] 159ですが、具体的な質問をさせてください class Foo { typedef struct st_data { st_data( int n, string s, double db : yymmdd( n ), code( s ), value( db ){} //@ int yymmdd; string code; double value; //st_data() : yymmdd( 0 ), code(""), value( 0.0 ){} //A } st_data; public: Foo(); ~Foo(); }: ただ、この様な構造体をは@、Aの方法で初期化できると思うのですが 実装で@の方法で初期化した変数にアクセスすると error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。 となります、組み込み型の変数はやはり、Aの方法でインスタンスを与えないといけないのでしょうか? @とAの違いは、なんなんでしょうか?
161 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:26:29 ] すんません ×ただ、この様な構造体をは@、Aの方法で初期化できると思うのですが ○この様な構造体をは@、Aの方法で初期化できると思うのですが
162 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 05:41:17 ] >>160 いまいちわからん まだ関数の初期化などという話が続いてるのかな? class Fooで包んでる意味がわからないけど、 とりあえず括弧の対応など幾つか修正した #include <string> using namespace std; class Foo { public: struct st_data { st_data(int n, string s, double db) : yymmdd( n ), code( s ), value( db ){} //@ int yymmdd; string code; double value; //st_data() : yymmdd( 0 ), code(""), value( 0.0 ){} //A }; Foo(); ~Foo(); }; int main() { Foo::st_data(0, "", 0); return 0; } これで1の方法で初期化できるけど…何を求めてるかがわからんので適当だ
163 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 09:07:45 ] FindNextFileの読み込み順序は制御できますか?
164 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 09:12:44 ] >>160 Cは分かるという話だから、何か簡単な勘違いをしているのだと思うけど、 そのエラーの原因はtypedef C言語でも、typedefしただけじゃ使えないでしょ? 変数を宣言しないと。 今回はそもそも再利用しないのでtypedefしなくてもいいから struct hoge { ... } hage; て形でいいと思うけど。
165 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 09:31:12 ] >>160 >error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。 コレって、引数を持つコンストラクタしかないクラス(等)に対して、 引数をつけずにコンストラクタを呼んだ時に見かける。 Foo::st_data data; とかで変数定義すると、引数の無いコンストラクタ呼び出そうとするけど、 どっかにそんな記述してない?
166 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 09:44:01 ] ソートのアルゴリズムなのですが、 for(sorted=0; sorted < N-1; sorted++){ insert = sort[sorted+1]; for(i=0; i<=sorted; i++) if(sort[i]>insert) break; while(i<=sorted+1){ temp=sort[i]; sort[i]=insert; insert=temp; i++; }}} for(i=0; i<=sorted; i++) if(sort[i]>insert) break; の部分が理解できません。 これは、if(sort[i]>insert)をfor(i=0; i<=sorted; i++)で繰り返すのはよしとして、 if(sort[i]>insert)が真の時にbreakして、whileに処理が飛ぶのでしょうか? そして、ifが偽のときはどこに処理が飛ぶのでしょうか?
167 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 10:01:41 ] sort配列の中で、insertよりも大きい値の位置「i」を探している 繰り返し中一度も真にならなければ「i」はsorted+1(最後)になる
168 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 12:08:25 ] >>163 ttp://msdn2.microsoft.com/en-us/library/aa364428.aspx >The order in which the search returns the files, such as alphabetical order, is not guaranteed, and is dependent on the file system. >You cannot depend on any specific ordering behavior. >If the data must be sorted, you must do the ordering yourself after obtaining all the results.
169 名前:164 mailto:sage [2007/12/11(火) 12:23:53 ] すまん俺のは忘れてくれ
170 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:20:32 ] vector <string> str; をディスクに保存したいのですがどの用にしたら良いんでしょうか?
171 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:31:24 ] どうにでも出来すぎて、どう答えたもんかわからんな。何か制約はあるの? たとえば、stringの中身に改行が無いことがわかっているなら、大雑把に一行一要素ずつ出力していって 読み出すときはこれまた大雑把にstd::getline()で読み出していけばいいし、 そうでないなら、stringのサイズと中身を順に詰めていって、読み出す時は サイズを読む→その分だけデータを読む、を繰り返していけばいい。 ファイルの開き方がわからないとか、そういうレベルなら「ファイルストリーム」とかで検索して勉強しる。
172 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:33:12 ] すみません string型にバイナリデータは読み込めませんか? char buf[1000];として bufに100バイト読み込んだとして、(string)bufと変換するしか無いですか? vector <string> str;の構造自体をバイナリで記録できれば変換必要ないと思うんですが・・・無理ですよね?
173 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:35:54 ] >>171 すみません なるべ読み書きの速度を上げたいんですが・・・ 行単位での書き込みは、もし1000万行とかになったら時間コストがかかりすぎますよね バイナリで一度に5メガずつとか読み込んで速度を上げたいです
174 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:39:49 ] stringのアドレスからどの様にデータが配置されているか判れば、直接バイナリで読み書きできそうですが・・・ size()以外の情報データは何ビットか判りますか?
175 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:44:33 ] >>173 >>171 が >stringのサイズと中身を順に詰めていって、読み出す時は >サイズを読む→その分だけデータを読む、を繰り返していけばいい。 と書いてるじゃないか
176 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:45:33 ] >>174 stringは可変長領域へのポインタを持っているだけだろうからその方法じゃ無理
177 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:46:29 ] char配列経由しないでstringに格納する方法は有りますか?
178 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:49:08 ] >>177 何をどこから格納するの?
179 名前:177 mailto:sage [2007/12/11(火) 14:04:14 ] たとえばdoubleならIEEE型のバイナリを8バイトずつディスクに書き込めるじゃないですか stringもバイナリで読み書きできない物かと
180 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:06:13 ] >>179 c_str()を使うといいよ
181 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:06:27 ] 自前でchar配列を管理した方が読み書きは速そうですね
182 名前:179 mailto:sage [2007/12/11(火) 14:07:46 ] 書き込むときは良いんですけど、読みこみがchar配列から変換する必要がでてしまいます
183 名前:180 mailto:sage [2007/12/11(火) 14:08:12 ] ごめん間違えた忘れて
184 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:08:32 ] あらかじめresizeしてから格納すればよいのでは?
185 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:10:06 ] リサイズで領域確保すればバイナリで読み込めますか?
186 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:12:11 ] 試せ
187 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:14:06 ] 速度を気にしてるようだけど、実測した上で言ってるの? そもそもデータ構造はvector<string>でいいの? 要求を満たす代替案は考えてないの?
188 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:15:57 ] 質問をまとめるとですね・・・ string型を直接ディスクに書き込んだり直接読んだり出来るかという事です
189 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:21:56 ] >>188 「直接」が曖昧 string s; ofstream f(filename); f << s; fwrite(&s, sizeof(string), 1, fp);
190 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:23:43 ] >>189 その方法で読み書き出来るんですか?試してみます stringは読み込むときにresizeしておかなくても読み込めるんですか? 確保していないところに書き込まれないですか?
191 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:24:31 ] >>188 boost::serialization
192 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:30:45 ] サンクス 出来ました #include <iostream> #include <fstream> #include <string> using namespace std; main(){ string s="this a pan.", t; fstream fp; fp.open("stringdat", ios::out | ios::binary ); fp.write( (char*) &s, sizeof(s)); fp.close(); fp.open("stringdat", ios::in | ios::binary ); fp.read( (char*) &t, sizeof(s));; fp.close(); cout<<t;}
193 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:32:32 ] string sを長くしたら表示中にエラーが出ました やはり確保しておかないと駄目ですか
194 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:36:48 ] ありがとうございました 確保しておいたらエラー出ませんでした
195 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:39:32 ] >>192 これは良いコードw
196 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:50:57 ] でも確保するサイズがなぜか2倍以下だとエラーになります なんか不安定だしメモリ食うので安全にcharにしようと思います
197 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:55:50 ] YUV422に関して、ど素人なのですが 再生用YUV422のサンプルファイルと、 再生用サンプルプログラム等を ダウンロード出来るサイトご存じの方いませんでしょうか?
198 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 14:59:22 ] >>192 うわぁ…
199 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:17:07 ] すみません vector<string>なんですけど、既に10Mバイトくらい使用していたとして、確保されている領域も無いとき 新たにstring型を追加するときは、別の空き領域を探してきて元のデータをコピーするんでしょうか? 手間かかりますよね? また、vector<string> str; str.resize(100000); と十分に確保してあれば各str[n]がどんなにメモリ食っても再配置されませんか?
200 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:18:39 ] 再配置されているかどうか調べるにはどうすればいいですか? 意図的に再配置を起こさせるような実験プログラムは判りますか?
201 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:31:39 ] >>199 きっと意図しているのは str.reserve() なのではないかと思うけど、ふ つうの実装だったらたくさんリザーブしておけばそこまでは再配置され ないんじゃないかねえ。規格は手元にないので知らない。 メモリへの要件が厳しいようなら、自分で vector 相当のものを書いた ほうが柔軟に対応できるかもしれない。
202 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:43:51 ] int main(){ void *p[10000]; string str; str="This is a pan."; p[0]=&str; cout<< *((string*)(p[0])); } とやれば出来ますけど、サブルーチンでstringを追加するにはstatic 付けたらいいですか? newで確保してもメモリから消えないんですけど値はつねに保証されますか?
203 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:46:45 ] 自前で作るならstring使わないでchar配列を動的確保した方が安定しそうですね でもサブルーチンで確保しても値は保証されますか?
204 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:49:12 ] そもそも、メンバ関数を初期化という概念がどこから来たのか知りたいぜ。
205 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:54:00 ] >>202 の場合、pを引数で渡しても、strは消滅の可能性がありますよね だから読み込めない場合がありますよね staticやnewで確保すればpを引数にしてデータアクセスはつねにできますか
206 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:57:34 ] >>199 全体のデータサイズよりも、文字列の個数によって方法論が決まってくるんじゃないかな。 stringの実装には色んなやり方があるけど、いずれの場合も、サイズの大きな中身はポインタで持ってる。 だから、10MB使用している状態でvectorが要素を再配置したからといって、その10MBのすべてが せっせと大移動を繰り広げるわけではない。 たとえばvector<string>の要素数が10で、それぞれのstringサイズが1MB、合計10MBのとき、 そのあとpush_back()で再配置が起きても、移動するのは「string型そのもの」だけ。 string型自体のサイズは、せいぜい数バイトから多くても20バイト台で、これが10個コピーされるだけってことになる。 でも、「平均10バイトの文字列が100万個で10MB」となると、これの再配置は確かにコストが高いわけで、 つまりこの辺は、君がイジろうとしているデータの性質次第で、アプローチが変わってくる部分だと思う。
207 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 16:03:23 ] >>206 ありがとう
208 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 16:09:55 ] >>202 ,203,205 どうも基本的なC++の知識が欠如しているように見えますよ。C++の入門 書を一冊読んでみたらいかが? メモリ効率を気にするのはまだ早いんじゃ ない? もちろん、 void add_item(string** array, int capacity, int size) { if (size >= capacity) return; string str = "..."; array[size++] = &str; } という風にすると、array[]に入れた値は関数から抜けた時点で無効です。 static にしたら汎用性がなくなりそうなので、new でしょうね。
209 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:28:51 ] >>206 >>stringの実装には色んなやり方があるけど、いずれの場合も、サイズの大きな中身はポインタで持ってる。 >>だから、10MB使用している状態でvectorが要素を再配置したからといって、その10MBのすべてが >>せっせと大移動を繰り広げるわけではない。 では、vector型データの参照渡しは無意味ってこと? 例えば vector<int>& Foo(){ return hoge; }; //@ vector<int> Foo(){ return hoge; }; //A この場合、@もAも関数を引き渡すコストは同じなの?
210 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:37:26 ] お前は何を言ってるんだ
211 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:40:16 ] >206 でもさ、vectorの再配置は、コピーコンストラクタで行うんだから、 stringの性質によっては、どっちも10MBすべて大移動になるでそ? 特に最近は、スレッドの絡みで、COWしないのが流行りだし。
212 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 19:25:24 ] なんか話が噛み合ってないおかーん
213 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 19:58:08 ] rope使えよ
214 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 21:42:35 ] struct point{int x,y;}; を<algonithm>でソートしたいんですが、 キーがxの順とyの順を切り替えて使いたいです 切り替えないなら bool operator< (const node& left, const node& right){return (left.x < right.x);} でいいんですが、切り替える時はどういう風にオペレータを定義すればいいんでしょうか? どちらの順にするかは各クラスによって決まっているので出来ればメンバ関数化したいです 環境はg++です
215 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 21:51:05 ] x, yそれぞれの比較関数作ってsortに渡せばいいじゃん
216 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 22:04:16 ] >>215 クラス内に書くと operator<(const point&, const point&)' must take exactly one argument と怒られるので仕方なくグローバル関数にしています、 上と同じ内容のオペレータをメンバ関数にするにはどうしたらいいのかサッパリでorz