C++

googletestに付属するサンプルを読み解く

C++

こないだの続き。こないだは、samplesフォルダにあるsample1_unittestをビルドして、単体テストできていることを確かめた。今回は、その他のsample2〜sample10を同様にビルドして、sample1〜sample6の中身を読み解いてみる。sample7〜sample10は、残念ながら…

googletestを使いこなす

C++

最近のC/C++のテスト環境で人気があるのはgoogletest (=Google C++ Testing Framework)だと思われる。今回はCygwinでgoogletestを使ってみる。Linuxでも同じだと思われる。 準備 gtest-X.X.X.zipをgoogletest - Google C++ Testing Framework - Google Proje…

gprofを使いこなす

C++

C/C++のコードの速度を改善するときに有効な方法は、処理時間を多く消費する関数を見極めて、その関数を改善することである。どの関数が(1)どれだけ処理時間を消費するか、(2)何度呼ばれているか、(3)どの関数を呼んでいる/どの関数に呼ばれているか、などを…

VC++でUnicode文字の出力を試みる→MessageBoxでの出力はできたけど標準出力の方法分からず

C++

前回の記事に引き続いて、VC++で日本語文字を扱う方法についてあれこれ調べている。調べれば調べるほど、開いてはいけない蓋を開いているような気がしてならない。 今回はUnicode文字をVC++で出力することを目指した。結論から言うと、MessageBoxを使ってポ…

C/C++での日本語文字列の扱い、どうすればよいか

C++

C/C++でどう日本語の文字列を扱えばよいのか、いまだによく分かっていない。頭を整理するために、自分が理解している範囲のことを一度まとめてみる。嘘を書いているかもしれない。また、環境はWindowsのみを想定している。 マルチバイト文字列とワイド文字列…

代替トークンを使ってC++っぽくないC++コードを書く

C++

C/C++には代替トークン(alternative tokens)なるものがあることを知った。まず下のコードを見てほしい。 %:include <iostream> using namespace std; int main() <% int array<:100:>; for (int i = 0; i < 100; ++i) <% array<:i:> = i; if ( i % 3 == 0 and (not i % 5 == 0)) <%</:i:></:100:></iostream>…

C++11のthreadで遊んでみる その3 - condition_variable編

C++

この記事は続き記事です。目次→C++11のthreadで遊んでみる - minus9dの日記 - 今回はC++11のcondition_variableを使ってみる。condition_variableは日本語ではそのまま条件変数と訳される。条件変数は、あるスレッドを待ち状態にして、ある条件が揃ったとき…

GCC 4.7.3でC++11のsleep_for()を呼ぶとコンパイルできない件

C++

Cygwin + GCC 4.7.3 な構成で、C++11のstd::thread::sleep_for()を使ってみようと以下のコードを書いた。 #include <thread> #include <chrono> int main() { std::this_thread::sleep_for(std::chrono::milliseconds(300)); return 0; } 以下のコマンド g++ -std=c++11 slee</chrono></thread>…

C++11のthreadで遊んでみる その2 - mutex編

C++

この記事は続き記事です。目次→C++11のthreadで遊んでみる - minus9dの日記 - mutexを使って排他制御 スレッドを4つ作って、それぞれのスレッドでIDを表示するプログラムを書いてみる。 #include <iostream> #include <thread> #include <vector> void worker() { std::cout << "thread</vector></thread></iostream>…

C++11のthreadで遊んでみる

C++

この記事は続き記事です。 第1回:この記事 第2回:C++11のthreadで遊んでみる その2 - mutex編 - minus9dの日記 第3回:C++11のthreadで遊んでみる その3 - condition_variable編 - minus9dの日記 - C++11の標準ライブラリではスレッドのためのライブラリが…

C++のconstの復習

C++

よくわからなくなるのでメモ。 ポインタ変数につけるconst ポインタ変数に対してconstをつけるときは、場所によって効果が違う。 #include <iostream> using namespace std; int main(){ int a = 100; int b = 100; // ポインタが指す先を変更できない const int* p = </iostream>…

C++11のunordered_setと、setとの所要時間を比較する

C++

C++11の標準ライブラリで新たに加わったunordered_setの練習として、従来のsetとの速度比較を行ってみる。unrodered_setは、setと異なり、挿入した数字をソートせずに保存する。この性質はPythonのDictionaryやPerlのHashと同じ(はず)。単に出現した値を記…

C++11で、chronoライブラリを使って時間を計測する

C++

C++11で新しく加わったchronoライブラリを使うと、簡単に経過時間が計測できる。もう環境依存のコードを書かなくてよくなるなら嬉しい。サンプルコードは以下。シンプルなのですぐわかると思う。 #include <iostream> #include <chrono> int main() { auto start = std::chrono</chrono></iostream>…

今すぐに使いたいC++11の新機能

C++

最近導入の敷居が下がってきたC++11に興味が湧いてきた。C++11の新機能を眺めてみると、正直半分くらいの項目はよく理解できないのだが、いくつかの項目は"Better C++"としていますぐにでも使いたいものであった。今回は導入の効果が高そうなC++11の新機能を…

MacのClangでC++11を試すには clang++ -std=c++11 -stdlib=libc++ としてみよう

C++

MacのClangもアップデートできたので早速C++11を試す。unordered_setという機能を使ってみようと、main.cppに #include <unordered_set> ...と書き $ clang++ -std=c++11 main.cppとビルドを試みるも、以下のエラーが出てコンパイルに失敗。ヘッダファイルが見つからないら</unordered_set>…

