[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/28 11:42 / Filesize : 246 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

【初心者歓迎】C/C++室 Ver.45【環境依存OK】



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






[ 続きを読む ] / [ 携帯版 ]

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

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