2012-06-01から1ヶ月間の記事一覧

Excelで時間の足し算をする

10時0分を表すセルに、1時間30分だけ加えたいときにはTIME関数が使える。 上図のようにTIME関数を使う。1が1時間、30が30分、0が0秒という意味。 時間が計算されて、11時30分になった。注意:B3セルに、=B2+2:00 と書いてもうまくいかない。TIME関数を使わな…

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…