タグ

C++に関するiwwのブックマーク (338)

  • C++0x 標準ライブラリ完全解説 〜 No.01 namespace rel_ops, <utility> - 銀天随筆集

    該当規格: 20.3.1 Operators [operators], N3225 http://sites.google.com/site/cpprefjp/reference/utility/rel_ops さて、それでは早速、具体的なライブラリに移っていこうと思います。 とはいえ、初回から飛ばすのもアレなので、まずは軽いものを、 というわけで、 の rel_ops を紹介したいと思います。 これは比較演算子の多重定義を助けるためのヘルパ関数群で、 で唯一、 C++98/03 から全く変化していないライブラリです。 定義 namespace std { namespace rel_ops { template <class T> bool operator!=( const T& x, const T& y ) { return !( x == y ); } template <cla

    C++0x 標準ライブラリ完全解説 〜 No.01 namespace rel_ops, <utility> - 銀天随筆集
  • [c++]クラス内の文字列定数禁止? - TECH日記

    class a { const string XXX = "abcdef"; } はできない。 エラーメッセージは invalid in-class initialization of static data member of non-integral type 理由 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10634 簡単に訳すと 1、バグではなく、ISO仕様です。 2、コマンドラインオプション -fno-strict-consts 使えば回避できる

    [c++]クラス内の文字列定数禁止? - TECH日記
    iww
    iww 2012/07/29
    -fno-strict-consts
  • 3.1 配列の要素数を返す. - C/C++ 関数・マクロ集 ((ほぼ?) 処理系・OS 非依存)

    「C/C++ 関数・マクロ集」というタイトルですが, そのうちのいくつかはC専用だったりします.(苦笑) 2007/06/24(日) 追記 高木さんより, Cの規格上移植性に問題がある点をご指摘いただいたので, 現在修正中です. (たくさんあります….orz) とはいってもその多くは, めったにお目にかかれないような珍しい処理系とか, 「そんなの実在するの?」という処理系に移植する場合の話なので, 実用上ほとんどの場合は問題ないと思います. (一部そうとはいえないものもありますが.) Cの規格に照らして完全に「処理系・OS 非依存」 にするのは困難な場合もあり, 完璧な移植性にこだわるあまりプログラムが書けなくなっては末転倒なので, タイトルに「ほぼ?」を入れました.orz 2007/06/21(木) 追記 このページを含め,私が C/C++ 関連記事を書くに当たりたびたび参考に&リンク

  • サービス終了のお知らせ

    サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。

    iww
    iww 2012/07/28
    make_pair
  • STL マスター・ノート

    より詳しい解説ノートです。 基的な コンテナ/反復子/関数オブジェクト/アルゴリズム に的を 絞って詳しく解説しています。 stack/queue/priority_queue/bitset/string/rope/valarray/complex については、 また後日、STLプロフェッサー・ノートの方で詳しく解説します。 初歩的な説明は全部とっぱらっていますが、 それでもやっぱり見にくいです。 それから、SGI社のSTLについてはcompose辺りの説明が若干違います。 〔STL-コンテナ〕 ■コンテナ共通の項目 全てのコンテナクラスは、デフォルトコンストラクタ、コピーコンストラクタ、デストラクタを提供する。 また、要素の範囲を指定して初期化を出来る。 ◆コンストラクタによる初期化のサンプル 1) コンテナの要素から初期化をする std::list<int> l ; <省略> std

    iww
    iww 2012/07/28
    とてもわかりやすい良いページ。 でも色がきつい。
  • C++のSTLのmultimap 特にそのなかのequal_rangeについて

    またまた問題発生です。 今回も、C++のSTLについてです。 multimapのメンバ関数のなかに、equal_rangeってありますよね? 『引数より与えられたキーを含む要素のの最初と最後のイテレータを返す』 っていう、一見便利な関数なんですけど、 これ、 全体一致じゃなくて部分一致なんですよね… だから、のmultimapの要素が 50 500 550 4000 っていう状態でequal_range(50)って呼び出すと 500と4000の両方が帰ってきちゃうわけです。 利用方法によっては全然これでも問題ないんですけど、これが不便なときがあります。 いろいろと知恵を絞ってみましたが、処理を多くしないいい方法が思いつきませんでした。 方法としては、キーはそのままで、要素をリスト(またはベクタ)にするってのが一般的かもしれません。javaではそうするらしいです。 でもそれじゃあ、multi

    C++のSTLのmultimap 特にそのなかのequal_rangeについて
    iww
    iww 2012/07/28
  • 何でもかんでも virtual にしてはいけない

    イントロダクション 派生される可能性があるクラスではデストラクタを virtual にすることは C++ の基事項としていいでしょう。しかし、その知識を持ってはいるけどいまいち virtual を理解していなくて、何でもかんでも virtual にしてしまう、というのではいけません。そういう人のために、ここでは virtual を使ってはいけない場合について書きます。 何のために virtual があるのか さて、メンバ関数を virtual 宣言すると、そのクラスに対し vtable と呼ばれるテーブルが作られ、隠しメンバとして vtable へのポインタが追加されます。vtable は virtual 宣言されている関数のアドレスを集めたテーブルであり、vtable へのポインタは 32bit 環境なら大抵 4 byte になります。つまり、クラスの中に virtual 宣言されたメ

  • [ N / A ] error: ISO C++ forbids declaration of 'class name' with no type

    こいつにずいぶんと悩まされたのでついカッとなって記事に "ISO C++ forbids declaration of 'class name' with no type"とは ISO C++は型のない変数の宣言を禁止しているぞと。いう意味になります。 例えば、 auto x = 0; // Error intなど型の指定のない宣言でこのエラーは出ます。。。 それと、コンパイラ(g++?)は理解できない構文要素を無いものとして読むので指定した型(クラス)が当にスコープ上にあるかもポイントです。 このエラーが出る型はポインタとして使われている場合が多いようです。 (このときアスタリスクをはずすと、ちゃんと見つからない旨のエラーを吐いてくれます。) 同様の理由でテンプレートクラスなどでこのエラーが出る場合は typenameキーワード を使って解決する場合もあるようです。各自ググられたし。。

  • Google Sites: Sign-in

    Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode

    iww
    iww 2012/07/27
    multi_index_container
  • デストラクタがvirtualじゃないクラス、例えばvectorは継承しちゃだめなんだぞー! - 神様なんて信じない僕らのために

    と言われたら。 C++ code - 21 lines - codepad class Container { public: ~Container() { printf("Container::~Container()\n"); } }; class Hoge : protected Container { public: }; int main() { Hoge h; Hoge* hoge = new Hoge(); delete hoge; いったい何の話ですか? と、とぼけましょう。

    デストラクタがvirtualじゃないクラス、例えばvectorは継承しちゃだめなんだぞー! - 神様なんて信じない僕らのために
  • Containers

    A container is a holder object that stores a collection of other objects (its elements). They are implemented as class templates, which allows a great flexibility in the types supported as elements. The container manages the storage space for its elements and provides member functions to access them, either directly or through iterators (reference objects with similar properties to pointers). Cont

  • ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない? - 神様なんて信じない僕らのために

    ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ はよくある間違い。あるいはC++初心者の勘違い。 継承する可能性のあるクラスにはすべてvirtualデストラクタを作る C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ ということが否定されていることは言われるようにEffective C++を読んでいればわかること。 C++では、コピー不可にするために以下のようなクラスを書いたりするが、 (コピーコンストラクタとコピー代入演算子を無効にする) class Uncopyable { protected: Uncopyable() {} ~ Uncopyable() {}

    ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない? - 神様なんて信じない僕らのために
  • constメンバ関数

    オブジェクトの変更拒否 あらかじめ、オブジェクトがもつメンバ変数の値を変更する予定のない データの読み込み専用の関数などは、メンバ変数を変更できないようにすると 思わぬ変更によるデータの整合性の損傷を避けることができます メンバ関数の宣言に const キーワードを指定すると そのメンバ関数はオブジェクトの持つメンバ変数を変更できなくなります member-function() const {... メンバ関数名の後に const を指定するところに注意してください #include<iostream> using std::cout; class Kitty { public: char *str; void print() const { //str = "Chobits"; cout << str; } Kitty(char *str) { this->str = str; } };

    iww
    iww 2012/07/25
  • C++マニアック,マニピュレータの作り方,how to make manipulator

    ここでは、入出力ストリームと共に使用するマニピュレータの作り方について解説します。マニピュレータは、関数でも、クラスでも実現できる少し毛色の変わったおもしろい存在です。マニピュレータを理解するにはオペレータのオーバーロードの知識が必須ですので、そちらもご覧ください。 マニピュレータとは 引数のないマニピュレータの作り方 引数のあるマニピュレータの作り方 グローバル関数として作成する方法 グローバルな関数オブジェクトとして作成する方法 クラスオブジェクトとして作成する方法 マニピュレータの応用例、printf 風マニピュレータ マニピュレータとは ページの先頭へ マニピュレータとは、cin、cout などを代表とする入出力ストリームに対する、挿入演算子 << や抽出演算子 >> と協調して、入出力フォーマットの変更を行うなどの目的で設計されたもので、標準ライブラリでは endl、setw、s

  • C++ デフォルト引数はプロトタイプ宣言だけにする default argument given for parameter

    このドキュメントの内容は、以下の通りです。 はじめに デフォルト引数とは サンプルコード コンパイルするとデフォルト引数でエラーが出る 何が悪いのか? 2020年の環境では まとめ はじめに C++言語 は、精力的に新しい機能が実装され、GNU GCCやClangなどの新しいバージョンが次々とリリースされます。次々と新しいプログラミング言語が開発され、便利なスクリプト言語が次々と登場していますが、C言語やC++言語は、いまでも根強い人気があるように思います。組み込み系で使われていたり、やはり実行速度が速い、といったメリットがあるからなのではないか、と思っています。 GNUGCCの 古い g++(コンパイラ) でコンパイルするときは、問題にならなかったけど、いつの間にかエラーになってコンパイルできなくなってしまった、というお話です。 どういうわけか、古いコンパイラを使わないといけない環境に長

  • C++で関数内関数(inner function)をやってやるんだぜ。。。

    C++って関数内関数(inner function)って作れないじゃないですか? でも、書きたい時あるよね?っで悪あがき。 1.関数内で構造体は定義できる 関数内で構造体は定義できるじゃないっすか。それを利用して、 int main(){ //構造体作ってその中で関数を定義する struct{ void print_msg(const char *msg){ printf(msg); } }inner_func; //構造体を通して関数を呼ぶ inner_func.print_msg("inner_func!!!"); return 0; } 問題点は、「構造体名、関数名」の二つを考えないと(記述しないと)いけないのが面倒。 2.C++ってoperatorあるじゃないですか operatorを使って上記を書き換えると。 int main(){ //構造体作ってoperatorで関数を定義す

    C++で関数内関数(inner function)をやってやるんだぜ。。。
    iww
    iww 2012/07/23
    関数内関数定義を無理矢理やってる
  • C++の文字列操作 - minus9d's diary

    以下、すべて #include <sstream> #include <iostream> using namespace std; と書いてあるものとする。 数字から文字列へ変換 int i = 10; ostringstream sout; sout << i; string s = sout.str(); cout << s << endl; 文字列から数字へ変換 string str = "123.456"; istringstream sin(str); double num; sin >> num; cout << num << endl; 文字列のフォーマット ostringstream sout; sout << "value is " << 100; string formatString; formatString = sout.str(); cout << forma

    C++の文字列操作 - minus9d's diary
    iww
    iww 2012/07/20
  • サービス終了のお知らせ

    サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。

    iww
    iww 2012/07/19
  • 【C/C++】 演算子のオーバーロード - 日々此精進

    最近C++でやたら演算子のオーバーロードをする事が多くて色々調べたり実験したりしていたんやけど、ここいらで覚書きをしておこう。 演算子をオーバーロードする目的には色々あるけど、主にオブジェクトに対して以下のような記述方法を使いたい時が上げられるかな? obj A; obj B; obj C; A = B; A += B; A = B + C; もちろん + 以外にも -(sub) *(mul) /(div) &(and) |(or) ^(xor) <<(lshift) >>(rshift) などなど色々あるわけでさ。 それからコピーコンストラクタにポインタ参照、キャスト演算子などキリがないね。 で、↑のようなオブジェクト同士の演算であれば結構簡単。 class obj { public: void operator = ( obj o ); obj& operator + ( const

    【C/C++】 演算子のオーバーロード - 日々此精進
    iww
    iww 2012/07/19
  • C/C++の関数の呼び出しをトレースする (GCC限定) - Capsule

    GCCの拡張機能である-finstrument-functionsオプションとLD_PRELOAD環境変数を利用して実行時に関数とメソッドの呼び出しをトレースする方法のメモです。 この方法の良いところは、他のツールと違って、自分の興味がある関数やメソッドがあるソースコードだけを対象にトレースできる所だと思います。dtraceやcallgrindだとシステムコールやライブラリの関数の呼び出しまでトレースしてしまったりします。関数呼び出しをトレースするお手軽な方法です。 手法 -finstrument-functionsオプションをつけてコンパイルすると関数やメソッドの入口と出口に自動的に関数を呼び出す命令を挿入します。入口で呼ばれる関数は__cyg_profile_func_enter、出口は__cyg_profile_func_exitです。そんな感じで関数を定義してコンパイルオプションを