C++

multiset, multimapを使うにはset, mapをinclude

C++

しょうもないネタですが他にもハマる人がいるかもしれないので記事にします。C++11から導入されたstd::multiset, std::multimapを使おうと以下のコードを書きました。 #include <multiset> #include <multimap> しかしg++で以下のエラーが出ます。 致命的エラー: multimap: No su</multimap></multiset>…

Travis CI にて、C++11のソースをgccとclangの両方でビルドする

githubのレポジトリと簡単に連携できる継続的インテグレーションサービスであるTravis CIを使って、C++11で書かれたソースコードをテストできるようにしました。想像以上に大変だったのでメモしておきます。 ソースコードとテストコードの準備 Travis CIで提…

cmathをincludeするとy0, y1などのグローバル変数が使えなくなる問題

C++

一見問題なさそうな以下のコード #include <cmath> int x1, y1; int main() { x1 = 10; y1 = 5; return 0; } を、例えばVisual C++ 2015でコンパイルしようとすると、以下のエラーが出て失敗します。 main.cpp(3): error C2365: 'y1': redefinition; previous defin</cmath>…

Modern C++でのクラスに関する私的メモ

C++

C++のクラスについて理解があやふやなので、調べたことを以下にまとめます。C++11以降をターゲットにしています。 特殊メンバ関数 (Special member functions) 以下に、メンバ変数を2つとメンバ関数を1つのみ持つ単純なクラスを含むサンプルを示します。 #in…

gdbでvectorなどの中身をprintする

C++

gdbでvectorなどSTLのコンテナの中身をprintしようとすると、例えば以下のようにうまく表示できません。 (gdb) p x1 $1 = {<std::_Vector_base<int, std::allocator<int> >> = { _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x8003b9e8, _M_finish = 0x8003b9fc, _M_end_of_storage …</no></no></__gnu_cxx::new_allocator<int></std::allocator<int></std::_vector_base<int,>

C++11で、std::tie()を使って複数の変数への代入を1行で行う

C++

スクリプト言語だと、複数の変数への代入を1行で行えることが多いです。以下はPythonの例。 a,b,c = 10, 7.7, "hello" print(a,b,c) これと同じことをC++11でも行うには、std::tie()を使います。 #include <iostream> #include <tuple> using namespace std; int main(){ int </tuple></iostream>…

lower_bound(), upper_bound()の練習帳

C++

事前準備 数列は昇順にソートされている必要があります。 #include <iostream> #include <algorithm> int main() { std::vector<int> nums{1,1,1,1,2,2,3,3,3,4,4,6,6,6}; std::sort(nums.begin(), nums.end()); .... } 要素の数を数える 「3より小さい要素数」「3以下の要素数」を数え</int></algorithm></iostream>…

C++11のラムダ関数の簡単なまとめ

C++

C++11で導入されたラムダ関数を使えるようになるための簡単な覚書です。 ラムダ関数とは? 名前のない関数のことです。無名関数と呼ばれることもあります。 わざわざ関数を定義するほどのこともない、ちょっとした処理を行いたいときに使われることが多いで…

C++で1文字の繰り返しからなる文字列を作る

C++

C++で"aaaaa"などのように単一文字の繰り返しからなる文字列を簡単に作るには、以下のようにstringクラスのコンストラクタを利用します。 #include <string> ... std::string(5, 'a') ... これは、「長さ5の文字列を作り、'a'で埋める」という意味になります。 例と</string>…

Visual Studioのコードスニペット機能を使って高速にコードを書く

常識かもしれないのですが、Visual Studioのコードスニペット機能にいまさら気が付きました。 例えばC++の場合、classと打鍵してからTabを押すと、自動的に以下のコードスニペットが挿入されます。 class MyClass { public: MyClass(); ~MyClass(); private:…

Visual Studioで、namespaceのブロック内をインデントしないようにする方法

従来のVisual Studioでは、namespaceで囲ったブロック内が強制的にインデントされました。しかし、Visual Studio 2013のUpdate 2から(?)、インデントしないように設定できるようになったようです。(参考:Option to stop indenting namespaces in C++ code …

C++のvalarrayという不遇なライブラリ

C++

きっかけが何だったか忘れましたが、C++にはvalarrayという数値計算用のライブラリがあることを知りました。numpyやMatlab/Octaveのように、array同士の足し算ができたりします。 #include <iostream> #include <valarray> using namespace std; int main(){ valarray<int> v1(10, 3);</int></valarray></iostream>…

SIMD命令を使って高速に計算する

C++

マルチコアを用いた画像処理 from Fukushima Norishige このスライドに出てくるSIMD命令を試したくなったので試してみました。 IntelのCPUでSIMD命令を使う場合、SSEという命令セットと、その後継であるAVXという命令セットのどちらかを使うことになると思い…

C/C++11で直角三角形の斜辺の長さを求める関数hypot()

C++

ピタゴラスの定理を使うと、直角三角形の直角を挟む二辺の長さから、斜辺の長さを計算できるのはおなじみでしょう。それを計算してくれる関数がmath.hまたはcmathで提供されているhypot()です。 以下はC++11の例です。 #include <iostream> #include <cmath> using namespace </cmath></iostream>…

C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか

C++

数字から文字列 スクリプト言語でよくある、数字を文字列に変換する関数がC++11でも提供されています。std::to_string(100)などと書くだけで数字が文字列に変換できます。 #include <iostream> #include <string> int main() { std::string str = "Holland, " + std::to_string</string></iostream>…

g++のレアなエラー「前のエラーにより混乱していますので、脱出します」

C++

人間味あふれるエラーに初遭遇したのでご報告します。現時点でGoogle検索すると792件。 エラーを起こす方法。Windows 7 + Cygwin + g++ 4.8.2にて、g++ -std-std=c++11というコマンドで以下のコードを実行。何重にもミスがあるひどいコードである。 #include <vector></vector>…

Visual StudioでDLLを作る&使うサンプル

DLLの作り方と、DLLを呼び出すプログラムのサンプルをgithubに上げました。Visual Studio 2013 Expressがあればビルドできます。 minus9d/DllSample 以下の書籍を全面的に参考にしました。 APIで学ぶWindows徹底理解 (日経BPパソコンベストムック) p102~p109…

Linuxのターミナルにて、アニメーションを表示する

C++

昨日の記事と似たような感じで、エスケープシーケンスを使ってアニメーションを表示することもできる。今回もLinux系のターミナルでないとうまくいかないはず。 アニメーションには、printf("\033%dA", 10)とするとカーソルが10行分上に上がることを利用する…

Linuxのターミナルにて、C言語の出力に色を付ける

Linuxのターミナルにて、C言語の出力に色を付ける方法。c - Making some text in printf appear in green and red - Stack Overflowより。Windowsだとうまくいかないはず。 #define RESET "\033[0m" #define BLACK "\033[30m" /* Black */ #define RED "\033…

Segmentation Faultの傾向と対策

C++

C/C++のコードを書いてよく遭遇するのがSegmentation Fault、通称セグフォ。その傾向と対策をまとめてみた。 傾向 セグフォがよく起こるのは以下のとき。 メモリ違反 見てはいけないメモリ領域を参照したときに起こる。コード例は以下。 #include <stdio.h> int main(</stdio.h>…

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 <iostream> #include <string> int main(){ std::string data = "jAnUaRY"; std::cout << data << std::endl; // 文字列中のすべての大文字を小文字に変換 st</string></iostream>…

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>…