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


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

スレを勃てるまでもないC/C++の質問はここで 20



1 名前:デフォルトの名無しさん [2011/09/15(木) 00:17:43.25 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 pc11.2ch.net/test/read.cgi/tech/1167476845/
02 pc11.2ch.net/test/read.cgi/tech/1178503366/
03 pc11.2ch.net/test/read.cgi/tech/1187521676/
04
pc11.2ch.net/test/read.cgi/tech/1221633708/
05 pc11.2ch.net/test/read.cgi/tech/1230516307/
06 pc11.2ch.net/test/read.cgi/tech/1231564903/
07 pc11.2ch.net/test/read.cgi/tech/1232983248/
08 pc12.2ch.net/test/read.cgi/tech/1235921779/
09 pc12.2ch.net/test/read.cgi/tech/1240022781/
10 pc12.2ch.net/test/read.cgi/tech/1242300936/
11 pc12.2ch.net/test/read.cgi/tech/1245059383/
12 pc12.2ch.net/test/read.cgi/tech/1248010352/
13 pc12.2ch.net/test/read.cgi/tech/1260842197/
14 pc12.2ch.net/test/read.cgi/tech/1269273471/
15 pc12.2ch.net/test/read.cgi/tech/1273368706/
16 hibari.2ch.net/test/read.cgi/tech/1279285647/
17 hibari.2ch.net/test/read.cgi/tech/1285115590/
18 hibari.2ch.net/test/read.cgi/tech/1291571263/
19
hibari.2ch.net/test/read.cgi/tech/1308106024/

202 名前:デフォルトの名無しさん mailto:sage [2011/10/30(日) 16:05:55.41 ]
ttp://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

203 名前:デフォルトの名無しさん mailto:sage [2011/10/30(日) 16:59:31.69 ]
>>199
エスパー?
平均値なんてどこに書かれてるんだ?

204 名前:デフォルトの名無しさん mailto:sage [2011/10/30(日) 18:51:19.14 ]
>>202
それは外国の話だろ
少中高大とマジキチ排除フィルターがよく機能してる日本ではあり得ない


205 名前:デフォルトの名無しさん mailto:sage [2011/10/30(日) 23:24:03.72 ]
日本でも2〜3%くらいいるんじゃないかと思ってる

206 名前:デフォルトの名無しさん mailto:sage [2011/10/31(月) 00:14:48.55 ]
FizzBazz問題ってあの言語もこの言語も使えますって言う奴に、じゃあそれぞれの言語
でFizzBazz書いてみてっていう為の問題じゃないの

207 名前:デフォルトの名無しさん mailto:sage [2011/10/31(月) 00:27:04.90 ]
FizzBuzzでゲームとしてやるとなかなか難しいよな

208 名前:デフォルトの名無しさん mailto:sage [2011/11/02(水) 21:44:06.70 ]
転売用にAmazon自動予約スクリプト使いたいけど、パソコンの台数と、回線の数、どっちが大事?

209 名前:デフォルトの名無しさん mailto:sage [2011/11/02(水) 23:09:29.09 ]
>>208
コンパイラのバージョンは?

210 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 07:25:39.91 ]
>>208
回線の数




211 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 14:40:20.39 ]
iに1から9までの値が入力されるまで
延々とscanfを繰り返すプログラムを作りたいのですが

do{
scanf("%d",i);
}
while(i<1||9<i)

このようにすると、文字列が入力された時等にwhileを抜けてしまうので上手く動作しません。
想定しない文字列(全角文字や英字、記号)はどのように処理するのが一般的ですか?
while(!(0<i&&i<10)も検討してみたのですがこちらはどうでしょう?

212 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 14:47:37.16 ]
>>211
ここの下の方のようにすればいいとおもわれ
ttp://ja.wikipedia.org/wiki/Scanf

213 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 19:41:38.43 ]
>>212
ありがとうございます。
上手く処理できそうです!
wikipediaにヒントがあるとは…。
検索不足かつ初歩的な質問ですみませんでした。

214 名前:デフォルトの名無しさん mailto:sage [2011/11/04(金) 02:57:21.58 ]
XMLとかのタグのいい検出方法教えてください。
今は
src=strstr(src,タグ名)+strlen(タグ名);
'<'までコピー
ってしてるけど、汎用性がない

