C++

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

C++の文字列操作

C++

以下、すべて #include <sstream> #include <iostream> using namespace std; と書いてあるものとする。 数字から文字列へ変換 int i = 10; ostringstream sout; sout << i; string s = sout.str(); cout << s << endl; 文字列から数字へ変換 string str = "123.456"; istringst</iostream></sstream>…

小数の剰余

C++

整数の剰余には%を使う。しかし小数には使えない。どうすれば良いか。 #include<iostream> int main(void){ int a = 8; int b = 3; std::cout << "a % b = " << a % b << std::endl; long double c = 8.5L; long double d = 3.5L; // std::cout << "c % d = " << c % d </iostream>…