1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ class C++相談室lt;part56gt; pc11.2ch.net/test/read.cgi/tech/1170343752/l50
486 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:16:44 ] そこでautoとか未来を先走るわけですよ。カモンC++0x
487 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:23:34 ] >>486 でもこの場合どうやるんだろう。 そもそも>>482 はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。 ひょっとしたら、size_typeなど定義されていないかもしれない。 こういうことできるの? decltype( v.size() ) i ; sizeofに関数を渡すと、戻り値の型のサイズになるから、 decltypeだと戻り値の型になってくれるんだろうか。 なんてことをふと考えてしまった。 どうなるの? 教えてハゲな人。
488 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:27:02 ] さすがにバカ過ぎるだろ
489 名前:486 mailto:sage [2007/09/02(日) 00:30:15 ] すまん、脳内フィルターで485のループがイテレータに見えていた。 for (auto i = v.begin(); i != v.end(); ++i)
490 名前:デフォルトの名無しさん [2007/09/02(日) 00:40:25 ] >>483-489 なるほど。さんくすです。 >> 484 やっぱりそうですよね。 安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。 >> 485 感動しました。
491 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:34:22 ] 何でイテレータ使わないの? >482 i++使う意味も判らん……
492 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:50:17 ] 482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ for (int i = 0; i < v.size(); i++) v[i] = i; みたいな。
493 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:59:53 ] >>491 初心者だからだろ。 そのくらいわかれよ。
494 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 08:40:18 ] >>487 できるよ。
495 名前:デフォルトの名無しさん [2007/09/02(日) 12:06:53 ] >>491 そうですね。イテレータでもいけそうですね。 今はサンプルプログラム打ちながら勉強してるんで そこまでは思いつきませんでした。 >>492 ブロック内部でローカル変数作れば解決できそうですね。 またひとつ勉強になりました。 ありがとうございます。
496 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:35:18 ] >>495 そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。
497 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:47:29 ] C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は どうすればよいのでしょう。効率的に考えて
498 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:50:09 ] どういう変換をしたいのかサパーリ 似て非なるっていうか、ListとMapは別物じゃ?
499 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:55:44 ] >>498 変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。 説明下手ですまそ。
500 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:57:46 ] std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、 std::copy(map.begin(), map.end(), std::back_inserter( list ) ) でいけるんじゃね?効率なら知らん。
501 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:26:23 ] list.assign(map.begin(), map.end()) だろ。
502 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:42:28 ] >>499 っ アダプタパターン
503 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:48:49 ] クラステンプレートに関して質問させてください、 template <class T> class hoger { public: typedef T hogeT; struct fuga { } m_fuga; } main() { hoger<int> Hoge; hoger<型>::fuga &Fuga = Hoge.m_fuga; } みたいなことをやろうとしたんですが、hoger内の構造体とかを (長くなってしまうので)ローカル変数で参照作って使いたいとき hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は 得られないのでしょうか? こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。 よろしくお願いします。
504 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:53:00 ] >>503 うん。 何回も書くようなら typedef しとく。
505 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:01:24 ] >>500-502 ありがとうございます。もう少し勉強してみます。
506 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:03:57 ] 現状だとtemplateに逃げるしかないな。
507 名前:503 mailto:sage [2007/09/03(月) 13:52:09 ] 遅レスですみません、回答ありがとうございました。 >>506 なるほど、やっぱそうするしかないのですね・・ とりあえずはHoge.m_fuga.foo みたいに全部書いて指定することにしました。 こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。 ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて 可読性が下がるのは、テンプレートの勉強を始めた自分にとっては しょんぼり来てしまう(´・ω・`) ともあれどうもありがとうございました。
508 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:09:43 ] ここも将来的には auto で解決するところかな。
509 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:01:18 ] どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>
510 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:10:05 ] C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと? オブジェクト単位でコンパイル分ければいい 終わり
511 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:26:45 ] いまさら誰がautoなんて使ってるんだ?
512 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:33:24 ] 俺だよワリオだよ
513 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:17:40 ] >>509 暗黙のintは廃止されたから、 現在のC++での「auto x;」はコンパイルエラー。 「auto int x;」と書かないといけない。
514 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:20:45 ] >509 C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。 C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。
515 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:21:25 ] 思いっきりかぶりましたとさ。
516 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:35:13 ] 一つのキーワードに複数の意味なんてstaticで経験済みさ
517 名前:デフォルトの名無しさん [2007/09/04(火) 04:09:37 ] 今、VisualC++使ってます。 たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。 いい関数ない?やっぱ自作?,
518 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:13:24 ] >>517 マルチしないでさっさとイネ
519 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:26:42 ] >>517 setlocale
520 名前:デフォルトの名無しさん [2007/09/04(火) 05:33:02 ] >>519 ありがとう。 調べてみる。
521 名前:デフォルトの名無しさん [2007/09/04(火) 07:51:20 ] >>520 死ねカス
522 名前:デフォルトの名無しさん [2007/09/05(水) 00:48:40 ] リリースモードでは問題なく動いてるようなんだけど デバッグモードでアサーション?がでる。 別の似たコードでは問題ないんだけどなぁ・・・。 原因がわからん 眠い。 寝る
523 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:04:21 ] >>522 リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。
524 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 02:36:54 ] >>522 失敗してるアサートの条件を満たさないことがあるってことだな。 デバッガで現場を押さえればおおかた原因がわかるだろ。
525 名前:デフォルトの名無しさん [2007/09/05(水) 10:39:58 ] わっかたああああああああああああああああああああああ
526 名前:デフォルトの名無しさん [2007/09/05(水) 11:00:35 ] vectorコンテナの要素を削除した後に イテレータを取得し直さないで使おうとしたのがまずかったようだ。 うっかりやっちゃった。 リリースビルドではたまたま問題なかっただけってことかな。
527 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:00:58 ] コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。 ソースは以下になります。 istream_iterator<string> start(cin); istream_iterator<string> end; vector<string> v(start , end); C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。
528 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:19:45 ] 標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?
529 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:25:51 ] >>528 デバッガで動きを確認したところ、標準入力から、 ちゃんとEOFが出るまで読み込んでいます。 しかし、vectorを作成する部分で止まってしまって いる状況です。
530 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:51:51 ] 止まるってアプリが強制終了するって事か?
531 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:20:55 ] 入力待ちなんだと思うけどな
532 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:33:36 ] >>530 vectorの実行するところでループしている感じです >>531 入力のcinの部分は実行されていました
533 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:48:31 ] >>527 私の環境では動きましたよ。
534 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:48:50 ] たまにはexportを思い出してあげて下さい……。
535 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:57:19 ] C++0xスレにお越し下さい
536 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:02:54 ] >>533 #include<iostream> #include<istream> #include<string> #include<vector> #include<algorithm> #include<iterator> using namespace std; int main(){ cout << "Enter the seres of string::"; istream_iterator<string> start(cin); istream_iterator<string> end; vector<string> v(start,end); … } こんなプログラムですが、やはり途中vectorの後にプログラムが進みません コンパイラはg++-4.1を使っています。 わかる方宜しくお願いします
537 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:12:44 ] >>536 >>531
538 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:19:41 ] WindowsならCtrl+Z、UnixならCtrl+Dだっけ。 C++と全く関係ない話だ。
539 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:47:03 ] 進まないとか止まるってのはどういう状態のことを言ってるんだ? こっちで再現できるだけのソースを貼るんじゃなかったら その辺キッチリ書けよ
540 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:03:38 ] >>537-539 ありがとうございました。 何とか解決しました
541 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:14:10 ] 何がどう解決したのかも書かない。 これでは何の肥やしにもならない。 糞以下だね。
542 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:22:47 ] >>541 すみません。 しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。
543 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:35:01 ] >>541 まぁまぁ、こういう奴はプログラミング向いてないから いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。
544 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:47:54 ] と自分へメッセージ
545 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 19:32:13 ] >>542 =544 プログラマとしても人間としても糞以下だね
546 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:11:09 ] と糞未満のものが申しております
547 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:37:28 ] 真性だな可哀想に
548 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:58:04 ] ビクンビクン・・・!!
549 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:45:03 ] >>540 >>542 >色々いじっているうちに解決 いじる前後の違いを説明できないと言うのは理解できていないということ。 解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...
550 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:47:30 ] >>545 あと、自演乙
551 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:19:22 ] 「vectorの部分で止まってしまいます」 これがダウトだったんだろうな
552 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:58:09 ] メンバ関数ポインタから整数型へのキャストができた試しはないけど、 どうもそれを禁止している条項が規格を洗っても見つからない。 誰か、どこにあるか知ってる人いますか?
553 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:10:26 ] 肯定的な形でreinterpret_castの
554 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:55:41 ] ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね? 処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。
555 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:02:42 ] 僕の肛門からも悪魔が出そうです><
556 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:03:29 ] ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ? A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value; mappings between pointers and integers are otherwise implementation-defined.
557 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:04:32 ] いや、そもそもキャスト自体がコンパイル通らない。 VC++ でも g++ でも。
558 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:08:24 ] もちろん、普通のポインタならキャストは通る。 でも、メンバポインタだと通らない。 警告じゃなくて、エラーになる。
559 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:16:34 ] メンバポインタは
560 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:20:11 ] >>558 だったらメンバ関数のキャストの仕方間違ってるだけだろ
561 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:21:32 ] boostとかで、 namespace xxx_detail{ ふがふが } ってのを見掛けるんですが、 これは何か意味あるんですか? ADLの効果抑止とか? 無名namespace( namespace { げふげふ } )とかじゃダメなの?
562 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:26:30 ] (C++というプライドに賭けた)保守性を考慮した結果。 彼らがあくまでC++プログラマという事を忘れてはいけない。
563 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:40:05 ] >>561 ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、 コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。
564 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 07:42:42 ] >>552 5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。 "A pointer can be explicitly converted to any integral type large enough to hold it." でも 3.9.2 p3 に以下の記述がある。 "Except for pointers to static members, text referring to “pointers” does not apply to pointers to members." "A pointer" も同様に、メンバへのポインタは含まないってことじゃない?
565 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:43:59 ] C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。 [void*]を[整数型]として考える
566 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:56:38 ] >>564 それだ! 凄いわ。ありがとう。
567 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:03:16 ] 人権擁護委員会が在日を擁護する時 ttp://www.kajisoku-f-2.com/dd/img2-03/img625_j01.jpg ttp://www.kajisoku-f-2.com/dd/img2-03/img626_j02.jpg
568 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 11:27:29 ] 質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、 以下のようなコードを書きました。 //using namespace std; //hoge pHoge = new hoge(); //pHogeList.push_back(pHoge); list<hoge*>::iterator it = pHogeList.begin(); while(it != pHogeList.end()){ if (/*消滅条件が整ったら*/){ delete *it; *it = NULL; } it++; } pHogeList.remove(NULL); しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。 双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか? このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?
569 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:01:45 ] 実際にどこが遅いのかを特定するところから始めたらどうだ
570 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:41:35 ] C++の話じゃないかもしれないけど、C++で書いてるので質問させてください 0x00と"\x00"って何が違うんですか?
571 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:44:53 ] >>570 数値と文字(列)の違い
572 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:01:11 ] std::cout << typeid(0x00).name() << std::endl; std::cout << typeid("\0x00").name() << std::endl;
573 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:13:32 ] 文字は整数です。
574 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:16:31 ] 仮に0x00と'\x00'の違いだったとしたら、 C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
575 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:32:31 ] おお、知らなかった。C++だと文字リテラル (この用語自体C++からみたいだけど)はcharなのね。
576 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:03:12 ] 理由は演算子多重定義の都合。 IOストリーム作っていたときにそうすべきと感じたそう。 D&Eに書いてある。
577 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:26:38 ] "\x00" == { 0x0, 0x0 }
578 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:40:04 ] ノ| ,ノ| ( 0x0)b ノ| ,ノ| (; 0x0)a
579 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:55:32 ] >>575 int だったり wchar_t だったりもするけど
580 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:41:34 ] 質問よろしいでしょうか? /* main.cpp */ #inlucde "test.h" main() { int a=1,b=2; inlinetest(a,b); } /* test.h */ inline void inlinetest(int x,int y); /* test.cpp */ #inlucde "test.h" inline void inlinetest(int x,int y) { return; } 上記の具合にinline関数を使おうとすると 「未定義のシンボル」とコンパイルエラーがでてしまいました。 inlineの使い方が間違っているのでしょうか? ご指南お願いいたします。
581 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:55:52 ] > inlineの使い方が間違っているのでしょうか そうです。
582 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:14:20 ] >>580 #inlucde これは試したソースではちゃんとしてるんだろうか?
583 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:20:50 ] インライン関数は、普通ヘッダに定義を書く。
584 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:24:30 ] >>580 inline関数はその呼び出された場所に展開されることが前提になりますから、 呼び出し元でその定義が分かるようにしなければなりません。 したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。 >>580 の場合は、test.hで定義するのが適当かと思います。
585 名前:580 mailto:sage [2007/09/12(水) 23:40:58 ] 明快に理解できました。 頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。 丁寧な説明ありがとうございます。
586 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:53:53 ] 寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。