215 名前:デフォルトの名無しさん mailto:sage [2011/11/04(金) 11:56:25.19 ]
>>214
規模が大きいならパーサライブラリを使うのが無難だけど、
そうでもないならstrstr()でもいいんでない?
どの辺が汎用性がないと思っているの?

216 名前:デフォルトの名無しさん mailto:sage [2011/11/04(金) 23:49:27.03 ]
>>215
決まったタグしか検出できないとか、タグの書く順番をガチガチに決めておかないと
いけないとかそういう辺り。HTMLみたいな感じでタグの書く箇所によって、どこ
がどの属性を持つかとかまで指定出来るようにしたいんだけど、それをしようとすると
if文で羅列するばっかの馬鹿みたいなコードになっちゃう。
パーサライブラリで調べたらいっぱい出てくるのね。オープンソースの探してどうやってるの
か見てみることにする

217 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 03:22:25.00 ]
Windowsでプログラムのメモリ消費量を知りたいのですが、どうすればいいのでしょうか?
最大メモリ消費量ではなく、現在のメモリ消費量を随時知りたいです。

218 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 03:49:00.68 ]
>>217
ProcessExplorerでも使えばいいやん

219 名前:デフォルトの名無しさん [2011/11/05(土) 03:53:28.86 ]
構造体に特定の値("a")が手入力された時に、ループから抜ける処理をしたいのですが動きません。
aを入力しても5回ループしてしまいます。
コンパイルエラーはないのですが、どこがおかしいか分かりますか?
(ファイル分割や構造体の宣言で躓いているかもしれません)

/* main.h */
struct shain{
char *name;
int num; //未使用
}

/* main.c */
myfunc();

/* myfunc.c */
void myfunc(void){
struct shain list[5];
for (i=0 ; i<5; i++){
scanf("%s", &list[i].name);
if (list[i].name == "a"){
printf("aが入力されました\n");
break;
}
}
}

220 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 03:53:49.99 ]
ここから、ここの処理まではメモリ消費量何Mだったとか書き出したいのです



221 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 04:09:30.08 ]
>>219
/* main.h */ 
struct shain{ 
char *name; //←ポインタしか作られてない正確には
//char nameか、配列やmallocで確保
int num; //未使用 

} 

/* main.c */ 
myfunc(); 

/* myfunc.c */ 
void myfunc(void){ 
struct shain list[5]; 
for (i=0 ; i<5; i++){ //int iで宣言
scanf("%s", &list[i].name); //危険、一文字ならgetchar
if (list[i].name == "a"){ //""だとaのポインタになっとる。'a'。
//または比較関数使え
printf("aが入力されました\n"); 
break; 
} 
} 
}

222 名前:219 mailto:sage [2011/11/05(土) 04:34:55.93 ]
>>221
動いた!
ありがとうございます!!

223 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 07:36:28.71 ]
visual stadio 2003で作ったプログラムをvisual c++ 2010 expressで使うと
deque interator not dereferencableて出ます。
対処法を教えていただきたいです。

224 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 08:38:37.67 ]
>>220
アロケータ−作れば?

225 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 17:55:16.70 ]
>>223
コピペくらい手順をちゃんと覚えなさいよ。
んで、ここに貼らずに翻訳サイトに貼れば答えが出てくるよ。

226 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 17:56:00.64 ]
>>220
自分で書いた処理なら、自分で把握できているでしょ。それを書き出せばいいじゃん。

227 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 23:33:10.37 ]
>>220
他人が作ったプロセスのメモリ消費量を知りたいのか、自分のコードの中で、自分の消費した量を知りたいのかで違う。
また、自分の消費した量でも、スタックだとかstaticだとかnewやallocだとかのどの量を知りたいのかで違う。
さらに、スレッド別に知りたいかどうかでも違う。


228 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 06:19:15.51 ]
クラスに追加で一時的に変数持たせたい、要するに
クラスに計算結果を入れておく変数を一時的に作りたいんだけど、どうすればできますか?

229 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 09:45:43.45 ]
そのクラスの定義を変更できないなら直接は無理。そのクラスを継承や包含で利用する別のクラスを作る。