C/C++のポインタと参照、右寄せか左寄せか

C++

CやC++でポインタ変数を宣言するとき、次の2通りの書き方はどちらもコンパイルが通る。 int *p1; // 右寄せ int* p2; // 左寄せ 自分は右寄せで書くことが多い。理由は特にない。最初にCを勉強するときに使った教科書が右寄せのスタイルをとっていたから、と…

グラフのすべての2頂点間の最短路をワーシャルフロイド法で求める

ワーシャルフロイド法というのを使うと、グラフのすべての2頂点間の最短路を求められるらしい。蟻本を参考にして解いてみた。以下のグラフを例にとって、全点対の最短路を求める。 コードは以下。 #include <cstdio> #include <algorithm> #define REP(i,n) for(int i = 0; i < </algorithm></cstdio>…

C++で、重複順列を全列挙する

異なるn個のものから、重複を許してr個を取り出して列をつくることを、n個からr個とる重複順列という。これをC++で全列挙することを考える。例題として、1〜5の数字を使ってできる3桁の数字を全列挙することを考える。そのコードは以下の通り。 #include <iostream> #i</iostream>…

VC++のコンパイルをコンソールで実行

Visual Studio 2012 Expressの場合。 すべてのプログラム→Microsoft Visual Studio 2012→Visual Studio Tools→Developer Command Prompt for VS2012をクリック コンソールが立ち上がる where clと打ちEnter 以下のようにパスが表示されればOK C:\Program Fil…

STLのaccumulate()を使うときはオーバーフローに気をつける

C++

STLにはvectorの各要素の数の和を出力するaccumulate()という便利関数があるが、気をつけないとオーバーフローによりはまってしまう。その例として以下のコードを見ていただきたい。コードの意図は、1000000000 + 1000000001 + ... + 1000000009を計算してsu…

structのtypedef, CとC++での違い

C++

もしかしたら長らく勘違いしていたかもしれないこと。 Cの場合 Cでは構造体を定義するのに以下のように書く。 struct data_t { int num1; int num2 }; この構造体の変数を宣言するときには以下のように書く。 struct data_t d; でも毎回struct data_tって書…

プログラムコンテスト用のマクロ

C++

これまでプログラムコンテスト参加時にあまりマクロは使わないようにしていたが、上位陣のコードを読むときに必須だということで、今後は自分でも使えるようにしようかと考え中。上位陣が多く使っていそうなマクロを集めた。__typeofを使ってイテレータの型…

C++で構造体をソートする4つの方法(おまけあり)

C++

自分で定義した構造体data_tをvectorにつっこみ、STLのsort()関数でソートすることを考える。以下のように書いてコンパイルを試みると、読解不能な大量のエラーメッセージとともにコンパイルが失敗する。 #include <iostream> #include <string> #include <vector> using namespace std</vector></string></iostream>…

STLを使って文字列を小文字化

C++

std::transform(str.begin(), str.end(), str.begin(), ::tolower); というのを使うと一行で書けるらしい。 #include <algorithm> #include <iostream> #include <string> int main(){ std::string data = "jAnUaRY"; std::cout << data << std::endl; // 文字列中のすべての大文字を小文</string></iostream></algorithm>…

VS2010でLNK1123エラーが出たら、SP1にしてみよう

C++

久しぶりにVisual Studio Express 2010でC++のプロジェクトをビルドしようとすると、以下のビルドエラーが出てビルドできなかった。 LINK : fatal error LNK1123: COFF への変換中に障害が発生しました: ファイルが無効であるか、または壊れています。LNK112…

vector2個の積集合を取る

C++

C++ではset_intersection()を使うと積集合をとることができる。ただし、ちょっと使いにくい。後半で紹介する、inserterと組み合わせる方法の方がよさそう。 準備 set_intersection()を使って2つのvectorの積集合を求める前に、それぞれのvectorをあらかじめ…

STLのvectorから同一要素を削除

C++

1つ目の方法は、sortして、uniqueして、eraseする方法。uniqueは、vectorの要素のうち、となり合う同じ要素をまとめて一つにする関数。しかしuniqueを使うだけでは末尾にゴミが残るので、そのゴミをeraseで削除する。覚えるのは少し大変。 #include <vector> #includ</vector>…

swap技法

C++

2012/6/21追記:faith_and_brave様からコメントを頂きました。C++11からは、swap技法と同じことがshrink_to_fit()というメンバ関数でできるそうです。貼っていただいたURLもぜひ御覧ください。コメントありがとうございました。Effective STLで知ったネタ。S…

vectorとsetを相互に変換

C++

STLのvectorとsetは、コンストラクタを使うと互いに簡単に変換することができる。 #include <iostream> #include <vector> #include <set> using namespace std; void printVector(vector<int> &vec){ cout << "size = " << vec.size() << endl; for(int i = 0; i < vec.size(); ++i){ co</int></set></vector></iostream>…

mapのキーにvectorが使える

C++

またSTLネタ。ちょっと意外な感じがするが、実際に試すと確かに使える。 #include <vector> #include <map> #include <iostream> using namespace std; int main(void){ map< vector<int>, int > m; vector<int> vec; vec.push_back(2); vec.push_back(3); vec.push_back(5); vector<int> vec2; vec</int></int></int></iostream></map></vector>…