08/03/23 20:37:34
>>409
ざらにいるんじゃないか、ファンクタを知らないPGは
だけど、今のPRJはユースケース駆動モデルでOOPかつAOP的コンセプトを多分に取り入れてる
から、ファンクタや関数オブジェクトの名前すら知らないようではさすがにPGとして使えない
デザインパターンの幾つかを理解しているくらいは最低求められる
とはいいつつも、知らずにそういうパターンを使っているってことは経験あるとおもうよ
大抵はライブラリとして用意されてるものを別途作って無駄なことやってることになるんだろうけどねw
>>410-412
まぁ固いこと言わないでマターリやろうよ
>>413
いや、有名人でもなんでもないよw
出身地は関西だが、都内で仕事してるしさ
>>414
オガちゃんいいよな!
416:オガちゃん萌え ◆tyvkWCNtzY
08/03/23 20:41:16
>>408
可変引数を使うのにstdarg.hを使ったよ
va_start()やらはマクロを通して最終的にコンパイラ組込み型だからさ
ログ吐き用とはいえ、%SSっていう変なリテラルを敢えて作って、UTF-16の文字列をUTF-8(ASCII)
に変換してログ出しするってのを作ったわけなのだが、案外はまってしまったw
417:デフォルトの名無しさん
08/03/24 12:37:23
緒方賢一に萌えるスレはここですか?
418:デフォルトの名無しさん
08/03/27 00:46:11
そうです。
419:デフォルトの名無しさん
08/04/16 01:48:57
vectorにデータを追加した時にメモリ確保に失敗した場合、検出する方法ってありませんか?
newでいうbad_allocの例外をキャッチするような感じ。
420:デフォルトの名無しさん
08/04/16 02:12:07
bad_alloc捕まえれば?
URLリンク(hpcgi1.nifty.com)
421:デフォルトの名無しさん
08/04/16 02:18:03
>>420
な、なんだこの低レベルなやり取りは…
422:419
08/04/16 02:26:03
>>420
お!
VC2005で確認しました。
STLでもbad_allocスローしていたんですねw
あざ~す♪
423:デフォルトの名無しさん
08/04/16 02:58:35
アホすぎる
424:デフォルトの名無しさん
08/04/16 03:43:19
VC6 ではデフォルトで new が bad_alloc 投げなくて
アクセスバイオレーションになるのは有名な話だけどね。
425:デフォルトの名無しさん
08/04/16 07:17:17
で?何処にVC6だという前提が示されていたの?
426:デフォルトの名無しさん
08/04/16 08:01:17
なんだこの意味不明の質問
427:デフォルトの名無しさん
08/04/16 20:34:00
で、どこにVC6でないという前提が示されていたの?
とでも言ってほしんだろうか
おまえらもっと仲良くしろよ
タダでさえ過疎ってんのに
428:デフォルトの名無しさん
08/04/16 21:03:38
424 は 豆知識としてとらえるのが普通だと思うんだけどな。
419の環境がどうとかじゃなくて。
429:デフォルトの名無しさん
08/04/16 22:01:51
常識人は一人だけ。残りは全員アホ。
そんな微妙すぎるリンクを貼った>>420がまず意味不明。
>>424の内容はもっともだが、VC6世代なら誰でも知ってる常識レベル。
なぜあえてそこだけピックアップして言及したのか意味不明。
何にカチンと来たのか、その後の煽り合いも意味不明。
つまりお前ら全員意味不明。
430:デフォルトの名無しさん
08/04/16 22:17:11
なぜあえて、というところは>>419>>420>>422の「bad_alloc がスローされるんだ♪」
という流れを見ての、ちょっとした老婆心じゃね?
431:デフォルトの名無しさん
08/04/17 00:17:46
>>429
要するに、君は色んなことの意味がことごとくわからない人、なわけだよね。
可哀相だけど、馬鹿につける薬って無いらしいから・・・合掌。
432:デフォルトの名無しさん
08/04/17 02:22:42
おまえら昔はぬるぽ返してたんだよとか
今でもnothrowとかできるんだよとか
ちゃんと教えてやれよ
433:デフォルトの名無しさん
08/04/17 02:28:35
この程度で煽りに見えるとか
434:デフォルトの名無しさん
08/04/17 07:10:34
VC だとぬるぽは VC6 までだね。
だからこそ STL で >>424 が起こる訳だが。
435:デフォルトの名無しさん
08/04/17 07:23:43
>>433
ま、煽りではあると思うよ、実際。
煽りと感じないことをアピールして煽り耐性自慢してもしょうがない。
436:デフォルトの名無しさん
08/04/17 19:15:49
仲良くしようよ。
437:デフォルトの名無しさん
08/04/17 20:11:21
friend関数を
438:デフォルトの名無しさん
08/04/18 11:08:29
窓から
439:デフォルトの名無しさん
08/04/18 11:12:05
こんにちは
440:デフォルトの名無しさん
08/04/18 12:20:53
やあ、おぜうさん
441:デフォルトの名無しさん
08/04/18 18:48:43
まあ、ごきげんやう
442:デフォルトの名無しさん
08/04/20 12:21:42
よひてんきですね
443:デフォルトの名無しさん
08/04/20 12:47:47
庭にはてふてふも飛んでます
444:デフォルトの名無しさん
08/04/22 13:36:50
std::list::erase の引数の型は std::list::const_iterator の方が適切ですよね?
445:デフォルトの名無しさん
08/04/22 13:42:02
なんで?
446:デフォルトの名無しさん
08/04/22 14:58:19
std::list::erase() に渡した反復子の参照先が将来的に変更されることがないからです。
447:デフォルトの名無しさん
08/04/22 15:09:25
constなポインタでもdeleteできるから、
それもある意味整合性があると言える気がする。
448:デフォルトの名無しさん
08/04/22 20:57:09
同じタイプのmapが2つあったときに、
片方のmapにもう片方のmapの要素を全部移動する方法ってありませんか?
swapみたいにコピーしないで済む方法があればいいんですが。
449:デフォルトの名無しさん
08/04/22 23:28:33
swapじゃダメな理由は?
450:デフォルトの名無しさん
08/04/22 23:29:25
joinしたいからswapじゃダメなんじゃね
451:デフォルトの名無しさん
08/04/22 23:38:01
>>449
450さんの言われたとおりです。
限定的にしか使わないクラスをsecondにしてるので
operator=オーバーライドしてコスト下げるしかないかなぁとは思っています。
Boostとかであればそれでもいいんですが。
452:デフォルトの名無しさん
08/04/22 23:39:45
second をポインタにして、
実体はリストに保持しておくとか。
453:デフォルトの名無しさん
08/04/29 01:25:04
STLportのVC9正式対応版はよくれ
454:デフォルトの名無しさん
08/05/05 17:27:47
typedef std::iterator<std::bidirectional_iterator_tag, char> MyIterator;
MyIterator it;
*it = 'A';
これは、何がいけないんでしょうか?
455:デフォルトの名無しさん
08/05/05 17:38:17
int* p;
*p=0;
これのどこがいけないと思いますか?
456:デフォルトの名無しさん
08/05/05 17:44:16
なぜ質問に質問でこたえるのですか?
457:デフォルトの名無しさん
08/05/05 17:58:26
質問に質問で答えてはいけないのですか?
458:側近中の側近 ◆0351148456
08/05/05 18:03:57
>>454
(っ´▽`)っ
itの記憶領域確保しろよ☆
it = new MyIterator('A');
かな?
459:デフォルトの名無しさん
08/05/05 18:11:05
え?
460:デフォルトの名無しさん
08/05/05 18:13:01
>>455>>458
そういう問題じゃないだろ
そもそもstd::iterator<>はインスタンスを作ることを意図したクラスじゃないし、
operator*も定義されてない
461:デフォルトの名無しさん
08/05/05 18:19:39
>>460
いや、阿呆なのは458だけでしょ。
>455の例えはよくわかる。
462:デフォルトの名無しさん
08/05/05 18:23:11
俺にはさっぱり分からん
463:側近中の側近 ◆0351148456
08/05/05 18:23:46
>>461
(っ´▽`)っ
そうだよ。(っ´▽`)っがヴァカなだけだよ
464:側近中の側近 ◆0351148456
08/05/05 18:26:04
(っ´▽`)っ
だってC++よくわからないんだも~ん☆
465:デフォルトの名無しさん
08/05/05 18:26:07
m9('A')
466:デフォルトの名無しさん
08/05/05 19:29:39
>>454
じゃあ、どんな動作を期待しているのか述べてみよう。
467:デフォルトの名無しさん
08/05/05 20:51:15
>>461
胴囲
468:デフォルトの名無しさん
08/05/07 21:58:26
>>455の例えは全然わからんな。
何が言いたいの?
469:デフォルトの名無しさん
08/05/07 22:01:40
何も指してないイテレータを参照剥がししてどうすんだ?
わかりやすくポインタで例えてやろうかあぁ?
470:デフォルトの名無しさん
08/05/08 06:00:33
もし>>469なら、やっぱり的外れだろ
std::iterator<>はそもそもイテレータじゃないんだから
471:デフォルトの名無しさん
08/05/08 07:23:47
ぼくにも分かりやすいようにガンダムで例えてください
472:デフォルトの名無しさん
08/05/08 11:49:01
ガンダムの格納庫はあるのに、
肝心のガンダムがない
473:デフォルトの名無しさん
08/05/08 12:48:04
std::string とかでぬるぽ使えないのはなんで?
474:デフォルトの名無しさん
08/05/08 12:49:07
>>473
どういう動作をさせるためにどうやって使いたいのかわからない。
475:デフォルトの名無しさん
08/05/08 14:19:39
>>474
const char * にNULLを渡すか空文字を渡すかで動作が違う関数があると、
それをstd::stringでラップするときに微妙に困るじゃない。
476:デフォルトの名無しさん
08/05/08 14:36:20
boost::optionalの出番か?
477:デフォルトの名無しさん
08/05/08 15:07:11
>>475
class my_string : public std::string {
bool m_is_null;
public:
my_string() : m_is_null(true) {}
operator=(const char* p) { if (p==NULL) set_null() else set_string(p); }
operator=(const std::string& s) { set_string(s); }
void set_null() { m_is_null = true; clear(); }
void set_string(const std::string& s) { m_is_null = false; *this = s; }
bool is_null() { return m_is_null; }
}
478:デフォルトの名無しさん
08/05/08 19:30:54
>>477
実は同じのを作って使ってるんだ。でもありがとう。
479:デフォルトの名無しさん
08/05/08 19:58:46
Concrete Containerをplubic継承www
480:デフォルトの名無しさん
08/05/08 20:02:34
と笑う人もいるので、抽象化して
template <class T> Nullable : public T
{
...
};
などしておいてはどうだろうか
481:デフォルトの名無しさん
08/05/08 20:14:25
仮想デストラクタのないクラスはpublic継承しちゃだめだろ常識的に考えて・・・
482:デフォルトの名無しさん
08/05/08 20:16:28
delete されるような場面でアップキャストしなけりゃ良いんじゃね?
483:デフォルトの名無しさん
08/05/08 20:16:43
すると笑う人は笑わないのか?
484:デフォルトの名無しさん
08/05/08 20:26:28
結局boost::optional自作になるのか
485:デフォルトの名無しさん
08/05/08 20:42:08
なんで継承したがるんだ
486:デフォルトの名無しさん
08/05/08 21:01:00
楽にかつ安全に特徴を追加する方法って無いのかねぇ…
487:デフォルトの名無しさん
08/05/08 21:33:02
普通にオーバーロードを活用すればいいんじゃね? >486
488:デフォルトの名無しさん
08/05/08 22:14:23
std::string * でいいような…それかboost::optional<std::string>
489:デフォルトの名無しさん
08/05/09 01:12:47
const char *でいいだろ・・・
490:デフォルトの名無しさん
08/05/09 02:04:55
話は逸れるけど、逆にnullが存在し得る参照型Stringを持つJava/C#を触ると、
nullの存在がうっとおしいと思うときがあるから不思議。
491:デフォルトの名無しさん
08/05/09 07:19:30
ぬるぽ
492:デフォルトの名無しさん
08/05/09 08:13:15
>>490
そうそう、無効値としてnullか""のどちらにするか結構悩む。
493:デフォルトの名無しさん
08/05/09 11:55:38
std::iterator は仮想デストラクタないけど public 継承していいんですか?
494:デフォルトの名無しさん
08/05/09 13:04:18
EBOがあるからいいんじゃないか?
495:デフォルトの名無しさん
08/05/09 13:06:26
間違えたw
気にしないで・・・。
496:デフォルトの名無しさん
08/05/09 13:17:01
>>493
typedefしかしてないクラスだから、public継承しないと意味無いと思うけど。
497:デフォルトの名無しさん
08/05/09 15:25:34
このほうが安全じゃない?
class my_iterator : private std::iterator<Tag, Type> {
typedef std::iterator<Tag, Type> super_t;
public:
using super_t::iterator_category;
using super_t::value_type;
using super_t::difference_type;
using super_t::pointer;
using super_t::reference;
};
498:デフォルトの名無しさん
08/05/09 18:20:17
std::iterator や std::unary_function のようなクラスは
protected な非仮想デストラクタが定義されていればいいのに。
499:デフォルトの名無しさん
08/05/09 18:23:23
>>498
自分が何言ってるかわかってるのかw
500:デフォルトの名無しさん
08/05/09 18:53:04
それ自身インスタンス化することないし、基本クラスとして使うこともないし
いいじゃないの?
501:デフォルトの名無しさん
08/05/09 19:07:08
データメンバもメンバ関数もないクラスにアップキャストしても
何もいいこと無いからな
502:デフォルトの名無しさん
08/05/09 19:56:40
マーカインタフェースという概念があってだな。
503:デフォルトの名無しさん
08/05/09 20:22:33
>>499
C++ Coding Standardsの50項目目に紹介されている。
504:デフォルトの名無しさん
08/05/09 20:30:15
URLリンク(www.open-std.org)
で提案している人がいますね。
反論もあるようです。
505:デフォルトの名無しさん
08/05/09 21:04:17
反論の根拠ってなんでしょうか。
506:デフォルトの名無しさん
08/05/09 21:04:56
>>504に書いてある
507:505
08/05/09 21:13:02
そこの部分だけ一回で理解できなかったのですが、理解できました。ありがとう。具体的なケースはよく分かってませんが。
508:デフォルトの名無しさん
08/05/10 02:18:22
URLリンク(www.wakhok.ac.jp)
ここを見て、stringのメンバ関数findの実装が知りたいと思い、
stringファイルの中を検索してみたんですが見つかりません(環境はVC2008EE)。
find関数は廃止されちゃったんですか?
509:デフォルトの名無しさん
08/05/10 02:27:12
VC++ならコードを書いて、右クリックの定義へ移動が便利。
510:508
08/05/10 02:36:53
thx
xstringファイルに定義されていました。
インクルードの経路が複雑・・・。
511:デフォルトの名無しさん
08/05/10 11:21:32
>>482
>ほとんどの台は左第一停止で引き込み100%だったっしょ。(チェリーバーは順押しで引き込み100%)
いや、だから「すげー細かい」ってことだったんで・・・
スーパーヘビーメタルについては「リプor緑/リプ/リプ」がJacInなんで引き込み100%かと・・・
URLリンク(www.pachinko-club.com)
ミラクルUFOに関してはわからず・・・
>初BET枚数の異なる2種類ボーナス △ デビルメイクライ3 ロデオ 4種類REGの内、1つが1枚、他は2枚
リオパラダイスがBIG/REGでBET枚数違ったような・・・(リオが3月でDMCが6月)
512:デフォルトの名無しさん
08/05/10 12:34:56
業界初スレか。珍しい誤爆だなあ。
513:デフォルトの名無しさん
08/05/10 15:50:42
ごめんなさいorz
514:デフォルトの名無しさん
08/05/10 19:18:19
やっべ何言ってるかさっぱり分からんw
うちらも外から見たら同じなんだろうけど
515:デフォルトの名無しさん
08/05/10 22:31:28
>>514
> うちらも外から見たら同じなんだろうけど
むかしガイドライン板に「一度も行ったことない板に行ってみるスレ」ってのがあって、
この板を覗いた奴の感想は「わけわからん。半分ぐらい日本語じゃない」だったなw
516:デフォルトの名無しさん
08/05/10 23:07:22
マジでまったくわからんなw
まぁ、俺はこの板の内容も半分以上わからんが
517:デフォルトの名無しさん
08/05/11 02:54:05
そういわれるといかにも初心者丸出しな質問でさえ高度に見えてくるぜ
518:デフォルトの名無しさん
08/05/13 01:01:43
す、すいません・・・
STLをかじり始めの者なのですが、質問があります。
std::ofstreamだのstd::wofstreamだのをいじってみたのですが、
どうしてもユニコードでファイル出力ができません。
std::setlocale("japanese")とやってみると、どうやらshift-jisの
テキストが出力されてしまうみたいなんですが・・・。
STLを利用してユニコードのテキストファイルを出力するには
どうすればいいのでしょうか?よろしくお願いします。
ちなみにVC9を使用しております。
519:デフォルトの名無しさん
08/05/13 01:28:34
>>518
ストリームをテキストモードで開いているとUnicodeからANSIへの変換が暗黙のうちに行われます。
バイナリモードで開くとこの変換は行われません。
520:デフォルトの名無しさん
08/05/13 02:03:53
wchar_tはUTF-16だったりUTF-32だったり処理系定義だということに注意。
521:デフォルトの名無しさん
08/05/13 02:08:04
>>518
VC限定ならpubsetbufで大丈夫なはず。
URLリンク(msdn.microsoft.com)
ただしVCのバージョンによっても挙動が違ったはず。
binaryでも大丈夫になったのかな?
最終手段としてはwchar_t*をchar*に無理やりキャストして書き込むとか。
522:518
08/05/13 03:33:12
>>519
>>520
>>521
のみなさん、返答ありがとうございました。バイナリで書き込まない
といけなかったのですね・・・。>>521さんの貼り付けてくれたサンプル
コードでなんとか分かりました。やっとUTF-16のテキストファイルを
作成することができました。ありがとうございました。
523:デフォルトの名無しさん
08/05/13 08:40:07
C#とかの.NET系なら、UTF-16,UTF-8,UTF-32,Shift_JIS,ISO-8859-x,Windows-xxxやら、
システムがサポートする文字コード全て、パラメータ指定するだけで出力出来るんだけどね。
524:デフォルトの名無しさん
08/05/13 08:57:05
つlibiconv
525:デフォルトの名無しさん
08/05/13 15:10:11
つICU
526:デフォルトの名無しさん
08/05/13 15:18:48
つmlang
527:523
08/05/13 18:58:21
C#とかの.NETなら、標準ライブラリのみで、普段入出力に使用しているクラスに
パラメータとして文字コードを追加していするだけでいいんだけどね。
528:デフォルトの名無しさん
08/05/13 19:13:27
それだけの理由でC#を使えるようならとっくに使っているわ。
529:518
08/05/15 21:06:15
す、すいません・・・
その後、いろいろと読み漁ってみた結果、上記のままの理解では、
このスレを読んでいる、同じ疑問を持った人に、無用な誤解を与える
恐れがあるかも知れないので、分かったことを書いておきます。
std::fstreamなどのストリームの文字コードの自動変換は
std::localeクラスの中にあるファセット(文字セット間の変換、通貨、日付と時刻
などの地域化を司るクラス)と呼ばれる部分で行っているらしいです。
で、文字コード変換を司るファセットはcodecvtと呼ばれており、自分の望んだ
文字コードに変換したい場合は、codecvtの派生クラスを作成するのが、
本来のやり方のようです。で、こんなもんを自分で書くのがよいのか、それとも
既に誰かが書いていて、それを利用できるようになっているのか、というところ
までは、まだよく分かっていません。
URLリンク(imt.uni-paderborn.de)
URLリンク(d.hatena.ne.jp)
URLリンク(docs.sun.com)
大変お騒がせしました。これにて失礼します・・・。
530:デフォルトの名無しさん
08/05/15 23:15:51
Boost.IostreamsがUTF-8のcodecvtを持っていたはず。
一般のライブラリでの実装と言えばそれくらいしか知らないけど。
531:デフォルトの名無しさん
08/05/21 21:31:09
唐突で申し訳ありませんが、以下、2点質問させてください。
ご意見で結構なので、よろしくお願いします。
①eraseで、listから登録しているクラスのポインタを削除した場合に、
→リストから削除したクラスのデストラクタはコールされる?
リストから要素のみ削除されると理解していたのですが、
VC6.0のSTLのドキュメントを読んだところ、
N回のeraseでN回のデストラクタが呼ばれると書いてあったため困惑中。
②マルチスレッドアプリでコンテナなどを用いるのは危険?(VC6.0を想定)
→MSDNにて、eraseを複数のスレッドから同時に実行するとデッドロックする
という記載等があったため、少なくともVC6.0のSTLは
マルチスレッドアプリを作る上で適当でないと思い始めている段階。
実際、beginなどの引数なし関数コール時にアプリが落ちた経緯あり
532:デフォルトの名無しさん
08/05/21 21:37:54
「listから登録しているクラスのポインタを削除」の意味がワカラン
こういう日本語もワカル人がいるので不思議
そういう人を待て
533:デフォルトの名無しさん
08/05/21 21:41:21
std::list<T>なら、eraseしたときに該当するオブジェクトのデストラクタが呼ばれる。
std::list<T*>なら、該当するオブジェクトとはlistの要素たるT*のオブジェクトであり、
T自体のデストラクタは呼ばれない。
Tオブジェクトのデストラクタが呼ばれるようにしたければ、
boost::shared_ptrでも使えというのがC++の現状。
534:デフォルトの名無しさん
08/05/21 21:42:41
>>531
1. について
ポインタ要素を erase してもデストラクタは呼ばれません。
実体を格納している場合には erase でデストラクタが呼ばれます。
2. について
読み取り専用なら安全です。更新があるなら、明示的に排他制御
しましょう。
535:デフォルトの名無しさん
08/05/22 00:29:50
>>533 534
回答ありがとうございます。
概ね、当方の理解と一致しており、胸を撫で下ろしました。
質問事項②のマルチスレッドでの使用に関しては、
別スレッドでswap/uniqeなどで
iterator iの参照先の内容が変わることを考慮すると、
begin等も容易には使えないですね。
ちなみに、今、他人のソースをレビュー中でして、
人のソースを見ていると、自分の理解が正しいのかどうか
ちょっと不安になってきたりと・・・oTL
536:デフォルトの名無しさん
08/05/22 01:10:30
>>535
unique後はそもそもイテレータが無効になるから、マルチスレッド以前の問題だね。
537:デフォルトの名無しさん
08/05/22 01:33:51
>>535
スレッド安全性については規格では何も規定していないから、実装ごとにドキュメントを
読む必要がある。ドキュメントに記載がなければ、同時アクセスは一切できないものと
考えたほうがいい。そういう実装もあるので、最大限の移植性が必要なら同時アクセスは
一切できないものと考えるべき。
538:デフォルトの名無しさん
08/05/22 12:03:22
Intel謹製のスレッドセーフSTLがあったような・・・
あとポインタ格納しつつeraseしてもデストラクトする実装ならboost::ptr_listってのがある
539:デフォルトの名無しさん
08/05/22 20:39:50
>>537
自分もそうおもふ
540:デフォルトの名無しさん
08/05/22 21:56:49
VC 7.1以降だと文書化されている。
URLリンク(msdn.microsoft.com)
あるオブジェクトについて、同時読取り可、単一スレッドの書込み可。
同時書込みや読み書き同時は不可。
スレッドごとに別のオブジェクトを読み書きするのは問題ない。
例外的にストリーム出力は同時書込み可。
541:デフォルトの名無しさん
08/05/22 22:19:18
テンプレートライブラリはクラスのマクロみたいなもんですよね?
コンパイル時に全部展開されるので多用する場合はメモリを無駄に消費しそうなんですが、
比較的大規模なアプリを作るときは、やはりコンパイル済みのライブラリを使うべきなんでしょうか?
例えばMFCとSTLはどのように使い分けるのが賢いんでしょうか。
542:デフォルトの名無しさん
08/05/22 22:48:06
同じテンプレートを同じ型で別の場所でインスタンス化した場合はリンカが重複を除去する場合が多い
なので、規模が大きくなるほどテンプレートのオーバーヘッドの割合は減少すると思う
MFCとSTLでは重複するのはコンテナくらい
コンテナはSTLの方が大分出来が良いので、基本的にコンテナはSTLのを使えば良いと思う
MFCにべったり近い処理をするときなどは専用のコンテナが使いやすいこともあるかもしれない
結局はケースバイケースかな
543:デフォルトの名無しさん
08/05/22 23:08:54
>リンカが重複を除去する場合が多い
重複除去は仕様。必ず行われる。
544:デフォルトの名無しさん
08/05/22 23:22:41
重複除去しないとstatic変数のユニーク性が保証されなくなる。
545:デフォルトの名無しさん
08/05/23 06:04:20
>>541
例えば CODE セグメントとか .text セクションが 10 倍になって困るのか?
一割り増しでも困るなら、使うのをやめというたほうがいいだろう。
なんというか、なんでもいいから毎月雑誌読もう。二年もするとだいぶ変わる。
546:デフォルトの名無しさん
08/05/23 07:27:13
コピペ思い出した
547:デフォルトの名無しさん
08/05/23 12:17:37
boostで重いやつ(regex、spiritなど)を多用するとメモリ不足になる(VC++なら/Zm指定要求してくる)
さらに酷いとコンパイラやリンカが落ちる。
STLレベルならそこまでのことにはならないが、テンプレートの副作用だな。
548:デフォルトの名無しさん
08/05/23 12:21:04
lambdaなんか使うとtypoが原因でコンパイラが落ちるからなw
549:デフォルトの名無しさん
08/05/23 23:25:01
それはメモリ不足とは別。
550:デフォルトの名無しさん
08/05/24 09:26:13
vectorって単なる動的配列として使ってもOKですか?
たとえば、こんな風にバッファとして直接vectorに値を書き込むのはvectorの使い方として適切?
std::vector<char> TestV;
TestV.resize(MAX_PATH);
::GetCurrentDirectory(TestV.size(),&(TestV[0]));
std::cout<<&(TestV[0])<<"\n";
551:デフォルトの名無しさん
08/05/24 09:27:32
なぜstringを使わない?
552:デフォルトの名無しさん
08/05/24 09:43:05
>>550
vectorの内部バッファの連続性は規格で保証されているのでok
>>551
現時点ではstringの内部バッファの連続性は保証されてなかった気がする。
553:デフォルトの名無しさん
08/05/24 09:44:54
別に連続性云々じゃなくて……
まあいいや。
554:デフォルトの名無しさん
08/05/24 09:54:28
文字配列でない配列にstringを使う方が頭おかしいだろ
そんなコードさわりたくねえ
555:デフォルトの名無しさん
08/05/24 09:57:50
vector<char>って書いて有るじゃん
556:デフォルトの名無しさん
08/05/24 10:24:53
std::string str=string(&(TestV[0]));
std::cout<<str<<std::endl;
とでも書かないと満足できない人なんだよ、きっと。
557:デフォルトの名無しさん
08/05/24 17:11:20
>>553
「まぁいい」って、>>551を書いた根拠がまさにそれで、
立場が無くなって言葉濁してるだけでしょ?w
558:デフォルトの名無しさん
08/05/24 18:17:31
も前らおちつくんだ
559:デフォルトの名無しさん
08/05/24 18:31:26
&(TestV[0])でポインタ得るのはどうよ
560:デフォルトの名無しさん
08/05/24 18:39:25
&TestV[0]
561:デフォルトの名無しさん
08/05/24 20:31:27
&*TestV.begin() ならマジックナンバーが現れなくていい
とか言いたいのかな
562:デフォルトの名無しさん
08/05/24 21:31:08
vector::data()はまだ規格に入ってないんだっけ?
563:デフォルトの名無しさん
08/05/24 22:13:29
>>562
C++0x
564:デフォルトの名無しさん
08/05/25 23:33:58
自分用のライブラリで、
2箇所でSTLを取り入れただけで、.libのファイルサイズが3倍になったんだけど
テンプレート導入でサイズ急膨張って常識なんすか?
565:デフォルトの名無しさん
08/05/26 00:08:32
:テンプレートは結局、自動的にコードを生成する機能といえるのでうまく使わないと予想外にコードが大きくなる。
566:デフォルトの名無しさん
08/05/26 00:27:48
STLを使うとコードが10倍に?
567:デフォルトの名無しさん
08/05/26 00:28:44
>>564
デバッグ情報じゃねーの?
568:デフォルトの名無しさん
08/05/26 02:42:07
元のライブラリが10KByteで30KByteになったとかだったら驚かない。
3MByteが9MByteになったとかだったら、なにやったんだよと思う。
569:デフォルトの名無しさん
08/05/26 02:46:15
シンボル情報削れば大したことにならんと思うが
570:デフォルトの名無しさん
08/05/26 10:31:54
OSもコンパイラもそれらのバージョンも言わずに3倍とな!?
571:デフォルトの名無しさん
08/05/26 12:38:03
コンパイラはg++です
572:デフォルトの名無しさん
08/05/26 12:50:12
VC++でexpressive入れた途端に未最適化コードとmapファイルが1MB増えた覚えはある
573:デフォルトの名無しさん
08/05/27 21:44:52
>>561
そこは &TestV.front() だろ・・・常考。
574:デフォルトの名無しさん
08/05/28 02:04:01
STLスレだけにテンプレ通りの話をしてるのですね
575:デフォルトの名無しさん
08/05/28 22:48:49
template<class T>
class ListEx
{
list<T> m_list;
list<T>::iterator m_itr;
};
iterator の行でエラーになります。
何がいけないのでしょうか?
576:デフォルトの名無しさん
08/05/28 22:52:47
typename list<T>::iterator m_iter;
577:デフォルトの名無しさん
08/05/28 22:57:16
>>576
ありがとうございます
エラーは出なくなりました。
でも、 typename がなぜ必要なのかわかりません。
どこを調べたらいいのでしょうか?
578:デフォルトの名無しさん
08/05/28 23:14:34
>>577
一度、Effective STLを読んでおいた方がいいんじゃないか?
579:デフォルトの名無しさん
08/05/28 23:20:22
>>577
URLリンク(www.google.com)
580:デフォルトの名無しさん
08/05/28 23:22:34
型なのかメンバ変数なのかハッキリしろコラァ!
とコンパイラが怒るから
581:デフォルトの名無しさん
08/05/29 10:23:16
この文脈では list<T>::iterator のTは型に決まってるだろ、と小1時間ほど問い詰めてやりたい
582:デフォルトの名無しさん
08/05/29 10:31:12
Tじゃなくて、iteratorが型かどうかわからない。
583:デフォルトの名無しさん
08/05/29 11:24:32
template<typename T> struct list{ enum{ iterator = 0 }; };
だったらlist<T>::iteratorをする時にはtypenameの代わりに何が必要なのか
584:デフォルトの名無しさん
08/05/29 12:45:15
>>583
何もいらない。
typenameがないときは、暗黙のうちに値として扱われるよ。例外もあるけど。
585:デフォルトの名無しさん
08/05/29 12:50:33
>>581
実際VC++だとtypename無くても通るっぽい?
賢いというよりテンプレート宣言を読むときは「あーはいはい」って感じで
実際に型当てはめてからチェック開始してるのかね
586:デフォルトの名無しさん
08/05/29 19:36:19
>>582
なるほど、
typename list<T>::iterator m_iter;
は list<T>::iterator がタイプ名だとコンパイラに教えているのか
やっと納得できた
587:デフォルトの名無しさん
08/05/30 01:04:10
C++続けるつもりなら読むべきものをまず読んどけ
588:デフォルトの名無しさん
08/05/30 02:06:07
SICPですね、わかります
589:デフォルトの名無しさん
08/05/30 02:43:43
SICPとはまた時代遅れの物を
590:デフォルトの名無しさん
08/05/30 22:33:28
TR1のお勧め参考書おしえてくれ
591:デフォルトの名無しさん
08/05/30 22:40:10
>>590
つTechnical Report 1
592:デフォルトの名無しさん
08/05/31 01:30:22
ちょっと質問です。
STL辺りに「テーブルクラス」なんてありますか?
イメージとしては、データベースのテーブルをオブジェクトとして扱うクラスです。
result = DBDATA.summary(var1) ;
こんな感じです。
593:デフォルトの名無しさん
08/05/31 02:36:59
>>590
EffectiveC++の第三版はtr1にちょっと触れてる
594:デフォルトの名無しさん
08/05/31 07:56:28
>>592
イメージとしては、データベースのテーブルをオブジェクトとして扱う
クラスはない感じです。
595:デフォルトの名無しさん
08/05/31 12:12:08
>>592
STLだけでやるなら、連想系コンテナとアルゴリズムを組み合わせる感じかね。
596:デフォルトの名無しさん
08/05/31 12:19:01
>>590
とりあえずboost本買ってみるのは
597:デフォルトの名無しさん
08/05/31 14:49:33
>>592
where句が限定されているならmapでいいんじゃないの?
っていうかDB的に使うなら普通にsqliteでも使った方が無難だよ。
598:デフォルトの名無しさん
08/05/31 15:20:14
O/Rマッパーが欲しいんじゃね
DataSetとか
599:デフォルトの名無しさん
08/06/03 22:37:03
mapは、要素の追加または削除を行ってもそれ以外の要素の参照は保たれたままな事が保証されていますか?
600:デフォルトの名無しさん
08/06/03 22:38:01
追記です。要素への参照の他に、キーのについても同じ事が言えますか?
601:デフォルトの名無しさん
08/06/03 22:40:26
自己解決しました。ありがとうございました。
602:デフォルトの名無しさん
08/06/03 23:09:11
死ね
603:デフォルトの名無しさん
08/06/03 23:43:37
死ねっていう奴と
死ねって言われた奴は
死ねばいいのに
604:デフォルトの名無しさん
08/06/03 23:59:17
そして伝説へ・・・
605:デフォルトの名無しさん
08/06/04 00:06:56
死んでもそれ以外の人の参照は保たれたままな事が保証されていますか?
606:デフォルトの名無しさん
08/06/04 01:00:47
死して屍拾う者なし、ってメモリリークのことですか?
607:デフォルトの名無しさん
08/06/04 08:44:19
GC「骨くらいは拾っておいてやるよ」
608:デフォルトの名無しさん
08/06/04 08:45:30
デストラクタ「生ける者の為の卒塔婆」
609:デフォルトの名無しさん
08/06/04 13:11:39
std::mapのイテレータに順ずるものから、木構造の右部分木、左部分木をそれぞれ取得して
木を追跡したいんですが、そういうことは可能でしょうか?
610:デフォルトの名無しさん
08/06/04 13:13:10
赤黒木使ってたら左部分木と右部分木だけとは限らないよ
アルゴリズムの本読んでみ
611:デフォルトの名無しさん
08/06/04 13:17:24
>>609
std::map が木で実装されているとは限らないので、そういう操作は無い。
木の追跡(?)自体がやりたいわけじゃないと思うんだけど、結局のところ何がしたいの?
612:デフォルトの名無しさん
08/06/04 13:26:33
>>611
upper/lower_boundで解決しました。
613:デフォルトの名無しさん
08/06/04 13:36:39
やっぱり解決しませんでした。もういいです諦めます。STL死ね。
614:デフォルトの名無しさん
08/06/04 13:41:17
お前が死ね
615:デフォルトの名無しさん
08/06/04 14:21:17
すぐファビョる所を見ると朝鮮人か
616:デフォルトの名無しさん
08/06/04 14:23:03
私が死ぬのであなた達は死ななくてもよいのです
617:デフォルトの名無しさん
08/06/04 15:05:12
STLは生き物ではないので死ぬことはできません
618:デフォルトの名無しさん
08/06/04 15:18:03
私のお墓の前で泣かないでください
619:デフォルトの名無しさん
08/06/04 15:46:50
STLの考え方に頭が付いていかない所を見ると
頭が悪いかジジイかのどちらかだろう
620:デフォルトの名無しさん
08/06/04 16:07:29
お尋ねします。
vector<vector<bool>> TempA;
vector<vector<bool>>::iterator itr1;
vector<vector<bool>>::iterator itr2;
と宣言したとします。
itr1 = TempA.begin();
itr2 = TempA.begin();
としたのち、
TempAのたとえば2行目と3行目の中身すべてを比較したいとき、
itr1++;itr2 += 2;としてiteratorを進めて、
*itr1 == *itr2の比較を一度行えばいいのでしょうか?
それとも、各行でiteratorを作成して、
各行ベクトルの列座標に対応したiteratorを回す必要がありますか?
p.s.この動作のあと、一致している行を、
itr2=Temp.erase(itr2);
みたいに削除したいのです。
621:デフォルトの名無しさん
08/06/04 16:34:38
>>620
要するに二つのvectorを==で比較できるかってことだよな
できるよ
622:デフォルトの名無しさん
08/06/04 16:46:22
>>621
ありがとうございます。
行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。
623:デフォルトの名無しさん
08/06/04 18:17:13
そう。要素ごとに==で比較してる
624:デフォルトの名無しさん
08/06/04 18:19:40
>>622
23.1 Container requirements に
a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin())
と等価と書いてある。
625:デフォルトの名無しさん
08/06/04 22:12:31
>613
map使わずにソート済vector使えばいいんじゃね?
626:620
08/06/05 10:43:24
>>623
亀レス申し訳ない。
ありがとうございました。
そういう情報ってどのヘッダーを見ればいいんでしょうか?
vector.hを眺めていてもさっぱりです…。
627:デフォルトの名無しさん
08/06/05 11:34:56
>>626
ヘッダーには書いてないだろう・・・
お使いのコンパイラのリファレンスマニュアル等を読め
VCならこのへん↓
URLリンク(msdn.microsoft.com)(VS.80).aspx
628:デフォルトの名無しさん
08/06/05 13:25:16
>>626
C++の規格書一回読んでみるのもいい。
629:デフォルトの名無しさん
08/06/05 20:20:37
vectorかその内部でincludeしてるファイルに書いてあるんじゃね。実装が。
630:デフォルトの名無しさん
08/06/06 10:17:16
イテレータを返すbegin, endが、どうして戻り値の型が違うだけで(iterator, const_iterator)オーバーロードされた関数を特定できるのかが分かりません。
自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。
631:デフォルトの名無しさん
08/06/06 10:22:06
>>630
戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。
632:デフォルトの名無しさん
08/06/06 10:36:05
>>631
それは実装側のbegin, endの定義ですよね?
自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、
これは利用する側が呼び出すときには特に関係ない様です。
まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)();
なんてしなきゃいけないんですか?
633:デフォルトの名無しさん
08/06/06 11:24:47
iteratorからconst_iteratorへの変換はできるようになってる?
634:デフォルトの名無しさん
08/06/06 11:27:59
変換できるようにしたら const_iterator begin() const の必要性なくならないか?
635:デフォルトの名無しさん
08/06/06 11:31:44
なんで?
constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん
636:デフォルトの名無しさん
08/06/06 12:59:04
VC7
template<class _Ty,class _Alloc>
class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>
637:デフォルトの名無しさん
08/06/06 19:44:07
>>636
補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。
constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。
begin()の戻り値を渡す先がconst_iteratorかiteratorかで、
begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。
638:デフォルトの名無しさん
08/06/06 22:14:29
>>632
MyContainer c = ...
MyContainer const& cc = ...
MyContainer::const_iterator = c.begin();
MyContainer::const_iterator = cc.begin();
これをトレースするといいよ。
639:デフォルトの名無しさん
08/06/07 00:30:21
なるほど、constなメンバ関数はオブジェクトがconstな時に使用されるんですね。
640:デフォルトの名無しさん
08/06/07 13:26:16
constメンバ関数と非constメンバ関数が両方ともある場合はそうなる。
非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。
641:デフォルトの名無しさん
08/06/13 20:31:07
\n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが
string って \n とかとは別に改行とかタブコードがあるんでしょうか?
642:デフォルトの名無しさん
08/06/13 20:40:55
実際のコード貼ってみれ
643:641
08/06/13 21:37:36
あははははは!!!!!
エディットコントロールのマルチラインがFalseなだけだった
俺市ねw
644:デフォルトの名無しさん
08/06/13 22:13:13
641は死んだの?
645:デフォルトの名無しさん
08/06/13 22:49:25
>>644
今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。
646:デフォルトの名無しさん
08/06/14 12:34:34
>>645が良い事言った
647:デフォルトの名無しさん
08/06/14 15:25:44
フェニックスシングルトンなわけですね。
648:デフォルトの名無しさん
08/06/14 15:30:12
シングルトンを真面目に考えるとややこしい事限りないなあ。
649:デフォルトの名無しさん
08/06/14 15:31:25
非常に優秀なデザインパターンの1つだと思うな
650:デフォルトの名無しさん
08/06/14 15:36:29
インスタンスの数が1個に限定される分、むしろ単純にならないか?
651:デフォルトの名無しさん
08/06/14 15:39:16
Modern C++ Design を読むと
シングルトンのややこしさがよく分かる。
Scala みたいに言語的にサポートしてくれればいいんだが。
652:デフォルトの名無しさん
08/06/14 15:48:11
作るのはいいけど削除のタイミングが面倒くさいんだよね。
653:デフォルトの名無しさん
08/06/14 15:53:21
いつでもnewdelete出来るように改良した、って自慢げに変なシングルトン使いまくる奴ならいたな
654:デフォルトの名無しさん
08/06/14 15:58:26
deleteしたら自動的に新しいインスタンスが作られて、
newしたら自動的に今あるインスタンスが削除されるシングルトン
655:デフォルトの名無しさん
08/06/14 16:51:25
>言語的にサポート
使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。
656:デフォルトの名無しさん
08/06/14 16:59:25
シングルトンて心太に似てるよね
657:デフォルトの名無しさん
08/06/14 18:36:28
STLを軽く弄るためにこのスレを覗きにくるC++ビギナーはフェニックスシングルトンとModernC++Designをどうやって関連付けて考えるだろうか。
658:デフォルトの名無しさん
08/06/14 18:37:22
「スレ違い」 と関連づけて考える事だろう
659:デフォルトの名無しさん
08/06/14 19:42:54
mapはどうやってfindなどで入力されたキーが木にあるキーと同じかどうかを見るんでしょうか?
比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、
これと同じ様に一致関数をテンプレート引数で指定できませんか?
660:デフォルトの名無しさん
08/06/14 19:45:23
比較関数をltとすると、
!lt(x, y) && !lt(y, x)
で一致判定してる
661:デフォルトの名無しさん
08/06/14 19:46:43
マップのキーは、その比較関数を使って一致を判断する
!(a < b) && !(b < a) なら a と b は一致していることになる
662:デフォルトの名無しさん
08/06/14 20:12:24
そして等価と等値の話が始まる。
663:デフォルトの名無しさん
08/06/14 22:07:44
重要な概念だしな
664:デフォルトの名無しさん
08/06/15 09:53:59
そしてEffective STL が売れる
665:デフォルトの名無しさん
08/06/15 10:08:08
そして日本語版Modern C++ Designが叩かれる。
666:デフォルトの名無しさん
08/06/15 15:05:30
ListとかVectorってスレッドセーフですか?
複数のスレッドからイテレータ取得してアクセスしたりするなら
シグナルやミューテクスでロックしてからアクセスするべきですか?
667:デフォルトの名無しさん
08/06/15 15:10:46
そうですね。
668:デフォルトの名無しさん
08/06/15 15:16:56
>>666
実装次第。
各処理系のマニュアルを読むよう。
669:デフォルトの名無しさん
08/06/15 15:29:14
STLportでぐぐらない方が良い。
670:デフォルトの名無しさん
08/06/17 20:02:10
スレッドセーフなのか?という問いに答える者はいなかったといふ
671:デフォルトの名無しさん
08/06/17 20:04:49
実装次第だし。
672:デフォルトの名無しさん
08/06/17 20:09:48
スレッドセーフではない と一律で答えておいたほうが面倒がない
673:デフォルトの名無しさん
08/06/17 21:24:55
Camelなリストやベクタはスレチ。
674:デフォルトの名無しさん
08/06/17 21:43:27
というか、「スレッド」の概念が標準C++にあるんだっけ?
675:デフォルトの名無しさん
08/06/17 21:54:49
ございません
676:デフォルトの名無しさん
08/06/17 22:07:35
スレッドの概念が無いから「スレッドセーフでない」という概念も無い。
677:デフォルトの名無しさん
08/06/17 22:15:17
C++0xにご期待下さい
678:デフォルトの名無しさん
08/06/18 02:26:33
>>670 >>531-540
679:デフォルトの名無しさん
08/06/18 22:08:47
コンテナの範囲外にイテレータがインクメントされてしまってもコンテナを自動で拡張し、
あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど
実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。
680:デフォルトの名無しさん
08/06/18 22:22:49
insert_iteratorのことを言ってるのかな。
681:デフォルトの名無しさん
08/06/18 22:35:13
自己解決もしたし意味不明な書き込みなんてみんな無視してくれるだろうと思っていたら教えてくれている人が居た。
ありがとう。
682:デフォルトの名無しさん
08/06/20 15:05:13
std::vector<std::string> v1;
みたいなインスタンスをシリアライズ化したいんですけど、単純に
FILE *fp = fopen("vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);
みたいに書き込めば良いんですかね?
そして戻すときは、逆に
std::vector<std::string> v1;
char* buf = (char*)&v1;
FILE *fp = fopen("vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);
みたいな感じでいいんですかね?
STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。
683:デフォルトの名無しさん
08/06/20 15:33:55
vectorの内部にはポインタも含まれるから
オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう
684:デフォルトの名無しさん
08/06/20 15:38:38
vectorの扱う型ががフリーストアを使ってないという保証があればあるいは
685:デフォルトの名無しさん
08/06/20 15:46:36
boost::serialization使うって手も <あまり使いやすくは無い
686:デフォルトの名無しさん
08/06/20 16:45:27
VS2005では一応下のコードは正常に動きました。
とりあえずこれが動けば十分です。
std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);
std::vector<std::string> v2;
char* buf = (char*)&v2;
fopen_s(&fp, "vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);
687:デフォルトの名無しさん
08/06/20 16:53:25
>>686
まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。
終了時に2重解放でエラーになってないか?
688:デフォルトの名無しさん
08/06/20 16:54:48
と思ったら、デストラクタで怒られました。
何がいけないんだろう・・・
689:デフォルトの名無しさん
08/06/20 16:58:00
上の人も書いてるけどvectorは内部にポインタを持ってるんだってば。
(ついでにstringもな)
fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、
ポイント先は保存されないんだよ。
690:デフォルトの名無しさん
08/06/20 17:00:54
>>687,689
どうすればいいでしょうか。
やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、
それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、
初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。
691:デフォルトの名無しさん
08/06/20 17:04:45
vector使わずに配列を使えばいいんでしょうが、vectorのデータをシリアライズ化するということは
ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。
ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。
そこまでするなら配列でやります。
692:デフォルトの名無しさん
08/06/20 17:10:08
自分の力量・理解度に応じた実装をするべし
693:デフォルトの名無しさん
08/06/20 17:11:11
最低限のデータを保存したい場合はこうじゃない?
std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
const char *pstr;
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
for(size_t c=0, e=v1.size(); c < e; c++) {
pstr = v1[c].c_str();
fwrite(pstr, strlen(pstr), 1, fp);
}
fclose(fp);
694:デフォルトの名無しさん
08/06/20 17:21:42
stringのサイズ保存してなかったので訂正
書き込み
std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
size_t size;
for(size_t c=0, e=v1.size(); c < e; c++) {
size = v1[c].size();
fwite(&size, sizeof(size), 1, fp);
fwrite(v1[c].c_str(), size, 1, fp);
}
fclose(fp);
695:デフォルトの名無しさん
08/06/20 17:28:10
読み込み
std::vector<std::string> v2;
FILE *fp;
fopen_s(&fp, "vec.bin", "rb");
size_t size;
fread(&size, sizeof(size), 1, fp);
v2.resize(size);
for(size_t c=0, e=size; c < e; c++) {
fread(&size, sizeof(size), 1, fp);
v2[c].resize(size);
fread(&v2[c][0], size, 1, fp);
//stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が
//あるが、vcなら問題ないので省略
}
fclose(fp);
696:デフォルトの名無しさん
08/06/20 17:33:26
最初にもちらっと書いたが、serialization使うとこれですむ
//保存
{
vector<string> data;
data.push_back("Hello");
data.push_back("World");
ofstream file("save.dat");
boost::archive::text_oarchive oa(file);
oa << (const vector<string>&) data;
}
// 復元
{
vector<string> data;
ifstream file("save.dat");
boost::archive::text_iarchive ia(file);
ia >> data;
}
下準備がちょっと面倒だけどな。
興味あったら下記を参照してください。
URLリンク(www.kmonos.net)
697:デフォルトの名無しさん
08/06/20 17:48:04
>>694,695
やっぱり要素ごとにサイズと一緒に保存という形しかないんでしょうか。
私のイメージではシリアライズというと、メモリ上にあるオブジェクトの塊を
そのままバイナリで一気に書き込むという感じで、だからこそ高速化に役立つと思うのです。
要素ごとに書き込んでいると、カンマ区切りのケースとそれほど時間の差が出ないような・・・
MFCのCObjectを継承したクラスはシリアライズができますが、それはおそらく、
オブジェクトのデータやステートをメモリ空間上で一塊になるようにしている配置しているからこそ
できるんじゃないかと思います。
STLではどうもそういう仕組みはないようなので、保存や復元に時間がかかるのは無理ないんでしょうかね。。。
>>696
boostの場合はどうなんでしょうか。
保存と復元を高速化できるかどうかがキモなんです。
698:デフォルトの名無しさん
08/06/20 17:55:59
>>690
カンマ区切りの文字列の読み込みに、そんなに時間がかかるとは思えんが。
時間がかかっているのはパースよりもvectorの伸張だろう。
先にカンマの数をカウントしてvector.reserve()するとか、vectorではなくて
dequeにするとかの方が速くなるかと。
699:デフォルトの名無しさん
08/06/20 18:06:48
>>697
MFCのシリアライズは、各メンバをひとつずつCArchiveに書き込んでたと思うよ
CObjectを継承すれば自動的にサポートされるものでもなく、メンバをひとつずつ書き込むコードを各クラスに個別に実装する必要があった
シリアライズに対するそのイメージは誤りかと
700:デフォルトの名無しさん
08/06/20 18:31:32
データ個数にもよるが保存と読み込み時間を短縮したいなら
まずデータ構造自体から見直すべきだろ。
というか、そこがネックになってる時点で何かが間違ってる。
701:デフォルトの名無しさん
08/06/20 18:44:43
>>699,700
そうなんですか。
可変長データ配列のオブジェクトの保存と復元を高速化するためには、
各自が工夫して実装するしかないんですかね。
なんか車輪の再発明のような気が・・・
配列要素の変更・追加・削除は頻繁にはやらないので、そちらの時間コストは多少増えてもいいんです。
とにかくソフトの起動をコンマ1秒でも速くするために、ドカンと一気に読み込めるようにしたいんですよね。
BYTE型配列1本と、ポインタ・サイズを格納した配列の計2本で、
そういったことをやれそうなイメージはあります。
702:デフォルトの名無しさん
08/06/20 18:45:42
vector<string>が固定長なデータじゃないので、要素ごとにアクセス
しなければならないのは仕方が無い。
また、上の例でも1文字ずつカンマをチェックしながらアクセスするよりは、
単純に数倍は速いよ。
ディスクアクセスが気になってるのなら、あらかじめメモリ上に
直列化して、総サイズも一緒に書き込むとか工夫しなさい。
(もともとfread、writeがバッファリングしてるので、あまり効果は無いだろうけど)
あとboostのも1要素ごとの読み書きです。
入れ子になってるコンテナの巡回探査がデフォで出来るってだけ。
703:デフォルトの名無しさん
08/06/20 20:42:53
ほんとに直列の読み書きがしたければAPI叩くしかないんじゃないかなあ
704:デフォルトの名無しさん
08/06/20 20:59:26
>>701
まぁ今回の件に限らず、「コンマ1秒でも速くする」というような目標を持っている場合、
車輪の再発明は避けられないことが多いよね(そうでない場合も勿論あるけど)。
705:デフォルトの名無しさん
08/06/20 21:01:24
本当に速くしたいなら MMX とか SIMD とか使うと
706:デフォルトの名無しさん
08/06/20 21:54:44
DANGOさんの出番だな
707:デフォルトの名無しさん
08/06/20 22:09:39
: premature optimization is
(省略されました。続きを読むにはワッフルワッフルと書き込んでください)
708:デフォルトの名無しさん
08/06/21 01:24:43
ポインタのない言語なら>>686みたいなことは当たり前にできるんだけどな。
ポインタのある言語では、一気に話が複雑になるな。
709:デフォルトの名無しさん
08/06/21 06:23:29
データの入出力なんて元々複雑で時間の掛かる処理なんだから
横着するつもりなら効率の劣化には目を瞑るべき。
大体そんな困るほど遅くなることなんぞ滅多に無いし。
710:デフォルトの名無しさん
08/06/21 12:47:42
だいたい直列化してないデータを直列させるからシリアライズと
いうのに、最初からメモリ上に直列に並んでると考えるのはどうなのよw
711:デフォルトの名無しさん
08/06/21 12:51:19
>>708
ポインタの無いJAVAみたいな言語だって、>686みたいな記述はできても、
要素の実際の読み書きは1つずつだろ?
712:デフォルトの名無しさん
08/06/21 14:46:07
>>686
これは素晴らしい!!!
すこぶる高速ですね
713:デフォルトの名無しさん
08/06/21 14:49:44
>>686
これstringの実装によってはやばくないのかな
714:デフォルトの名無しさん
08/06/21 15:00:33
>>686
こんな気持ち悪いコード見たことない
715:デフォルトの名無しさん
08/06/21 15:01:03
>>713
そのコードがダメなのははっきりしてるから。
続きも読め
716:デフォルトの名無しさん
08/06/21 15:01:06
それ以前の問題。
717:デフォルトの名無しさん
08/06/21 15:42:55
ポインタ保存してポインタ復帰してるだけだからな。
718:デフォルトの名無しさん
08/06/21 16:59:18
>>709
いや、プログラムの起動を可能な限り速くしたいというニーズはどこにでもある。
3秒で起動するブラウザと1秒で起動するブラウザ、どっちを使いたいかといえば速い方がいいに決まってる。
そういう場合のクラスデータのシリアライズは、1分かかるのを30秒にしたいとかいうオーダーの話ではなくて、
0.3秒かかるのを0.05秒に縮めたいとかいうオーダーなんだよ。
起動時にデシリアライズするオブジェクトの数は1つじゃないしな。
トータルで1秒以内で起動させたいとか、そういうレベルのことをやりたいとなると、
バイト配列の中に直列化したデータ(多少隙間があってもいい)をあらかじめ揃えておいて
一気にシリアライズするという考えも、アリだと思う。
719:デフォルトの名無しさん
08/06/21 17:02:02
ファイル読み書きのオーバーヘッドなんてI/O待ちが大半なんだから、
よっぽどアホな処理でもしてない限り大差ないだろ
720:デフォルトの名無しさん
08/06/21 17:09:11
>>718
さっきドラゴンボール全巻買ってきた までは読んだ
:そこ、高速化したいなら横着せず書かないといけないって書いてんじゃん
721:デフォルトの名無しさん
08/06/21 17:38:07
その手のオーバーヘッドで一番時間食うのはstatだったりするんだよな
722:デフォルトの名無しさん
08/06/21 17:46:02
>>718
将来まで不変のデータ構造ならいいけど、
少しでも変えると過去のバージョンで直列化したデータが読めなくなるよね。
(すべてのバージョンに対するコンバータを付けるのもどうかと思うし)
痛し痒しだなぁ。
723:デフォルトの名無しさん
08/06/21 18:12:43
ちゅーか目的が高速化なのに質問者が面倒がって
既存の実装使おうと食い下がってるだけだじゃん。
724:デフォルトの名無しさん
08/06/21 18:28:07
既存の実装で高速化できないってことは既存の実装がクソだということですよね
725:デフォルトの名無しさん
08/06/21 18:35:28
F-1を公道に持っていったら全く使い物にならないのと同じ。
普通車なら速くはないが大体どこでも走れる
726:デフォルトの名無しさん
08/06/21 19:27:12
>>724
べっ別にあんたのために実装したんじゃないんだからね。
すべてに効果のある実装は存在しない。自分の目的に合う実装がなければ自分で作る。
727:デフォルトの名無しさん
08/06/21 19:39:42
暇だから素のテキストと長さ情報付きのバイナリで試してみた。
入力データはwindows.hおよびそこからincludeされているファイルから抽出した
全て大文字の先頭以外にアンダーバー入りの定数マクロ(WM_hoge等)18364個。
文字列の平均の長さは20.8文字。
手抜きのために、カンマ区切りではなく改行区切りで保存。
テキスト(ifstream.getline()で読み込み)
vector<string> 23ms
deque<string> 21ms
list<sting> 21ms
バイナリ(ifstream.read()で読み込み)
vector<string> 14ms
deque<string> 12ms
list<sting> 12ms
ちなみに、VC++2008Stdでコンパイル、E8400のPCで実行。
全て複数回実行した中で一番速かった結果。
728:デフォルトの名無しさん
08/06/21 19:54:00
freadに変えればさらに速くなるぜ
729:デフォルトの名無しさん
08/06/21 23:43:18
ifstreamをやめて、fopen,fgets,freadにしてみた
テキスト(fgets()で読み込み+改行コード除去)
vector<string> 14ms
バイナリ(fread()で読み込み)
vector<string> 14ms
CreateFile,ReadFileも試してみた
テキスト(2048バイトずつ読み込み)
vector<string> 11ms
バイナリ(必要なサイズだけ読み込み)
vector<string> 100ms
730:デフォルトの名無しさん
08/06/21 23:47:59
つーかstringって時点でバッファに直読みできねーよな
CString::GetBuffer()使ってみ
731:729
08/06/21 23:51:07
結局、ifstream.getline()が遅いだけで、読み込み部分を最適化したら
テキスト形式でもバイナリ形式でも差がない感じ。
ちなみにテキスト形式でファイル一気読みでは、稀に10msが出る程度。
あと、バイナリ形式でReadFile()でチマチマ読むのは何故か遅かった。
fread()は速いのにね。
732:デフォルトの名無しさん
08/06/21 23:51:41
それはスレ違い。
733:デフォルトの名無しさん
08/06/21 23:56:05
>>731
それは「何故か」でも何でもなく明らかなことだ
fread()はチマチマじゃなくて「一気に」バッファに読み込んで
読み込んだ分だけユーザに渡してるから速いんだよ
734:デフォルトの名無しさん
08/06/21 23:57:47
>>732
スレ違いかもしれないが重要なことだろ。
stringに高速にデータを読み込む方法は存在しない。
必ずコピーが発生するのだから。
カーネルバッファ→stdioバッファ→ユーザバッファ(典型的にはchar[])→string
こんな感じ
ほらみろ、効率悪い
735:デフォルトの名無しさん
08/06/21 23:59:58
stringの実装を知っていれば環境依存の方法で…
ってもうSTL作者になる以外ないな
736:デフォルトの名無しさん
08/06/22 00:00:38
>>730
この場合だと、GetBuffer使うメリットねーと思う。
737:デフォルトの名無しさん
08/06/22 00:01:56
>>736
いーやある。
fread()ではstringに直接読み込めないので一時的にchar[]に読み込んでコピー
するしかないが、
CString::GetBuffer()ならfreadで直接読み込める
つまり、一段コピーを減らせる
738:736
08/06/22 00:03:33
>>737
理由は>>733が書いてる。GetBufferつかったら、それ以上に読み込み遅くなるだろ。
739:デフォルトの名無しさん
08/06/22 00:05:30
>>738
は?何言ってんの。
CStringで適当なサイズをリザーブしといて、
GetBuffer()で取ったchar*のポインタにfread()しろっつってんだぞ?
間違いなくchar[]に読み込んでからstd::stringにコピーするより
速いよ。
740:739
08/06/22 00:09:03
ああ、話のズレがわかった。
俺はstd::stringなんて使わなきゃ速いよつってるんだ。
最後にstd::stringにコピーしなきゃならないんなら意味ないわな、
そりゃ。
コピー君だもの。
741:デフォルトの名無しさん
08/06/22 00:11:10
単に速いだけの話しならstd::istreambuf_iteratorとstd::ostreambuf_iterator
が速いんじゃないの?書式化なしだし
742:デフォルトの名無しさん
08/06/22 00:12:10
>>739
いってることはりかいできるけど、俺が言いたかったのはそうじゃない。
俺が言ってるのは、読み込んだデータには
複数のデータ(複数の文字列と文字列サイズのペア)が格納されてるってことだ。
んで、>>686あたりからの流れのように、vectorに一個一個格納すると。
まあすれ違いだからもう自重する。
743:デフォルトの名無しさん
08/06/22 00:12:33
>>741
それはどんだけ頑張ってもマクロ版のgetc()/putc()と同等の速度で、
言うまでも無くfread()より遅いよ
744:デフォルトの名無しさん
08/06/22 00:12:56
またEffective STLを読み返さねばならんようだな
745:デフォルトの名無しさん
08/06/22 00:27:04
>>743
そりゃそうだ
比べるのが無謀
というか比べるな
746:デフォルトの名無しさん
08/06/22 01:02:51
std::stringのかわりにstd::vector<char>つかえばいいんじゃね
char*, const char*のかわりに使えるし
STLやboostのiterator取るタイプの関数も全部使えるし
std::stringと違ってバッファ直接書き換えできるよ
747:デフォルトの名無しさん
08/06/22 01:04:21
どんだけ頑張ってもAPI直書きより
遅い。
748:デフォルトの名無しさん
08/06/22 01:10:19
>>747
上に出てるように、ちまちまReadFile()を呼ぶようなアホなまねをやるぐらいなら
まだfread()のほうが速いよ
749:デフォルトの名無しさん
08/06/22 01:11:46
もうRAMDisk使います
750:デフォルトの名無しさん
08/06/22 01:17:54
一応言っとくけど、バッファ渡して書き換えてもらう系の
関数だのAPIだのを使う際には全てこの議論は当てはまるんだぜ
別にI/Oだけの問題じゃない
std::stringを使っている限りは常にコピーがワンクッション入ることを
覚悟せよってこった
通常はどうでもいい問題だがな
751:デフォルトの名無しさん
08/06/22 01:57:38
あーつまり何だ?
ドライバ書けと
752:デフォルトの名無しさん
08/06/22 01:59:57
tcpのread/writeでのコピーは減るように各OSがんばってるネー
753:デフォルトの名無しさん
08/06/22 02:07:28
x86はリトルエンディアンであるというだけでtcp/ipのビッグエンディアンを
実現するのに少し不利なんだよな
754:デフォルトの名無しさん
08/06/22 02:07:52
物理層じゃなくてアプリケーション層の話な
755:デフォルトの名無しさん
08/06/22 02:08:10
データ本体だからendianは関係ないのでは・・
756:デフォルトの名無しさん
08/06/22 02:21:07
データをストアする時にひっくり返るでしょう
ブラウザはどういう仕組みになっているのか知らないが
Unicodeをリトルエンディアンのまま画面出力できるようになっているのか、
それともビッグエンディアンに並び替えて表示しているのか
757:デフォルトの名無しさん
08/06/22 02:56:12
速度最重視ならLEで送ってもらうんでないの
758:デフォルトの名無しさん
08/06/22 02:58:27
OSネイティブの文字コードで送られてくることなんか超レアケースだろ。そんなところが
最適化されててもたいしたメリットは無い。
759:デフォルトの名無しさん
08/06/22 08:20:06
保存したファイルを直接ファイルマッピングして、そのまま利用するのが最速なんじゃね
要するにオンメモリでの利用形式を、保存形式に合わせるw
760:デフォルトの名無しさん
08/06/22 09:06:23
>>759
ファイルマッピングはファイルサイズを伸ばせないのが難点だな。何かいい方法がないものか。
761:デフォルトの名無しさん
08/06/22 09:50:40
>>759
ReadFile()やWriteFile()は別にディスクをガリガリ読み書きする
わけじゃなくて、オンメモリのバッファキャッシュが相手だからな
事実上裏でOSがページ単位でファイルマッピングしてるのと同じで
CreateFileMapping()したからつって経験上別に速くならないよ
Windowsではな
話を大幅に戻すと、小手先の最適化に走る前に、本当にCSVやvector<string>
じゃなければいけないのかってところを考えるべきだと思うね
固定長データ、ISAM、SQLite、Berkeley DBのようなものが適切なんじゃないかとかさ
762:デフォルトの名無しさん
08/06/22 16:22:09
fopenは、内部的にReadFileを呼び出しているものの、バッファリングしているので
(普通に使う分には)充分な速度が出る。
ただし、複数回のコピーが無駄と言えば無駄。
ReadFileは、OSのバッファにキャッシュしていてディスクアクセスはしないものの、
システムコールだから、カーネルとのスイッチが発生する。
だから、細かく何度も呼び出すと非常に遅くなる。
CreateFileMappingと使うと、OSのバッファキャッシュを経由しないので
ゼロコピーとなり、読み出しに限れば最速を期待できる。
書き込みは、普通はバッファリングされるfwriteを使うべき。
Readと同様、直接APIを叩いても大して効果ないし
逆にバッファリングを無効にすると、ディスクアクセス完了まで待たされることになる。
この場合にどうしても最速を求めるなら、非同期APIを使う。
763:デフォルトの名無しさん
08/06/22 16:52:11
俺、この類はcatコマンドのソース読んで参考にした。
読み込みと、書き込み(表示)について練り込まれた結果の
知識が詰まってるなと思った。 ちなみに read() write() 使ってた。
764:デフォルトの名無しさん
08/06/22 17:36:20
あ、そうだ。
stdioはバッファリングしてるけど
fgetc/fputcのような、1文字入出力系は注意。
最近のVCとかは、マルチスレッド対応ライブラリで
1文字ごとにロックしているので、このコストがバカにならない。
遅いと言われるcygwinとかもそうかもしれない。
istream_iteratorとかは知らんが、MT対応を謳っているなら
ロックしている可能性は十分ある。
765:デフォルトの名無しさん
08/06/22 19:54:16
iostreamの比較なんて昔から皆やってるのになぜいまさら
766:デフォルトの名無しさん
08/06/22 19:56:02
実装が進化しているかもしれん。
767:デフォルトの名無しさん
08/06/22 20:17:58
残念ながらstdioより速いiostreamなんてのは見たこともないし、今後も無いだろ。
実装の質の問題というよりは、仕様上無理なんじゃないか。
ios_base::sync_with_stdio()とかあるし、デフォでシンクロしてるのが仕様だから、
stdioをバイパスできず、stdioの上に構築せざるをえないってことになる。
おまけに仕様も複雑だ。
これでstdioより速くなるわけがないんだぜ。
768:デフォルトの名無しさん
08/06/22 20:23:36
_CRT_DISABLE_PERFCRIT_LOCKS
769:デフォルトの名無しさん
08/06/22 22:22:47
まあ、速さだけが基準じゃつまらんよな。
770:デフォルトの名無しさん
08/06/22 22:53:16
>>697
そもそも
(世にある)シリアライズ機構 = 高速化のためのもの
という発想が間違い。
シリアライズ機構 =
ヘテロなオブジェクトの集合であっても、汎用的に直列表現に置き換えるための汎用枠組み
ととらえる方が常識で、(たとえば>>699みたいに)
でも汎用では自アプリにとっては遅くて不都合!という場合に、
自アプリに特化した、汎用無視の保存方法作る、というのがさらに常識。
CSVって決まってるならCSV特化とかね。そのかわりそこ変わった瞬間に大幅変更だけど。
771:デフォルトの名無しさん
08/06/22 23:19:12
はぁ?手軽に最高速がC++の売りなんじゃないですかぁ?
バカなの?
ぶっちゃけRubyのほうが100万倍マシ
772:デフォルトの名無しさん
08/06/22 23:23:20
>>771
はいはい、そうですね
773:デフォルトの名無しさん
08/06/22 23:27:47
C++が手軽なんて話は始めて聞いた
774:デフォルトの名無しさん
08/06/23 02:08:48
最初に「100万倍」ってとこだけ目に入って、
あーきっとアホの子なんだろうなーと思って残りを見たら
完全にその通りだった。
775:デフォルトの名無しさん
08/06/23 03:37:07
Ruby信者が例外なく全員キモイのは何故なんだろう
776:デフォルトの名無しさん
08/06/23 07:43:16
Rubyは優秀な言語なのに、使ってる人の中身がDQNだからもったいないよなw
777:デフォルトの名無しさん
08/06/23 08:06:04
釣りだったことにして逃げ切りを図るレスが来る頃合いだけど、
それを先にこうして予測したことで、ちょっとルートが変わるかもしれないな。
778:デフォルトの名無しさん
08/06/23 10:59:25
いつも思うんだが信者がわざわざRubyの評判を落とすような事をするかな。
779:デフォルトの名無しさん
08/06/23 11:23:27
儲に見えないのは俺だけか
780:デフォルトの名無しさん
08/06/23 11:55:36
>>771-778は全て自演
781:デフォルトの名無しさん
08/06/23 13:00:25
ということにしたいんですね
782:デフォルトの名無しさん
08/06/23 14:35:23
>>778
例えば宗教団体の信者は熱心に勧誘を行って、結果周りから見るとイメージダウンをしている。
似たようなもんでは
783:デフォルトの名無しさん
08/06/23 17:29:52
そうかそうか
784:デフォルトの名無しさん
08/06/24 20:00:11
vectorの要素を指すポインタは無効になることがあります。
では、queueの要素を指すポインタは無効になることがありますか?
下のプログラムを実行すると、1 2 4 4 5 6 と出力され、期待通りに動きました。
このプログラムは正しいプログラムですか?
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3); int* x = &q.back();
q.push(4);
q.push(5);
q.push(6);
(*x)++;
while (!q.empty()) {
cout << q.front() << ' ';
q.pop();
}
return 0;
}
785:デフォルトの名無しさん
08/06/24 20:11:36
>>784
queueの中身のデフォはdequeなので、要素追加で
リアロケートが発生することがある。ポインタもイテレータも無効になる。
786:784
08/06/24 21:00:22
>>785
なるほど。ありがとうございます。危ないところでした。
では、リストを使って、queue<int, list<int> > q;
とすればOKでしょうか?
787:デフォルトの名無しさん
08/06/24 21:30:01
>>785
途中への追加はイテレータ等が無効になる可能性があるけど
端への追加ではイテレータ等は無効になんないんじゃないの?
788:デフォルトの名無しさん
08/06/24 21:46:06
>>787
> 23.2.1.3 deque modifiers
> An insert at either end of the deque invalidates all the iterators to the deque,
> but has no effect on the validity of references to elements of the deque.
イテレータは無効になるが、要素への参照は有効のまま。
789:デフォルトの名無しさん
08/06/25 09:16:26
>>786
vectorやdequeなら、イテレータではなく添え字でアクセスするのも有り。
790:デフォルトの名無しさん
08/06/28 14:03:55
algorithmのcopyについての質問です。
ifstream ifs(argv[1]);
vector<char> file;
copy(
istream_iterator<char>(ifs.seekg(10, ios_base::beg))
istream_iterator<char>(ifs.seekg(20, ios_base::beg))
back_inserter(file)
);
上記のようなコードで、あるファイルの10バイト目から20バイト目までをコピーしようとおもったのですが、出来ませんでした。
このような事をする場合はどうしたらいいのでしょうか?
791:デフォルトの名無しさん
08/06/28 15:14:14
>>790
int const begin = 10;
int const end = 20;
ifs.seekg(begin);
int const length = end - begin;
file.resize(length);
ifs.read(&file[0], length);
792:デフォルトの名無しさん
08/06/28 15:21:29
>>791
ありがとう、だけどファイル以外のストリームに対しても同じ方法がとりたいとおもっているので、
algorithmのcopy、あるいはSTLの何かを使って解決したいのです。
で、思いついたのが790のコードなのです。
793:デフォルトの名無しさん
08/06/28 17:36:54
>>792
>791 はファイル以外のストリームにも使えるんじゃないか?
seekg() ができないかもしれないってこと?
794:デフォルトの名無しさん
08/06/28 17:41:54
そういや copy_n() ほしいな。
795:デフォルトの名無しさん
08/06/28 20:43:54
どうでもいいけどistream_iterator<char>使うな
istreambuf_iterator<char>使え
istream_iterator<char>はoperator>>で入力するから、空白とか
スキップする。コピーにならんぞ
796:デフォルトの名無しさん
08/06/28 20:57:41
どうでもいい割には念を押すね。
797:デフォルトの名無しさん
08/06/28 21:09:48
>>795
それ「どうでもいい」事じゃないと思うw
798:デフォルトの名無しさん
08/06/29 22:25:50
あげあしはどうでもいいよ。
799:デフォルトの名無しさん
08/06/30 00:24:58
揚げ足取り、って言いたかったのかな。
800:デフォルトの名無しさん
08/06/30 00:30:10
手羽先、って言いたかったんたと思うよ
801:デフォルトの名無しさん
08/06/30 01:44:47
コケコッコーーー!!!
802:デフォルトの名無しさん
08/06/30 08:15:27
お前ら鳥類食ってて何も恥じらいはないのかよ。
哺乳類としてのプライドはどこへ
803:デフォルトの名無しさん
08/06/30 08:54:17
意味不明
804:デフォルトの名無しさん
08/06/30 09:01:33
つーか、ヘビとかトカゲとか、哺乳類を食うのは許せないよな。
やつら爬虫類が生まれた頃にはまだ哺乳類も鳥類も居なかったってのに。
赤外線センサーまでつけやがって。
805:デフォルトの名無しさん
08/06/30 16:22:47
面白いと思って書いてるのかな
806:デフォルトの名無しさん
08/06/30 18:24:07
鳥類爬虫類は許せるが
鯨だけは愛と権利が与えられるべきだと思います
STL
807:デフォルトの名無しさん
08/06/30 18:27:03
何故か日本より沢山偶然鯨が掛かる隣の国には抗議しません
808:デフォルトの名無しさん
08/06/30 19:09:10
何でこんな流れに
809:デフォルトの名無しさん
08/07/01 21:42:20
みんな鳥類食ってて何も恥じらいもないからだと思う
810:デフォルトの名無しさん
08/07/01 21:49:13
牛食うのは禁止すべきだろ。
811:デフォルトの名無しさん
08/07/01 23:20:25
人食いてぇ
812:デフォルトの名無しさん
08/07/02 02:02:12
通報しますた
813:デフォルトの名無しさん
08/07/02 02:11:21
考え方を変えるんだ
そこにシニカルなアーティクルか精神的原論を見出せるかどうかを試してから通報すべきだ
日本は民主主義社会だっていってたよ確か誰かが
毎日と朝日の新聞見ながら泡噴きながら
人食いてぇ=女の子監禁してぇ
人(で)食いてぇ=女の子換金してぇ
人=幼女
人=稚児
人=人
通報しますた
814:デフォルトの名無しさん
08/07/02 07:41:04
お前らSTLの話しろよ。
鳥類とか哺乳類とか人間とかあんまり関係ないだろ。
815:デフォルトの名無しさん
08/07/02 09:19:26
>>813
通報されないように気を付けて。
ところで、map<int,bar*> mに挿入する時、
m.insert(map<int,foo*>::value_type(0, new foo))とか
m[0]=new fooとか
するのはヤバいよね。
スマポ使えない状況でどう書くのが一番スマートですか?
816:デフォルトの名無しさん
08/07/02 10:17:56
foo* p = new foo;
try
{
m.insert(map<int,foo*>::value_type(0, p));
// m[0] = p;
}
catch(...)
{
delete p;
throw;
}
817:デフォルトの名無しさん
08/07/02 10:19:22
まずmap<int,bar*>のbar*を、直接 opertaor =(bar *ptr) 出来ないようなクラスに置き換える。
・map<int, test<bar> >
後はしらね。勝手に適当にメソッドでnewが隠蔽されるようなものでも書けば良いと思うよ。
818:デフォルトの名無しさん
08/07/02 11:20:34
>>812
たった今>>811に食われたじゃないか
819:デフォルトの名無しさん
08/07/02 11:56:46
foo* p = new foo();
if (!map.insert(std::make_pair(0, p)).second) {
delete p;
p = 0;
}
820:デフォルトの名無しさん
08/07/02 12:03:46
p = repinterpret_cast<void*>(0);
821:デフォルトの名無しさん
08/07/02 12:18:09
>>819
insertで例外起きたらメモリリークするでよ
822:デフォルトの名無しさん
08/07/02 13:35:58
>>816
それだと m[0] に既存のポインタが入っていた場合にリークする。
↓これでいいかな?
foo* p = new foo;
try
{
&nbps; foo*& in = m[n];
&nbps; delete in;
&nbps; in = p;
}
catch (...)
{
&nbps; delete p;
&nbps; throw;
}
「スマポ使えない」と言ってもさすがに auto_ptr は使えるだろうから、
↓こっちのがいいと思う。
std::auto_ptr<foo> p(new foo);
foo*& in = m[n];
delete in;
in = p.release();
823:822
08/07/02 13:37:02
うわ。 nbsp ミスった。最初のコード訂正。
foo* p = new foo;
try
{
foo*& in = m[n];
delete in;
in = p;
}
catch (...)
{
delete p;
throw;
}
824:デフォルトの名無しさん
08/07/02 20:34:55
foo * p = new foo;
try {
std::swap(p, m[0]);
delete p;
}
catch(...) {
delete p;
throw;
}
825:デフォルトの名無しさん
08/07/03 01:52:19
関数内クラスでauto_ptrもどきを自作すればいいんじゃね?
簡単に
pair<map<int,bar*>::iterator, bool> ib(map.insert(std::make_pair(0, 0)));
if (ib.second)
ib.first.second = new foo;
でも良い気がするけど。
826:デフォルトの名無しさん
08/07/05 23:35:18
こんばんは。g++でtr1::unordered_setを使おうと思ったのですが。
tr1::unordered_set< vector<unsigned char> >とすると
‘struct std::tr1::hash<std::vector<unsigned char, std::allocator<unsigned char> > >’
と怒られてしまいます。これは何が悪いのでしょうか?
(vector用のhash関数を自分で作る必要があるということでしょうか?)
827:デフォルトの名無しさん
08/07/05 23:41:48
すいませんage忘れました。
828:デフォルトの名無しさん
08/07/06 03:22:08
>>826
コードとエラーメッセージをちゃんと貼れ。
829:デフォルトの名無しさん
08/07/08 04:21:23
デバッガとかでさ、変数名長すぎでしょ。
もう嫌だ。
830:デフォルトの名無しさん
08/07/09 17:51:42
#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){cout<<"new"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ val = x; }
int getval(void){ return val; }
};
int main () {
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ) {
a.setval( i );
list.push_back( a );
}
cout <<"------------------------------------ Line2"<< endl;
//cout << "size:\t\t" << list.size() << endl;
//cout << "list[data,3]:\t" << list[data, 3] << endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
831:デフォルトの名無しさん
08/07/09 17:54:23
Line1とLine2の間の
push_backのリサイズ時では何が起こっているのでしょうか
832:デフォルトの名無しさん
08/07/09 18:14:06
capacityが要素を保持するのに足りなければ、メモリの再確保が起きている。
833:デフォルトの名無しさん
08/07/09 18:46:38
ということは、一度破棄していると言うことでしょうか
834:デフォルトの名無しさん
08/07/09 19:57:59
そのクラスAにコピーコンストラクタも書いてみ
835:デフォルトの名無しさん
08/07/09 20:48:24
A(const A &obj){cout<<"copy"<<endl;} と
push_back後に1loopの目安として新しく
cout<<"----------------------------------"<<endl;
を付け足して走らせてみたところ
Line1とLine2の間の"copy"と"delete"の表示が
copy がpushした回数+1
deleteがpushした回数
になりました。
copyの回数が+1なのが気になります。
入れる側の参照+listに入っている数と考えそうになりましたが
これでサイズを比べて足りないようなら再確保…と考えるのは変よですね
copyとdeleteの順番と回数を考えると
前のvectorから入っている分コピーした回数+付け足す側からコピーの一回分
という事でしょうか
836:デフォルトの名無しさん
08/07/09 20:58:59
あれ、ちょっと変ですね…3回目のプッシュで考えると
既にpushされているのが2個なので
copy ←コピーしようとした
ここでサイズが足りないので再確保
copy ←コピーしようとした
copy ←前のvectorからコピー
copy ←前のvectorからコピー
delete ←入れようとした時のテンポラリの破棄?
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
でしょうか、なんだか混乱してきました…。
837:デフォルトの名無しさん
08/07/09 21:23:27
ここでサイズが足りないので再確保
copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←新しい要素のコピー
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。
valの値も表示させれば分かるべ。
838:デフォルトの名無しさん
08/07/09 21:43:28
それが4回目のpush_backなら納得できるのですが
3回目のpush_backでcopyが4つ表示されているので混乱しています。
839:デフォルトの名無しさん
08/07/09 21:49:50
iが3だから3回目とか勘違いしてないか?
840:デフォルトの名無しさん
08/07/09 21:54:59
略
copy
copy
delete
-----------0
copy
copy
copy
delete
delete
delete
-----------1
copy
copy
copy
copy
delete
delete
delete
-----------2
略
こう表示されています
環境は VC++2005EE +SDK win2000 です
841:デフォルトの名無しさん
08/07/09 21:56:29
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
略
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i )
{
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
略
ソースはこうなってます
842:デフォルトの名無しさん
08/07/09 22:03:30
copy
----------------------------------0
copy
copy
delete
----------------------------------1
copy
copy
copy
delete
delete
----------------------------------2
うちではこうなった。
VC++2008EE
forループ入る前にvectorになんか入れてない?
size()の値表示させてみ。
843:デフォルトの名無しさん
08/07/09 22:06:00
これが全文です。
#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
int main (){
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ){
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
844:デフォルトの名無しさん
08/07/09 22:36:38
2005入れてないから2003でやってみたらそうなった。
ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。
その変数のコピーと破棄が1回ずつ多いみたい。
2005のソースはわからんが多分同じ理由だろう。
845:デフォルトの名無しさん
08/07/09 22:41:38
なるほど、これで胸のつかえが取れました
付き合ってくれた皆さん、本当にありがとうございました。
846:デフォルトの名無しさん
08/07/09 23:04:39
>>844
>追加する要素を一旦ローカル変数にコピーしてた。
list.push_back( list[3] );