230 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 10:51:17.37 ]
>>229
便乗ですみません。継承・委譲はわかるのですが、包含はよくわかりません。java や c++ だとどんな感じのコードになるのでしょうか?



231 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 10:57:15.41 ]
>>228
std::map<Hoge const *, TempValueType>

232 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 12:29:13.37 ]
>>230
C++で包含といったらある型が他の型(のインスタンス)を内部にもつ(所有する)、くらいのおおまかな概念でしかないよ

struct X { // X型はint型とY型を包含する
 int x;
 Y y;
};

int x[10]; // intの配列型はint型を包含する (とは概念的にはありえるけど普通は言わない)

233 名前:デフォルトの名無しさん mailto:sage [2011/11/06(日) 14:18:37.77 ]
>>244 >>226-227
自分で組んでるプログラムのヒープやスタック全てを合わせたメモリ消費量を知りたい。
そういう関数でもあるかと思ったけど無いのね
アロケーター調べてみたけど作るのも面倒そうだし、全部数えて書き出すのは規模的に
ありえないしで、もう諦めることにする。ありがとう

234 名前:デフォルトの名無しさん mailto:sage [2011/11/07(月) 18:14:50.65 ]
タスクマネージャで仕様メモリなんか表示できてるんだからあるんじゃねぇの

235 名前:デフォルトの名無しさん mailto:sage [2011/11/07(月) 18:36:25.60 ]
アロケータごときで面倒とか言ってたら何も出来ないだろ

236 名前:デフォルトの名無しさん [2011/11/07(月) 22:20:44.39 ]
namespace内のoperatorってどうやって呼べばいいのでしょうか?
例えばboost::assignの += みたいなやつ。

using namespace boost::assign;
std::vector<double> vec;
vec += "1.0", "2.0";

でusingを使わずにboostのoperator+=を呼ぶ方法はあるのでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2011/11/07(月) 23:08:15.53 ]
boost::assing::operator , (boost::assign::operator += (vec, "1.0"), "2.0") ;

使ったこと無いからわからんけどたぶんこう



238 名前:デフォルトの名無しさん mailto:sage [2011/11/07(月) 23:49:54.14 ]
operator+=とは違うし試してないがたぶんこういう感じのどれかでいける
boost::assign::push_back(vec)("1.0")("2.0");
boost::assign::push_back(vec), "1.0", "2.0";
追加でなくてよいなら
vec = boost::assign::list_of("1.0")("2.0");
vec = boost::assign::list_of("1.0"), "2.0";

239 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 00:02:03.97 ]
いつ見てもおぞましいインターフェースだな

240 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 00:19:13.46 ]
vector<double>に文字列はどの方法でも入らんな



241 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 04:17:41.94 ]
>>239
いやまったく。
boostは確かに便利な局面もあるが、そんな無理しなくてもと思うことの方が多い。


242 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 19:15:01.84 ]
アドレスを文字列に変換する場合、
void* pVoid = ...
ostringstream oss;
oss << pVoid;
こうするとoss.str()には、例えば「000012AB」という文字列が入るのですが、
16進数・0埋め・桁数など指定していなくても、環境問わずそれらが指定された形になる事は保障されているのでしょうか?
また、64bitOSでは16桁になるのでしょうか?

243 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 20:15:37.91 ]
そんな保証はない

244 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 20:16:12.25 ]
>>242
「指定していないのに指定された形になることが保証されているのか」って、
自分でなにを言ってるのか良く考えてからどうぞ。

245 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 17:21:00.49 ]
継承って何ですか
バカにも分かるように教えて下さい

246 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 18:56:06.66 ]
ロマサガ2をやれば分かると思うよ

247 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 19:50:13.26 ]
>>245
既存のクラスの一部/全ての機能を利用する新しいクラスを作る手法の一つ

248 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 20:00:36.18 ]
>>247
わかりづらいです・・・
ドラゴンボールで例えてみてください・・・

249 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 20:09:31.37 ]
>>248
ゴクウを亀仙人のところで修行させてかめはめ波を習得すること。

250 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 20:36:50.37 ]
>>248
セルは孫悟空、ベジータ、ピッコロ、フリーザ達の強い細胞を継承して生まれた



