タグ

ProgrammingとC++に関するagwのブックマーク (503)

  • C++11のthreadで遊んでみる - minus9d's diary

    この記事は続き記事です。 第1回:この記事 第2回:C++11のthreadで遊んでみる その2 - mutex編 - minus9dの日記 第3回:C++11のthreadで遊んでみる その3 - condition_variable編 - minus9dの日記 - C++11の標準ライブラリではスレッドのためのライブラリが追加されたという。これまでWindows系では_beginthreadex()、Linux系ではpthread_create()、などと関数を使い分ける必要があったのでうれしい。今回はC++11のスレッドライブラリを使って何ができるかを探ってみたいと思う。 参考にしたのは、書籍 C++ ポケットリファレンス。今のところどの日語のウェブサイトよりもまとまった情報源だと思う。また、この書籍のサンプルコードがcpp-pocketref/sample-code · GitH

    C++11のthreadで遊んでみる - minus9d's diary
  • ドワンゴのプログラミングコンテストをクリアできなかったお話

    dwangoプログラミングコンテスト2016 ドワンゴが主催するプログラミングコンテストの予選が、24日に行われたそうだ。筆者はクリアできなかったが、簡単なものだけ解説する。格的な解説が読みたい人は、わざわざこの記事を読まずとも、以下で解説されているようだ。 「dwangoプログラミングコンテスト」予選問題解説 // Speaker Deck A: プレミアム会員 - dwangoプログラミングコンテスト | AtCoder ニコニコ動画には、プレミアム会員という制度があります。このプレミアム会員制度には月額一定の額を支払うことで加入できます。 ニワンゴくんは、この n ヶ月間連続してプレミアム会員です。 また、x ヶ月前に月の一定支払い額が 525 円から 540 円に変わったことを知っています。 つまり、この n ヶ月のうち最近の x ヶ月間は月額 540 円支払っていて、それ以外の

  • std::beginとstd::endの使い方 - Faith and Brave - C++で遊ぼう

    コンテナからイテレータを取り出すstd::begin()関数とstd::end()関数は、テンプレート外では名前空間修飾を付けて呼び出す使い方でいいが、テンプレート内で使用する場合は、using宣言した上で名前空間修飾なしに呼び出す必要がある。(std::swap()と同じ) #include <iterator> template <class Range> void f(const Range& r) { using std::begin; using std::end; auto first = begin(r); auto last = end(r); // use first, last... } #include <vector> int main() { std::vector<int> v = {1, 2, 3}; int ar[] = {4, 5, 6}; f(v); f

    std::beginとstd::endの使い方 - Faith and Brave - C++で遊ぼう
  • Advance iterator for the std::vector std::advance VS operator +?

  • C++の正規表現ライブラリ: std::regex

    いまさらながら、C++の正規表現ライブラリを調べている。 C++の正規表現ライブラリ、std::regexは、boost::regexを土台に設計されている。boost::regexの正規表現の文法は、perlなのに対し、std::regexは、ECMAScriptである。この理由は、しっかりと正規表現の文法が定義されていて、外部規格として参照できる品質のものが、perlには存在しないためだ。std::regexはposixと拡張posixとawkとgrepとegrepの正規表現にも対応している。 記事では、ECMAScriptの正規表現を使う。また、参考のためのECMAScriptのコードも使う。 全体一致 文字列全体が正規表現に一致するかどうかを調べたいとする var re = /1234/ ; var text = "1234" ; var result = re.test( te

  • 連想配列 std::unordered_map を使用する - C++ プログラミング

    C++11 では、キーと値をセットで管理する連想配列を簡単に利用できる std::unordered_map<> というテンプレートクラスが用意されています。 これを使用することで、キーに対する値を追加したり削除したり、挿入したりといったことが簡単にできます。テンプレートクラスなので、任意のデータ型を扱えるのも便利です。 ここでは、その std::unordered_map<> の基的な使い方について見て行きます。 ちなみに、std::unordered_map<> は、キーを登録した順番とは関係なく(ハッシュを使って)格納するタイプのものになります。 キーを順番通りに(キーと値を辞書的順序で)格納したい場合は <map> ヘッダーに定義されている std::map<> を使用します。std::map<> と std::unordered_map<> の使い方は基的に同じです。 また、

  • mapとunordered_mapのアイテム全走査の比較とmapの存在意義について考える - シリコンの谷のゾンビ

    過去の記事でvectorに比べてmapの全走査が遅いという比較を行ったことを思い出し,そういえばunordered_mapとの比較をしていなかったので比較をすることにした. 過去の記事 mapとvector&lt;pair&gt;を走査する速度の違い - 睡眠不足?! 前回のコードに以下のようなコードを追加して実験. 今回は以下のようなデータ構造を追加 (a) unordered_map (b) vector + map (c) vector + unordered_map (b)や(c)は,keyのデータを別途vector配列に入れておいて,そちらを走査しながらmapを引くというコードをよく書いているので,これやるとどんくらい遅くなるのだろうということを調べるため. 前回のコードとのdiffはこんな感じ. 6d5 < #include <unordered_map> 46,47d44 <

    mapとunordered_mapのアイテム全走査の比較とmapの存在意義について考える - シリコンの谷のゾンビ
  • C++ 速度比較(7) unordered_map,mapの違い、速度の面から検討する - のんびりしているエンジニアの日記

    皆さんこんにちは お元気ですか。ふらふらしてます。 さて、今日は速度比較を行おうと思います。 概略については前回の記事を参考にしてください 実験 実験内容 1、全てをループした時に速度がどうなるか →iterater と foreach それぞれで検証するので4種類 10000000000回のループで検証 2、アクセスに差が出るのか →アクセスする場所(?)によって差が出るのか。atメソッド含めて5種類 0とN-1にアクセスした時で差が出るのかわからない。また一種類だけatメソッドを混入する。 1000000回のループで検証 実験環境 結果 全出力 algorithm time(秒) unordered_iterator 212.942 unordered_foreach 75.5393 map_iterator 484.02 map_foreach 313.835 アクセス algori

    C++ 速度比較(7) unordered_map,mapの違い、速度の面から検討する - のんびりしているエンジニアの日記
  • C/C++を高速化する10のコーディングテクニック

    Guides, HowTos and Tips for Technology Geeks - The Geek Stuff The Geek Stuffは「10 Tips for C and C++ Performance Improvement Code Optimization」において、C/C++のコードを高速化するための10のティップスを紹介した。プログラミング言語の学習当初はとりあえず動くものを作ることが最優先だが、次のステップとしてセキュリティやメモリ消費、パフォーマンスなどを加味してコーディングする必要があると指摘されている。ここではパフォーマンスに焦点を絞って説明が行われている。 同サイトで取り上げられているテクニックは次のとおり。 適切なアルゴリズムを使用する メモリ消費という観点からコードの最適化を実施する coutやcinの替わりにprintf系やscanf系の関数を

  • 今こそ再考察! C言語ポインタ徹底解説

    宣言文の記述 次のように宣言すると、「配列へのポインタ」と「2次元配列」ができます。 char (*pa)[5]; ← 「char型を要素とする配列(要素数5)」へのポインタpaを宣言 char aa[3][5]; ← char型を要素とする、3×5の2次元配列aaを宣言 この宣言の結果は、図5、図6のとおりです。 ここで、「配列へのポインタ」の宣言の「char (*pa)[5];」は、次のように考えます。 あるpaという名前のものがある ↓ paはポインタであり、paが指し示す先(*pa)は、何らかの要素数5の配列全体である ↓ その配列の各要素「(*pa)[x]」はchar型である 「配列へのポインタ」は、単に配列の先頭アドレスを指したポインタではありません。このポインタ(pa)は所定の大きさの配列全体を指しており、paをインクリメントすると、paが指し示す配列のサイズ分(5バイト)、

    agw
    agw 2014/12/11
    配列へのポインタについて。
  • マイクロソフトは、C++でいかにしてMicrosoft Officeのクロスプラットフォームを実現したのか

    マイクロソフトは、C++でいかにしてMicrosoft Officeのクロスプラットフォームを実現したのか マイクロソフトはOfficeソフトウェアのマルチプラットフォーム展開を進め、Windows版、Macintosh版だけでなくWebから使えるOffice Onlineに加え、iPad版、Android版も公開を始めました。 Officeのような大規模なアプリケーションのマルチプラットフォームへの移植は、どのようにして行われているのか。9月に米国で開催されたC++言語のイベント「CppCon 2014」で行われた同社の講演「How Microsoft Uses C++ to Deliver Office (and More) Across iOS, Android, Windows, and Mac, Part I 」がYouTubeで公開されています。 Officeのコア部分はC++

    マイクロソフトは、C++でいかにしてMicrosoft Officeのクロスプラットフォームを実現したのか
  • std::shuffle()の経緯 - Faith and Brave - C++で遊ぼう

    C++11のヘッダでは、既存のstd::random_shuffle()に加えてstd::shuffle()という関数が入りました。std::shuffle()の方は、C++11の乱数生成エンジンを受け取りやすいというのが特徴です。 template<class RandomAccessIterator, class UniformRandomNumberGenerator> void shuffle(RandomAccessIterator first, RandomAccessIterator last, UniformRandomNumberGenerator&& rand); 経緯を調べてみると、std::shuffle()は元々std::random_shuffle()という名前でした。 これはConcept-basedオーバーロードで既存のstd::random_shuffle

    std::shuffle()の経緯 - Faith and Brave - C++で遊ぼう
  • C++のコンパイルとリンクがあまりに遅いのでカッとなって原因と対策を調べてみた - Qiita

    # pragma once // 二重インクルード防止 # include "classA.h" // クラスAのヘッダ →継承してるので必要 // #include "classB.h" // クラスBのヘッダ →前方宣言できるのでcppにインクルードをかけば良い。 # include "classC.h" // クラスCのヘッダ →実態をメンバに持ってるので必要 // #include "classX.h" // そもそもヘッダで使ってない(もしcppで使ってる時は、cppに書くだけでOK) class classB; // 定義がポインタであれば前方宣言だけでOK class classD : public classA { public: ~ private: classB* m_pClassB; // ポインタ classC m_classC; // 実態 }; 継承している場合

    C++のコンパイルとリンクがあまりに遅いのでカッとなって原因と対策を調べてみた - Qiita
  • 左と右の話

    DevLOVE X Day1 C-5のセッションです。 ITの活用範囲の広がりとともに、費用・品質よりもデリバリを優先するプロジェクトも増えてきました。しかし「しっかり考えるよりも、作ってリリースしちゃおうぜ、正解なんて誰にも分からないんだから」というマントラを唱えながら、返済見込みの立たない大量の技術的負債を抱える。それが最善の選択なのか、もう少しだけ立ち止まって考えてみませんか? YAGNIという言葉を便利に使いすぎてはいませんか? コードを書きなぐるのと、ちょっと考えて設計して作るのとで、そんなに開発スピードに違いがありますか? 考えてみたいと思います。

    左と右の話
  • クラスの「継承」より「合成」がよい理由とは?ゲーム開発におけるコードのフレキシビリティと可読性の向上 | POSTD

    コード構造における重要な問題として、複数のクラスを共有する場合に合成と継承のどちらを用いるかという点があります。“has a”の関係と、“is a”の関係と言われる2つの対比です。例えば、“ソファには綿が入っている”と、“ソファは家具である”という違いのようなものです。この例では2つの違いは非常に明白ですが、実際には、“has a”の関係でも“is a”の関係でも意味を成すケースがたくさんあります。ゲームのキャラクターについて、これはコリジョンボックスを持っているかと聞くのと、これは衝突可能なオブジェクトかと聞くような場合です。この2つは全く同じことではありませんが、それぞれが(または両方一緒に)衝突を処理する主構造として用いられ、どちらの方がよいかは必ずしも明白ではありません。私の経験では、直感的には継承の方がよいと思うことも多いのですが、それだと問題がたくさんあって結局は合成の方がよか

    クラスの「継承」より「合成」がよい理由とは?ゲーム開発におけるコードのフレキシビリティと可読性の向上 | POSTD
  • Fisher-Yates Shuffle - Faith and Brave - C++で遊ぼう

    Fisher-Yates Shuffle – An Algorithm Every Developer Should Know てきとうに抜粋して書く。 以下のシャッフルアルゴリズムは間違っていて、 def incorrect_shuffle(items): for i in range(len(items)): randomIndex = random.randint(0, len(items)-1) temp = items[randomIndex] items[randomIndex] = items[i] items[i] = temp return items これには、以下の3つの問題がある: 偏る 偏る 偏る 実は1つだったけど、これは大きな問題だ。 Fisher-Yates Shuffle (Knuth Shuffleとも呼ばれる)の実装は、以下のようになる: def fi

    Fisher-Yates Shuffle - Faith and Brave - C++で遊ぼう
  • コピーコンストラクタ、代入演算子、デストラクタ - たーせる日記

    C++のためのAPIデザイン』のp.210には、こんな記述があります。 C++の初心者が陥りやすいのは、リソースを割り当てるクラスを作り、それに伴いデストラクタは用意したが、コピーコンストラクタと代入演算子を定義しないことだ。 というわけで、今日はコピーコンストラクタと代入演算子の定義がないと何が起こるのかについて実験してみます。 きっかけ 『ゲームプログラマになる前に覚えておきたい技術』のp.520には即死サンプルという不穏当なコードが掲載されています。 #include <vector> using namespace std; class A { public: A() { mX = new int(); } ~A() { delete mX; } int* mX; }; vector< A > gA; // グローバルにvector void add() { // 配列に足す関数

    コピーコンストラクタ、代入演算子、デストラクタ - たーせる日記
  • C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう

    C++14で導入されるdecltype(auto)を使うと、returnとreturn (…)で戻り値の型が変わる。前者は値、後者は参照となる。 decltype(auto) f() { static int value = 3; return value; } decltype(auto) g() { static int value = 3; return (value); } int main() { int f_result = f(); int& g_result = g(); } 参照 C++11/14 and return( … ) vs return - StackOverflow C++14 通常の関数の戻り値型を推論

    C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう
  • vector の話 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ

    vector は vector に対して特殊化されていて、領域を無駄にしないように、ビット単位で格納されるようになっています。 これは使用する領域が少なくなる反面、 &v[0]+i == &v[i] であるという、vector としての特徴の一つを満たさなくなってしまいます。 他にもいくつか、bool 以外の vector と異なる動作をする箇所があります。 そのため、Twitter掲示板等で vector の話が出るたびに必ずといっていいほど「あれは使うな。失敗作だ」とか「あれはもう忘れろ」という趣旨の発言が見られます。 そういった場面に遭遇するたびに自分は微妙な気分になります。 実際のところ、「大量のビットを格納したいけれどもメモリを無駄にしたくない」という状況がある*1とき、vector 以外の選択肢はどの程度あるんでしょうか? まず自分で作るという選択肢、これはほとんどの場合は

    vector の話 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ
  • トライグラフ - Wikipedia

    C言語におけるトライグラフ (日: 3文字表記[1]・英: trigraph) とは、ISO 646 に共通して含まれる文字だけでソースコードを書くための表記法である。 C言語のソースコードはASCIIの文字セットを用いて表記されるが、ISO 646で自由に文字を割り当てられる領域の文字まで使う文法となっている。特に、括弧類が別の文字に置き換わっているとソースコードの表記がしづらくなるので、ISO 646で自由割り当てでない文字を3つ組み合わせることで、それらの文字を表すこととした。これが3文字表記である[2]。