(訳注:2016/9/28、頂きましたフィードバックを元に記事を修正いたしました。) はじめに 本稿では、高速で汎用的なハッシュテーブルを作るために行う、設計についての多くの意思決定事項を紹介します。最終的に、私の emilib::HashSet とC++11の std::unordered_set の間のベンチマークが出来上がりました。もし、ハッシュテーブルに興味があって、自分で設計したいなら(どのプログラミング言語かに関わらず)、本稿がヒントになるかもしれません。 ハッシュテーブル は、素晴らしい発明です。 ならし計算量O(1) ( O(√N)時間 )で、挿入、削除、検索を行うことができます。ならし計算量とは、ハッシュテーブルの計算に平均でO(1)の計算量がかかることを意味しますが、時々、これよりも多くの時間がかかる場合があります。具体的には、ハッシュテーブルに空きがない場合で、挿入の
imguiとは imguiは、OpenGLやDirectXなどの描画環境の中で動くGUIフレームワークです(vulkanも?)。 "Immediate Mode GUI"と呼ばれるパラダイムにより、大変短く直感的なコードでGUIを構築できます。 どういうGUIコンポーネントが使えるかは、リポジトリのスクショを見ていただいたほうが良いかと思います。 デバッグや調整、テスト用のGUIを構築することが目的のフレームワークです。 環境 今回この記事ではwindows10, vs2015, Cinder(0.9.0)上でサンプルを作成しました。 Cinder用には専用のimgui拡張があるため、そちらを使用します。 https://libcinder.org/ https://github.com/simongeilfus/Cinder-ImGui 根本的な考え方や、imguiのAPIは同じですが、
Codeforces上位50名のテンプレート、C++のみ、敬称略、まとめはこちら。 tourist #include <bits/stdc++.h> using namespace std; テンプレートなし TooSimple #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <map> #include <set> #include <cassert> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_bac
In Visual Studio 2017 15.4 you can now target Linux from your CMake projects. This enables you to work on your existing code base that uses CMake as your build solution without having to convert it to a VS project. If your code base is cross-platform you can target both Windows and Linux from within Visual Studio. This post will give an overview of the CMake support for Linux in Visual Studio. You
C++初心者Advent Calendar 2015 この記事はC++初心者Advent Calendar 2015 17日目の記事です <<9日目 |Clang with Microsoft CodeGenがでたので試す <<16日目 | ブログズミ: Boost.Test v3 を使ってみた || 18日目 | それC++なら#defineじゃなくてもできるよ | とさいぬの隠し部屋 >> はじめに みなさま、ナマステ。さて、この記事のタイトルを見て、「時代・・・サトウキビ・・・忍者・・・うぅ、頭が」となった人は私と趣味が似ています・・・って話はどうでもいいか。 よく、「C++はBetter Cとしてはじめればいい」みたいな話を聞くのでそれにそって一気にC++14まで駆け抜けようと思います。 ちなみにC99を知らない人はお断りです。さようなら。 でははじめますか。 しっかし書き終わって
ホーム < ゲームつくろー! < デバッグ技術編 その6 CPPUnitを使ってテスト駆動型開発 前章からほぼ3年、気の長い話です(^-^;。 C++に限らず何かプログラムを作る時、特に意識しなければ、 1. つくりたい物(設計)を考える 2. クラス(機能)を作る → 一塊のモジュール 3. 動かしてみる(プロジェクトに加える) 4. うまく動かない時は修正 というプロセスを経てプログラムを大きくしていくと思います。しかし、この方法はそのうち変更に対する保守が難しくなってきます。それはクラスのメソッドを追加したり変更した時、その変更がどこでどう影響するかが分かりにくくなってしまうためです。 何か変更追加した後も、すでに実装されている箇所がちゃんと意図した結果を返してくれているか?それを判断する簡単な理屈は「何かテストする入力を与えてみて、その出力が予定通りかどうか判断する」です。以前は合
動的配列クラス std::vector とは std::vector とは C++ で標準に使用できるとっても便利な動的配列クラスでござるぞ。 通常配列と同じように [] 演算子で値を参照・代入することはもちろん、サイズ情報等の取得やデータの挿入削除なども可能だ。 「動的配列」とは配列サイズを自由に増減できるという意味。「可変長配列」と呼ばれることもある。 通常の配列は非常に便利で使用頻度の高いデータ構造だが、サイズを予め指定する必要があり、実行時に動的にサイズを変更することが出来ない。 例えば、「int data[100]; 」と宣言した場合、実行時にデータ数が100を超えるとお手上げだ。 スネークゲームでは、ヘビの胴体の長さがどんどん長くなるので、 胴体座標を動的配列で実装している。 これを普通の配列で実装すると、胴体の最大長を保持する可能性があるので、78*21=1638 のサイズの
概要 プログラム開発当初から過度のパフォーマンス最適化を行うのは良くないと言われている。 プログラムソースの柔軟性が失われる可能性があるし、必要無いかもしれない最適化に時間を費やすのは開発工数管理的に好ましくないからだ。 プログラムがある程度動作するようになり、パフォーマンスが悪い(実行速度が遅すぎる)場合は、 処理時間計測を行い処理時間を要している箇所を探しだし、アルゴリズムやデータ構造の変更などのパフォーマンス・チューニングを行う必要がある。 予備調査として、色々なアルゴリズム・データ構造を採用した場合の処理時間計測を行い、 どれが最適か、どのような性質があるかを知ることも重要である。 本稿では、上記のような目的のためにプログラムの処理時間を計測する方法について説明する。 場合によっては、ストップウォッチを片手にプログラムを実行し、処理時間を計測することもあるかもしれないが、 精度が1
ホーム < ゲームつくろー! < Programming TIPs編 その12 イテレート中のSTLのlistから要素を安全に削除する方法 STLのコンテナは「イテレータ」によって要素を取り出します。この時良くあるのが「ある要素をチェックして、必要が無くなった場合はリストから削除する」という作業です。例えば描画オブジェクトのリストからもういらなくなったオブジェクトを除く時などこの作業が必要になります。 イテレート中のリストから要素を除く場合、ちょっと注意しないと思わぬバグが誘発します。この章ではイテレート中のリストから要素を除く方法をまとめます。まさにTIPsです(^-^;。 ① まともにやるとあっさりバグ 例として、int型のリストに0~9までの要素がこの順番で登録されているとしましょう。このリストをイテレートして「5」を取り除きたいとして、次のようなコードを書きました:
#include<iostream> class Base{ public: virtual void print(){ std::cout << "Base" << std::endl; } virtual ~Base()=default; }; class Super : public Base{ public: void print() override{ std::cout << "Super" << std::endl; } }; int main(){ Base* array[2] = {new Base,new Super} ; array[0]->print(); array[1]->print(); delete array[0]; delete array[1]; return 0; } このプログラムを実行すると Base Super と出力されます。 Baseポイン
処理時間を計算するために使う関数はいくつかありますが、処理直前と直後の時間の 差分を計算するという点では基本的に使い方は同じです。用途に応じて使い分けてください。 GetTickCount() Windows起動からの経過時間をミリ秒単位で返す。精度は数十ミリ秒程度。 timeGetTime() 関数を使用するためにはwinmm.libをリンクし mmsystem.hをインクルードする。 GetTickCountと同様にWindows起動からの経過時間をミリ秒単位で返す。 timeBeginPeriod,timeEndPeriodを使うことで精度の調整をすることができる。 デフォルトで5ミリ秒に設定されており、最高で1ミリ秒の精度指定が可能 QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) LARGE_INTEGER構造体
後置インクリメントにはひと目で遅くなりそうな処理が見て取れますね。 前置インクリメントがインクリメント処理後、単純に自身の参照を返すのに対し、後置インクリメントではインクリメント前に一時オブジェクトの生成、そしてインクリメント後にはその前に生成した一時オブジェクトを値で返しています。 前置と後置では、単純にオブジェクトをコピーして返す分、普通に考えたら後置の方が遅いよね。というのが従来の認識でした。 「C++ Coding Standards -101のルール、ガイドライン、ベストプラクティス」の中でも、特に後置インクリメントの必然性が無い時は迷わず前置インクリメントを使うことが推奨されてきました。 元の値を必要としないときは前置形式の演算子を使おう __C++ Coding Standards (p50) 新たな主張 「ゲームエンジン・アーキテクチャ第二版」の中の一節を紹介します。 しか
このサイトのソフトおよびライブラリは 全てフリーです よかったら使ってやって下さい 当サイトはリンクフリーです。 last update 2010.02.13 更新履歴 伝説のお茶の間、略して「伝茶」です。 gmaruz@gmail.com G丸 001 テンプレートを使った汎用リストクラスを実現 します。 001-01 拡張リスト・ク ラス テンプレートを使ってXLIST<クラス名> 変数名; でリスト・クラスが出来ます 001-02 拡張リスト・ク ラス(ポインタリスト編) XLISTを拡張しポインタリストを作ります 001-03 拡張リスト・ク ラス(クイックリスト編) 高速push,popの可能なリストを作ります 001-まとめ 拡張リスト・クラス テンプレートを使った汎用リストクラスのまとめです 002 MIDI再生 002-01 MIDI 再生の基本 MIDI再
サルでき.jpは閉鎖しました。 今まで沢山の方々にお越しいただき本当にありがとうございました。 新しいサイト「サルでき.com」はこちらです。 また皆様とお会い出来るのを楽しみにしております。 サルでき.jp管理人 カワサキタカシ
この記事は Competitive Programming Advent Calendar Div2013 の 12 月 23 日の記事として書かれました. C++11 のすすめ C++03 は普段から使っているけども C++11 はまだ触ったことがない人向けの入門記事です.最近は多くのプログラミングコンテストで C++11 が使えるようになりつつあります.C++11 で大幅に C++ が書きやすくなっているので,ぜひこの記事を読んで C++11 を使い始めてください!この記事では C++11 に追加された多数の新機能のうちコンテストに役立ちそう(もしくは多くの人が使いそうな)機能を紹介します. 手元での実行の仕方 GCC もしくは clang を利用していれば -std=c++0x というオプションを追加すれば C++11 の機能が有効になります. $ g++ -std=c++0x -o
この記事は、新しい使い道が発見され次第、随時更新していく予定です。 はじめに C++0x では、関数テンプレートに対し、デフォルトのテンプレート引数を渡すことが出来るようになりました: http://d.hatena.ne.jp/faith_and_brave/20071105/1194259443 // 上記 URL から転載 template <class T, class U = double> void f( T t = 0, U u = 0 ); void g() { f(1, 'c'); // f<int,char>(1,'c') f(1) // f<int,double>(1,0) f(); // error: T cannot be deduced f<int>(); // f<int,double>(0,0) f<int,char>(); // f<int,char>(0
テンプレート関数 宣言 int f(int n); は、int 型変数 n を受け取り、int 型変数を返す。 C++ では、オーバーロードによって、この f(int n); 関数と、 double f(double v); C f(C c); などといった関数は区別されるが、もし、この3つの振る舞いが全く同じである場合、 すなわち、f(int n) や f(double n) で使用される演算子が、適切にオペレータ・オーバーロードされている 一般のクラス T に対しても動作させられるようにする場合、これを、 template<typename T> T f(T t); として代表させる事ができる。この f をテンプレート関数という。また、T をテンプレート引数という。 呼び出し テンプレート関数 f を使用する場合は、そのテンプレート引数 T に対して、型を指定し、 f<C>(t1);
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く