251 名前:デフォルトの名無しさん mailto:sage [2011/11/13(日) 01:40:39.84 ]
構造体の実態をexternしたいのですが何をやっても値がnullになってしまいます・・・。
値を代入したソース上で開けばちゃんと値が入っているのですが、他のソースからだと見れないのですが、どうすればいいでしょうか・・・。


252 名前:デフォルトの名無しさん mailto:sage [2011/11/13(日) 02:02:56.46 ]
>>251
問題のコードをcodepadかideoneに貼れ。

253 名前:デフォルトの名無しさん mailto:sage [2011/11/13(日) 21:01:12.73 ]
下記ようなのクラスのインスタンスをsetにぶち込むとリンカエラーが来るのですが、
テンプレートでの、friendな演算子の定義の仕方に問題があるのでしょうか?

template<class T>
class Test{
public:
T data;
friend bool operator <(const Test<T> &a, const Test<T> &b);
};
template<class T> bool operator <(const Test<T> &a, const Test<T> &b){
return a.data<b.data;
}


254 名前:デフォルトの名無しさん mailto:sage [2011/11/13(日) 21:20:32.38 ]
宣言と定義を分けるな

255 名前:デフォルトの名無しさん mailto:sage [2011/11/13(日) 21:35:13.87 ]
>>254
ありがとうございました。

256 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 10:20:27.56 ]
こういう事か

template <class T>
class Test;

template <class T>
bool operator<(const Test<T>& a, const Test<T>& b) {
return a.data < b.data;
}

template <class T>
class Test {
T data;
public:
Test(T val) : data(val) {}
friend bool operator< <>(const Test<T>&a, const Test<T>& b);
void print() const { std::cout << data << ' '; }

};

int main(void)
{
typedef Test<double> TD;
std::set<TD> td;

td.insert(TD(1.0));
td.insert(TD(0.5));
std::for_each(std::begin(td), std::end(td), [&](TD t) { t.print();} );
std::cout << std::endl;
}

257 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 10:24:09.66 ]
templateって特殊化した定義ならソースに書いて良いの?

258 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 12:25:43.81 ]
>>256
それだと

Test<int> t(100);
t < 123; //できない
50 < t; //できない
t < Test<int>(200); //これならできる

とかで不便なときがあるぞ

259 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 13:01:25.88 ]
>>258
当たり前じゃん
operator<が定義されてないんだから
Testってクラスだよ?

俺は>>253を試して何とか動くようにしてみただけ


260 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 14:20:45.83 ]
>>259
>>253,254

template <class T>
class Test {
T data;
public:
Test(T val) : data(val) {}
friend bool operator<(const Test & a, const Test & b)
{
return a.data < b.data;
}
};

int main(void)
{
using namespace std;
Test<int> t(100), t2(1000);
cout << (t < t2) << endl;
cout << (t < 123) << endl;
cout << (50 < t) << endl;
}



261 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 15:22:36.11 ]
>>260
どうなってんのこれ?
変換演算子もないのにどうして動くの?

262 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 12:06:13.76 ]
templateを使いすぎると実行ファイルが大きくなるから気をつけろって言われたんですけど
実行ファイルが大きくなってなにか困ることがあるんですか?


263 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 12:58:34.87 ]
メモリの使用量が増えるとか起動が遅くなるとか

264 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 13:19:24.28 ]
要領不足でインストールできなくなる

265 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 14:09:10.89 ]
大きくなるか??

266 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 14:29:32.76 ]
>>260
friendで演算子を定義すると、object.operator@(引数)という形では評価されないので
暗黙のコピーコンストラクタにより一時オブジェクトが生成される

もちろんクラス内部にdeep copyが必要な要素が混ざっていると危険なので
自前でコピーコンストラクタを定義する

267 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 15:19:31.90 ]
>>265
インライン展開されちゃうよ、な話ではなかろうか。

268 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 15:28:44.33 ]
別にtemplateじゃなくてもインライン展開されるけどね。

269 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 04:20:58.65 ]
今時PC上で動かすならインライン展開できるだけするべきだろ

270 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 04:33:41.80 ]
インライン展開はできる限る使わない方が速い。
メモリ使用量が増大するし、同一関数が別々と認識されCPUキャッシュの効果が薄れる。



