はじめに
こんにちは、3週ほど前から本格的にAtCoder Beginner Contestに参加し始めた学生です。
コンテスト中に、「このSTLってどう使うんだっけ?」となり、検索しに行くことが多いので、一度まとめてみようと思い記事を書いています!
一度にいろいろ書くのもパンクしてしまいそうなので、メソッドや、STLコンテナ等は別の記事に書きます!
この記事はあくまでも、「調査してまとめる」という作業による、記憶の定着のためのものですので内容についてはN番煎じのものになっています。間違っている部分があれば指摘していただけると幸いです!
最大値・最小値 max
min
- 最大値・もしくは最小値を返す
max(a,b);//大きい方を返す
max([a,b,c,d,e]);//一番大きいのを返す
交換 swap
- 二つの変数の値を交換する
- いちいち
tmp
とか準備して交換しなくていいからな!!
swap(a,b); //aとbの値を交換
乱数生成 rand
- $0~ 2 ^ {31} - 1$の乱数を返す
-
1~N
の乱数を生成したい場合はrand()%N+1
とする -
srand
によるシード値の指定が必要
srand((unsigned)time(NULL)); //時刻でシード値を設定
rand()%5+1 //1以上5以下のランダムな整数を返す
配列,vectorを逆順にする reverse
-
.begin()
、.end()
を使い、イテレータにより指定 - stringにも適用可能
-
vectorのa:
a.begin()+l
a.end()-r
で指定 -
配列:
a+l
,a-r
で指定
vector<char> a = { 'a', 'b', 'c', 'd', 'e' };
reverse(a.begin()+1,a.begin()+3);//=>{ 'a', 'd', 'c', 'b', 'e' }
ソート sort
-
reverse
と同じ方法で指定した範囲をソートする - デフォルトは昇順(小さい順)
- 引数にgreater()を追加することで降順(大きい順)にソート可能
vetor<int> a={5,2,1,4,3};
sort(a.begin(),a.end());//{1,2,3,4,5}
sort(a.begin(),a.end(),greater<int>());//{5,4,3,2,1}
2分探索 lower_bound
- 昇順にソートされている範囲のイテレータを返す
- を取得できる
- 全探索より圧倒的に早い
- 範囲の指定方法は
reverse
、sort
と同じ - 3つ目の引数に探索したい値を指定する
- 最後に
a.begin()
をマイナスすることでインデックスを取得できる
vector<int> a={5,2,1,4,3}
sort(a.begin(),a.end())
cout << lower_bound(a.begin(),a.end(),4)-a.begin() //=>3
カウント count
- 配列、vectorの指定した範囲中に含まれる、指定した値の数を返す
vector<char> a ={'a','b','a','c','a'};
cout << count(a.begin(),a.end(),'a');//=>3
値の存在と場所 find
- その値が存在するのか、存在する場合はどこにあるのかを返す
-
reverse
,sort
,lower_bound
と同じ方法で範囲を指定できる - 値が複数ある場合は先頭のイテレータが、含まれない場合は末尾の隣のイテレータが返される
-
lower_bound
と同じでa.begin()
をマイナスしてインデックスを取得する
vector<int> a = {4,6,2,15,8};
cout << find(a.begin(),a.end(),15)-a.begin();//=>3
coust << find(a.begin(),a.end(),999999);//=>5
2進数中の1の数 `__builtin_popcount
- 立ってるビット数を数えてくれる
int num = 15;
cout << __builtin_popcount(num)//=>4
まとめ
以上になります。もう検索しません!二度と!
find
やcount
を知らずに今までごり押しでfor文回してたのが恥ずかしいです^^
とりあえず茶色を目指します!!!
参考