タグ

C++に関するmaraigueのブックマーク (25)

  • クソザコ鳥頭が非順序連想コンテナに入門してみた

    Boost.勉強会#19東京 Effective Modern C++C++ Core GuidelinesShintarou Okada

    クソザコ鳥頭が非順序連想コンテナに入門してみた
    maraigue
    maraigue 2018/01/22
    C++のunordered_set/unordered_mapにおける、ハッシュテーブルの実装や計算効率に踏み込んで説明している
  • C++11:スレッド・ライブラリひとめぐり【補足編:1】

    #include <thread> #include <chrono> #include <string> #include <iostream> /* * フツーの関数 */ void global_fun(int n) { using namespace std; cout << "global_fun: " + to_string(n) + " 秒後に終了します...\n"; this_thread::sleep_for(chrono::seconds(n)); cout << "global_fun: おしまい\n"; } /* * ラムダ式 */ auto lambda_exp = [](int n) { using namespace std; cout << "lambda_exp: " + to_string(n) + " 秒後に終了します...\n"; this_thre

    C++11:スレッド・ライブラリひとめぐり【補足編:1】
    maraigue
    maraigue 2018/01/10
    "std::threadを用いたスレッドの生成はpthread_create()やCreateThread()より数十倍(当社比)簡単" "なんとも巧妙なからくり:promise/futureが用意されています"
  • C++向け簡易コマンドラインパーザ cmdline - 純粋関数型雑記帳

    を作りました。 http://github.com/tanakh/cmdline 何か コマンドライン引き数の解析を助けるライブラリです。同じ目的のライブラリに、Cの標準関数であるgetoptやgoogleのgflagsなどがありますが、cmdlineは適当に使えてそこそこ便利というのを目指しています。getoptは使いにくいし、usageも自分で書く必要がある。gflagsはライブラリをインストールしたり、リンクしたりちょっと大掛かり。cmdlineは、1ヘッダファイルで、コピーするだけで使えて、修正BSDライセンスで公開しているので、自由にプログラムに取り込んでいただけます。 コードサンプル #include "cmdline.h" int main(int argc, char *argv[]) { cmdline::parser p; p.add("hoge", 'h', "hog

    C++向け簡易コマンドラインパーザ cmdline - 純粋関数型雑記帳
    maraigue
    maraigue 2017/12/01
  • インクルードガードとpragma once - にゃははー

    C++ Advent Calendar 2015の5日目です。 前C++時代から近代C++に至るまで、ヘッダファイルの重複インクルード排除のために通称インクルードガードというものが使われてきました。 #ifndef YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H #define YOUR_VERY_VERY_AWESOME_LlBRARY_HEADER_H #endif // YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H しかしこれはファイルの前後に書かないといけないという制約や、他のヘッダとトークン列が一致してしまうと意図せずヘッダがインクルードされないという問題がありました。 これに対してたった1行で書いて終わりの#pragma onceは、標準化を求める声も多く、目的が明確で、実装もあるにも関わらず、標準に入る気配すら

    インクルードガードとpragma once - にゃははー
    maraigue
    maraigue 2017/03/01
    "標準化を求める声も多く、目的が明確で、実装もあるにも関わらず、標準に入る気配すらありません" "#pragma onceは同一ファイルの二重インクルードを回避することはできても、定義の重複を回避することができない"
  • 本の虫: BOOST_PREVENT_MACRO_SUBSTITUTIONについて

    Appleマクロの恐怖 - Faith and Brave - C++で遊ぼう Appleのクソヘッダーがcheckとかrequireとかverifyなどといった、あまりにも一般的すぎる単語をプリプロセッサーマクロで定義している問題。MSも、あの悪名高いminやmaxマクロを定義している。 最良の解決策は、そんなクソマクロを定義したヘッダーを使わないこと。 ところで、#2115 (Avoid bad Apple macros) – Boost C++ Librariesをみると、BOOST_PREVENT_MACRO_SUBSTITUTIONというものがあり、これを使えば、この問題を解決できるらしい。何と、そんな便利なものがあるのか。早く言ってよね。しかし、なぜか、"Perhaps sadly, I have to agree."と言われている。何故そんなに落ち込んでいるのだろうか。気にな

    maraigue
    maraigue 2015/11/14
    裏技感が半端ない。 "Appleのクソヘッダーがcheckとかrequireとかverifyなどといった、あまりにも一般的すぎる単語をプリプロセッサーマクロで定義している問題(中略)これを使えば、この問題を解決できるらしい"
  • std::(unordered_)map でメモリ使用量を見積もる - ny23の日記

    以前,トライと STL コンテナの比較をした際,std::map, std::tr1::unordered_map についてはメモリ使用量をちゃんと測っていなかったが,都合により,コンテナ体のメモリ使用量を見積もる必要が出てきたので gcc 4.7 の実装を眺めてみた. 結論から言うと,gcc では std::map <_Key, _Tp> のメモリ使用量は, template<typename _Val> struct _Rb_tree_node { _Rb_tree_color; // ノードの色 (enum; int) _Base_ptr; // 親ノードへのポインタ _Base_ptr; // 左ノードへのポインタ _Base_ptr; // 右ノードへのポインタ _Val; // value_type (std::pair <const _Key, _Tp>) }; -> si

    std::(unordered_)map でメモリ使用量を見積もる - ny23の日記
    maraigue
    maraigue 2014/08/26
    "std::unordered_map ではハッシュ表 (_Hash_table) に指数的な拡張戦略が用いられているので,rehash () で予め十分な bucket を確保しない限り拡張時にメモリのオーバーヘッドが生じる"
  • ゲーム開発者のための C++11/C++14

    15. Visual Studio は 着実に C++11/14 に対応 2010. 4 2010 auto, move, nullptr lamdas, <random> 2012. 9 2012 Range-based for, enum class <chrono> , <ratio>. <thread> 2013. 6 2013 Preview Variadic templates initializer_lists, C++14 libs 2013. 9 2013 RC Non-static data member init defaulted / deleted functions 2013. 11 2013 2013 Q4 2013 + CTP constexpr, noexcept C++14 generic lamdas

    ゲーム開発者のための C++11/C++14
    maraigue
    maraigue 2014/08/22
  • 「never say new, never say delete」 ~C++11のunique_ptrのおはなし

    目下手を入れているコードも相当古く、ビギナさんにオブジェクト指向を教えるべく継承と多態を"わざと"多用したサンプルです。C++での動的束縛(dynamic-binding)を説明するため、あちこちにポインタが現れあちこちでnew/deleteしています。多態を使いまくるコードでポインタの利用が増えてしまうのはある程度仕方のないことなのですが、決してnew/deleteしまくりたいわけじゃありません。ガベージ・コレクションをサポートしたC#/Javaの類ならnewしっぱなしで構わんけれど、C++ではnewしたものは必ず/明示的に/ただ一度だけ/確実にdeleteしてやらにゃなりません。ヒトは間違う生きもの、忘れる生きものなんだから、できることならnew/deleteしたくない。特にdeleteはやらずに済むならそれに越したことはないわけで...マクラが長くなりました、unique_ptrのお

    「never say new, never say delete」 ~C++11のunique_ptrのおはなし
    maraigue
    maraigue 2013/11/14
  • 文字列取得バッファとしてのstd::string - yohhoyの日記

    C++標準ライブラリの文字列型 std::string*1 を、C言語インタフェースへの文字列取得バッファとして使う方法についてメモ。記事の内容はStack Overflowで見つけた質問と回答に基づく。 2016-03-27追記:C++17(C++1z)対応版はこちら→文字列取得バッファとしてのstd::string リターンズ - yohhoyの日記 2013-08-30追記:C++03以前でも事実上「std::string 内の文字列バッファは連続したメモリ領域」といえる?C++ Standard Library Defect Report List #530 Must elements of a string be contiguous?、Cringe not: Vectors are guaranteed to be contiguousコメントも参照のこと。 まとめ: C++

    文字列取得バッファとしてのstd::string - yohhoyの日記
    maraigue
    maraigue 2013/08/26
    "C++98/03標準ライブラリでは、std::stringの内部実装として「不連続メモリ領域に文字データを保持する(rope)」などの最適化技法が許容されていた" まじですか... c_str()ってAPIがある以上は連続領域だと保証されてると思ってた
  • CEANによる配列操作 - いぐにさんにっき

    はじめに これはC++ Advent Calendar 2012の21日目の記事です。 当はスパコン環境でのC++とかODEintについて書こうかと思っていたのですが、時間がなくなってしまったので予定よりも軽めの内容にします。もしかしたらODEintについて追記するかもしれません。しないかもしれません。 ...というか書いてる途中で時間切れになったのでまた後で修正します(申し訳ない) さてこのCEANというのは何かというと、C/C++ Extensions for Array Notationsのことです。Array Notation。つまり配列の記述方法です。残念ながらC++標準では使えません。Intel Compilerでのみ利用できる拡張機能です。Intel Compiler 13で使えることは確認してます。 拡張機能、しかも文法上の拡張なので使うと他コンパイラとの互換性が無くなり

    CEANによる配列操作 - いぐにさんにっき
    maraigue
    maraigue 2013/07/13
    Intelコンパイラの拡張機能。「配列変数aの要素すべてについて」をa[:]といった具合に書ける。
  • 継承とテンプレート - Cube Lilac

    この記事は,C++プログラマであるかを見分ける10の質問 - Life like a clown の「抽象クラスとテンプレートクラスの使い分けについてインターフェースと言う観点から述べよ」に対する回答的な記事です. インターフェース的な基底クラスは,テンプレートで代替できる場合があります.例えば, class interface { public: virtual ~interface() {} virtual void do_something() = 0; }; void func(interface& x) { x.do_something(); } と言うインターフェース(的な)クラスを引数に取る関数 func() は,以下のように書く事でも実現できます. template <class T> void func(T& x) { x.do_something(); } さて.この

    継承とテンプレート - Cube Lilac
    maraigue
    maraigue 2013/06/10
  • 自分の型を取得 - Faith and Brave - C++で遊ぼう

    C++にはクラス内で自分の型を取得する直接的な方法がないという問題があり、そのためにtypedef X this_type;のようなことが行われていました。 C++11にはdecltypeがあるので、decltype(*this);で自分の型を取得できます。 ただし、decltype(*this)で導出される型はXではなくX&のため、std::remove_referenceしないといけないのであまり便利ではないのでした。 #include <iostream> #include <type_traits> struct X { void foo() { // decltype(*this)::bar(); // エラー!X&::bar()はできない std::remove_reference<decltype(*this)>::type::bar(); } static void bar

    自分の型を取得 - Faith and Brave - C++で遊ぼう
    maraigue
    maraigue 2012/05/28
    quote{C++にはクラス内で自分の型を取得する直接的な方法がないという問題があり、そのためにtypedef X this_type;のようなことが行われていました。C++11にはdecltypeがあるので、decltype(*this);で自分の型を取得できます}
  • いやなブログ: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C++

    配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。 そこで、備忘録として、 Ruby, Python, JavaScript, Perl, C++ の配列操作の比較表を作りました。一番慣れている Ruby を基準にしています。間違いなどがあったらご指摘いただけると助かります。他の言語のもあるといいなあ。 Ruby (Array) Python (list) JavaScript (Array) Perl (@) C++ (std::vector)

  • switch case で文字列を使う - とくにあぶなくないRiSKのブログ

    文字列のハッシュをconstexprで計算できればC++で文字列を使ったswitchができるんだけどなあと思ったけど,mpl::stringならコンパイル時にハッシュ値の計算できたりしないだろうか. 2011-01-14 19:48:06 via P3:PeraPeraPrv 「なるほどー」と思ったので文字列のハッシュを使う実験。 #include<string> #include<iostream> constexpr int hash(char const * s) { return *s ? *s + hash(s + 1) : 0; // 超絶てけとーハッシュ } int main() { for(std::string s; std::cin >> s;) switch(hash(s.c_str())) { case hash("foo"): std::cout << "case

    maraigue
    maraigue 2012/01/18
    文字列では普通switch - caseが出来ないのだが、constexprなハッシュ関数を使うとそれっぽいことが出来るという話。ハッシュ値の衝突という問題もあるけど、発想がすごい
  • (C++) const限定子が一致しない多重ポインタ間の相互代入について。 - 片っ端から忘れていけばいいじゃない。

    (2011/12/12 01:12) 副題: 「どうして char** を const char** に 代入できないの?」というFAQの無駄な深掘り 目次 char* は、const char* に代入できる。 char** は、const char** に代入できない。 char** は、const char* const * に代入できる。 char** は、char* const * に代入できる。 一般化してみよう。 (残念な)結論。 char* は、const char* に代入できる。 const char* x; char* y = 0; x = y; // OK ここまでは、直観どおり。 char** は、const char** に代入できない。 const char** x; char** y = 0; x = y; // NG: キャストが必要 VC++2010:

  • それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳

    Boost.Optional Must Go - 野良C++erの雑記帳 Boost.Optional Must Go (2) - 野良C++erの雑記帳 最近、何回かに分けて、 Boost.Optional について、(細かい)不満を日記に書いてきました。 これは別に Boost.Optional が嫌いだから不満を書いた訳ではなく、むしろ その逆、 Boost.Optional が便利な分、逆に不満点が目立つので書いていたわけですが、 よく考えたら、 Boost.Optional の便利さを、纏まった記事で書いていないなー、 と、そう思い至ったので、この辺で Boost.Optional を徹底的に推奨する記事でも書いてみようかな、 というわけで、さんざん既出なネタばかりですが、折角なので書いてみることにしましたよ。 冒頭に挙げた以外で参考になるような記事は、この辺でしょうか: C++

    それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳
    maraigue
    maraigue 2011/11/18
  • C++を知らないゲームプログラマ達 - Ideals and Reality

    マルチプラットホームライブラリを作ってみた。 ※リンク先pdf 有名なSEGAの著者、平山さんによる今年のCEDECでの講演内容である。 ゲームプログラマになる前に覚えておきたい技術 作者: 平山尚出版社/メーカー: 秀和システム発売日: 2008/11/14メディア: 単行購入: 112人 クリック: 3,473回この商品を含むブログ (193件) を見る 内容的には十分読み応えのあるのだが、一部釈然としないところもある。 主に4.9章の「標準ライブラリや言語機能について」というところから。 何故標準が嫌なのか ゲームプログラマはなぜかC++標準ライブラリを使わない。 いや、使おうとする人もいるが何かと理由をつけて使わない。 その理由が大体困ったような内容が多い。 リンク先でも書かれているが、vectorにはpush_back()やerase()がある。 そしてこれは安全性と性能の両

    C++を知らないゲームプログラマ達 - Ideals and Reality
    maraigue
    maraigue 2011/10/09
    quote{ゲームプログラマはなぜかC++標準ライブラリを使わない。いや、使おうとする人もいるが何かと理由をつけて使わない。その理由が大体困ったような内容が多い。}
  • C++03 と C++11 の互換性 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ

    C++03 と C++11 ってどれぐらい互換性があるのかなーと気になっていたんだけど、仕様書の §C.2 を見てみたらずばりなものが載っていたので、一通り読んでみた。 C++03 のコードを C++11 として動かそうとしたときにコンパイルエラーやランタイムエラーが発生したら、これを確認してみるといいかも。 新しい文字列リテラル R, u8, u8R, u, uR, U, UR, LR という新しい文字列リテラルが追加されたため、文字列と一緒にこれらのマクロを使った場合、互換性の無いコードになる可能性がある。 例えば以下のコードは互換性の無いコードである。 #define u8 "abc" const char* s = u8"def"; // C++03 なら "abcdef"、C++11 なら "def" になる ユーザはこの手の短いマクロをよく使うため、この問題はよく発生しそうに見

    C++03 と C++11 の互換性 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ
    maraigue
    maraigue 2011/08/26
  • 札幌C++勉強会#2を開催しました! - How to disappear completely

    札幌C++勉強会#2を開催しました。 OSCの時にも宣伝させていただいたこともあってか、多くの方に来ていただくことが出来ました。 参加された方々、ありがとうございます。 13:00〜13:15 準備 13:15〜13:45 開始、参加者自己紹介 13:45〜13:55 休憩(10分) 13:55〜14:25 セッション(Lapis)「Digest C++(仮)」 14:25〜14:45 休憩(20分) 14:45〜15:35 セッション(hotwatermorning)「例外安全入門」 15:35〜15:45 休憩(10分) 15:45〜16:15 セッション(H.Hiro)「C++のマクロはどこまで関数をいじれるのか(仮)」 16:15〜16:25 休憩(10分) 16:25〜16:45 LT、今後についての打ち合わせ 16:45〜17:00 片付け という予定でしたが、自己紹介の時間を

    札幌C++勉強会#2を開催しました! - How to disappear completely
    maraigue
    maraigue 2011/07/04
    "LTでは@ignis_fatuusさんがとんでもないエラーをみんなに見せつけて絶句させ、@nakayoshixさんがとてつもない数のおじさん称号をみんなに見せつけて絶句させ、@tututenさんが尋常じゃないコードゴルフのコードをみんなに見せ"
  • オープンソースカンファレンス2011 Hokkaidoに行ってきた。「後悔なんて、あるわけない」 - Bug Catharsis

    セミナーとか ・WebMatrix を使ってライブで作ろう! スマートフォン対応モバイル ASP.NET Web アプリ @jsakamotoさん。「オレのぐっときた」スマホアプリをライブコーディングでサクっと作る!坂さんがとても輝いていました。 ・テスト駆動開発による安心開発 ー「もう何も怖くない」 @shuji_w6eさん。マミられないように注意したい。田舎からの参戦はなかなか難しいけど、TDDBootCamp行ってみたいなー http://www.slideshare.net/shuji_w6e/osc2011-hokkaido-tdd ・これからの「言語」の話をしよう ―― 未来を生きるためのツール @nobuhisa_kさん。ミスチル&DBネタを散りばめつつ、初級者向けの内容でF#の魅力(主に並列処理推し)について語る。終盤は質問コーナーも。そしてあのドンちゃんも反応。F#ファ

    オープンソースカンファレンス2011 Hokkaidoに行ってきた。「後悔なんて、あるわけない」 - Bug Catharsis
    maraigue
    maraigue 2011/06/14
    quote{@shuji_w6eさん。マミられないように注意したい。田舎からの参戦はなかなか難しいけど、TDDBootCamp行ってみたいなー} quote{@hotwatermorningさん。とても魔法少女でした}