271 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 05:18:44.06 ]
というか、インライン展開で速度速くなるものなの?
インライン展開した所で、たいして速くなりそうもない気がする。
アルゴリズムとか制御構造見直した方がよほど速くなる可能性があるだろ。たぶん。

272 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 08:40:21.30 ]
ためしにVC++2008でインクリメントするだけの関数で
[256 * 256][256]のint配列の全要素をインクリメントしたら
inlineじゃないほうが倍ぐらい早かった
こういう小さい関数ってinlineの得意な分野だと思ってたけどそうでもなかったようだ

273 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 09:32:48.11 ]
>>272
最適化で消えてる可能性は?

274 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 09:38:55.85 ]
>>272
何通りか試したら、同等〜20%程inlineのほうが速いよ
最適化防止のコードを入れてないんじゃないの?

275 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 10:04:11.99 ]
パフォーマンス測定で最適化防止っておかしくね?

276 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 10:09:15.33 ]
インライン展開の効用は、コードをインラインに展開して関数呼び出しを減らすことよりも
関数内部と外部に跨る最適化が施されることにあるよ。
例えば、C++でクラスのメンバのアクセサを作ったとすると、メンバに直接アクセスするのと同じコードになり得る。
↓のfoo::func()も、最適化で定数と同じになれる。
--
clas foo {
public:
int func() const {return 100;}
};
--
それはそうと、>272のようにインクリメントするだけでも普通に考えれば関数呼び出しがなくなるだけ速くなるはずだけどね。

277 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 18:17:22.55 ]
>>270
巨大な関数ならともかく、小さな関数はインライン展開した方が高速。
巨大な関数を展開するコンパイラはないと思うが、されたらキャッシュに響くので低速になる場合がある。

>>271
意味のない比較

>>272
ソースがないので何とも言えないが、君のテスト方法が間違っている可能性大。
その配列のサイズを見る限り、インラインじゃないところにボトルネックがありそう。


278 名前:デフォルトの名無しさん [2011/11/26(土) 19:47:26.08 ]
ちょっとageますよ
少し前に糞スレをage荒らししてたアホがいたもんで大事なスレが全部
下の方に行ってしまってる

279 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 19:53:06.42 ]
昔のCPUはジャンプ命令のコストがでかかったとか、パイプライン処理が初期化されるとかで有効だった。
(引数や復帰アドレス保存のコストもかかるし)

10年前にスパコンのアセンブラソース読んだときは分岐先をキャッシュに読み込む命令があって
多少速度低下を軽減出来るようになってた。

280 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 20:02:37.24 ]
今じゃ遅延スロットも完全に消えたしな

投機実行とリターンバッファで十分



281 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 23:14:18.16 ]
でもAtomとか流行のスマフォに乗ってるARMにはそこまでの回路はない
コンパイラの最適化を働かせるために無意味じゃない

282 名前:デフォルトの名無しさん mailto:sage [2011/11/26(土) 23:18:06.91 ]
Atomがインオーダー実行と聞いた時は驚いたな
命令セットは新しいのに

283 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 22:20:26.93 ]
エクスプローラっぽいものを作ってるんですが、ファイルの名称、日付、サイズ以外の状態などの取得で詰まってます。
特に特殊フォルダで状態をデフォルトで表示したい場合に困っています。
シェルを使うのかと思ったんですが、わからず。
アドバイスお願いします。

284 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 22:27:00.77 ]
それはC言語でなくOS機能の問題だ。


285 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 08:57:39.38 ]
>>284
環境はXPでBCB使ってます。
特殊フォルダ内の名前なんかは取得できてるんですが・・・

C++でエクスプローラの「状態」項目を取得するのは無理ですか?

286 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 09:04:19.55 ]
>>285
WinAPIスレで聞いてきたら?

287 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 13:16:39.61 ]
>>283
ShellExtensionでぐぐれ

288 名前:285 mailto:sage [2011/11/30(水) 22:15:24.10 ]
>>286
そうですね。移動します。
ありがとうございました。

>>287
ggrましたが、正直理解し切れませんでした。>ShellExtension
まだシェル使うにはレベルが足りていないようなので、今回はあきらめます。
ありがとうございました。

