C++

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

mapでキーの有無を調べるには、find()よりcount()が便利

C++

mapコンテナ(mとする)でキーの有無を調べる場合、今まではメンバ関数のm.find()を呼ぶ方法を使っていた。m.find()を使う方法では、「m.find()の戻り値がm.end()に等しければキーが存在しない、そうでなければキーが存在する」としてキーの有無を判別していた…

STLのコンテナから要素を削除する

C++

STLのコンテナの種類によって、要素の削除の仕方もいろいろ。 vectorの場合 erase-remove idiomと呼ばれるテクニックを使う。このテクニックでは、特定の値に一致する要素を消すときにはerase()とremove()とを、また特定の条件に一致する要素を消すときにはe…

コードを短くするちょっとした工夫

C++

プログラミングコンテストに参加して他の人のコードを見る機会が増えてから、短くコードを書くノウハウが少しずつ身についてきた。 ループを回しながら最大値を更新 普通に書くと以下のようなコードになる。 int high = 0; for (int i = 0; i < n; ++i){ int…

小数点以下n桁を表示する

C++

Cだと double num = 100.123456789101112; printf("%.10lf\n", num); で簡単に小数点以下10桁を出力できる。だが、C++だとそうはいかない。 #include <cstdio> #include <iostream> #include <iomanip> using namespace std; int main(void){ double num = 100.123456789101112; printf(</iomanip></iostream></cstdio>…

lower_bound(), upper_bound()

C++

いつか制覇しようと思っていたlower_bound()とupper_bound()。C++編(標準ライブラリ) 第18章 並べ替えのアルゴリズムを読むことで理解できた。以下のように考えると分かりやすい。 lower_bound() と upper_bound() はともに、すでに昇順にソート済のコン…

vector同士の比較

C++

2つのvector同士を==で比較すると、すべての要素が同じときtrue、一つでも異なる要素があるときfalseを返してくれるらしいことに気づいた。 #include <vector> #include <iostream> using namespace std; int main(void){ int _vector[] = {3, 5, 7}; vector<int> vec1(&_vector[0],</int></iostream></vector>…

C++の文字列操作 その3

C++

以下、すべて #include <iostream> using namespace std; と書いてあるものとする。 文字列の置換 replace()を使う。取りうる引数はいろいろあるけど、多分一番使うのは以下の例。 string str = "Today is April 19."; str.replace(9, 5, "May"); // strのindex9から5</iostream>…

C++の文字列操作 その2

C++

昨日の続き。以下、すべて #include <iostream> using namespace std; と書いてあるものとする。 文字列中の文字を一文字ずつ走査 string str = "abcde"; for(int i = 0; i < (int)str.size(); ++i){ char ch = str[i]; } 部分文字列の生成 substr()を使う。第一引数で</iostream>…