289 名前:デフォルトの名無しさん [2011/11/30(水) 22:30:18.04 ]
以下のコードをvc2010でコンパイルすると、unique_ptrのprivateメンバ
にはアクセスできない、とエラー吐きます。
std::move付ければうまいことやってくれないかと試しましたがやはり駄目
です。どうすればhogesにpush_backできるでしょうか?

struct Hoge {
std::unique_ptr<int> v;
};

int main(int argc, char** argv){
Hoge hoge;
std::vector<Hoge> hoges;
hoges.push_back(hoge);
return 0;
}


290 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 23:01:30.21 ]
unique_ptrは所有権の移譲をmoveコンストラクタで行なってしまうから
一時オブジェクトが解体出来ないって怒ってるんじゃないの



291 名前:289 mailto:sage [2011/11/30(水) 23:15:30.73 ]
>>290
解体できない、という意味がよくわからなかったのですが、
以下のような理解であってます?

unique_ptr<Hoge> hoge(new Hoge());
vector<unique_ptr<Hoge>> hoges;
hoges.push_back(hoge);
これは289と同じコンパイルエラーを吐く。

vector<unique_ptr<Hoge>> hoges;
hoges.push_back(unique_ptr<Hoge>(new Hoge()));
これはOK。

ってことで、hogeが確実に一時オブジェクトだと保証できれば良し。
289で書いたようなやり方だと、push_backのあとでまたhogeが使われる
可能性があるから駄目、と。


292 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 23:18:50.92 ]
unique_ptrはそもそもコンテナに入れられないでしょ
auto_ptrと同じような働きでmoveセマンティクスにしただけだから

shared_ptrにしないとまずい

293 名前:デフォルトの名無しさん mailto:289 [2011/11/30(水) 23:50:02.24 ]
>>292
unique_ptrがコンテナに入れられないとか嘘乙、と書く前に調べたら
bit.ly/vAdcOU
で入れられるけど中間挿入したらアウトって書いてあってなるほど。
挿入は最後尾のみにしかしない、ということが確実であれば利用は
可能ですよね?
規格書までは読んでないので間違ってたら指摘お願いします。

294 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 00:25:42.85 ]
> 入れられるけど中間挿入したらアウトって書いてあってなるほど。
どこからそんな話が?
11のコンテナはmoveしかできない型を入れても何も問題はない。ただしそのときはコピーを必要とする操作は当然出来ない。
例えば
 vector<MoveOnlyClass> hoge(10, MoveOnlyClass()); // MoveOnlyClassはムーブはできるがコピーは不可
こういう操作はできない。(これは第2引数のコピーで要素10個を初期化するコンストラクタでmove版はない)

295 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 00:30:27.05 ]
unique_ptrを突っ込んでsortとか掛けたらどうなるん?
あとsetとか入れた時の挙動も気になる

296 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 00:32:34.19 ]
取り敢えずgccでコンパイル掛けてみたら山ほどエラー吐いてワロタ
もちろん -std=c++0x は付けた

297 名前:289 mailto:sage [2011/12/01(木) 01:02:04.85 ]
>>294
bit.ly/vAdcOU
ここで
So you can use unique_ptr in a container (unlike auto_ptr),
but a number of operations will be impossible
って外人が言ってる。理由は294が書いてる通りコピーを伴うから。
で、hogesにpush_backは確実に一時オブジェクトであることが
保証できない限り駄目、って理解であってます?

>>295
上で書いたURLでsortはmoveで出来るからOKって同じ外人が言ってる。
ほんとに外人かどうかは知らんけども。

298 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 01:09:02.84 ]
そういう使用制限が掛かってまでもunique_ptrを使いたい理由は何だろう

299 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 01:12:56.51 ]
自分が何を間違えているのか正しく理解しておかないと、
同じようにまたやらかすと思うんよ。

300 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 01:47:37.94 ]
>>289
> std::move付ければうまいことやってくれないかと試しましたがやはり駄目
これがわからん。VC++では知らないがmoveで動くはずだぞ。どうやった?



301 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 11:15:02.08 ]
Hogeのmoveコンストラクタを書けばいいだけだろ

302 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 12:04:26.89 ]
string::c_strは規格上例外を投げうる、でおK?






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

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

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