ホームに戻る
STL のオーダーに関する覚え書き
総じてclearを使うとO(N)のオーダーがかかるので注意する。
vectorのeraseはO(N)かかるので注意する。
mapのma[key]のアクセスもO(logN)かかるので注意する。
listはオーダーが特殊なので場合によって利用できる。
queueとpriority_queueは扱いがだいぶ違うので覚えると良い。
ランダムアクセスできない場合はイテレーターで++、--は使えるが+、-が使えない。
begin()は先頭の要素だが、end()は最後の要素の次の要素なので注意。
1、vector
最後に追加する、ランダムアクセスするのはO(1)で可能。
vectorは最後にO(1)で追加できるが先頭にO(1)で追加できるデータ構造では無い。
双方向から追加できるようにする場合はdequeを使う。
挿入や削除の場合は再構築が必要なのでO(N)が必要。
insertやeraseを使った場合にO(N)かかるのは忘れがちなので注意。
v.push_back : O(1)
v.pop_back : O(1)
v[n] : O(1)
v.insert : O(N)
v.erase : O(N)
v.clear : O(N)
要素の検索にはfind(v.begin(),v.end,value)を使うがこれは先頭からの探索でO(N)。
ソートした後、vector::iterator itr = lower_bound(v.begin(),v.end,value)でO(logN)。
if((*itr)==value)で判定。
2、set
setのアクセスは概ねO(logN)になる。
setのeraseはイテレータでも値を指定しても消せる。
setはランダムアクセスできないのでイテレーターの++、--はできるが+、-はできないので注意。
i番目の要素を得たい場合には先頭からitr++しながら数えるしかない。
i番目の要素はBITと2分探索を使えばO(logNlogN)で。
se.insert : O(logN) 自動でソートされる
se.find : O(logN) 見つからない場合はse.end()を返す
se.count : O(logN) 実質0か1しか返さない
se.erase : O(logN)
se.lower_bound(x): O(logN) x について <= になるような最も小さいインデックスを返す
se.upper_bound(x): O(logN) x について < になるような最も小さいインデックスを返す
se.clear : O(N)
3、multiset
setとの違って同じ値が複数入る。
findでは複数該当する場合は最初の位置を返す。
countでは0と1以外の値も返す。
4、map
mapはアクセスにO(logN)かかるのが忘れがちで注意したい。
キーが無いかの判定はma.findがma.endであるかもしくはma.countが0かで判定できる。
mapのeraseもイテレータでもキーを指定しても消せる。
ma[x] : O(logN)
ma.find : O(logN)
ma.count : O(logN)
ma.erase : O(logN)
v.clear : O(N)
5、list
listはランダムアクセスする方法が無い。
ランダムアクセスする場合はイテレータを使って先頭から探索する。
この場合のオーダーはもちろんO(N)となる。
ただし、listは挿入や削除がO(1)と早いのが特徴。
li.push_front : O(1)
li.push_back : O(1)
li.pop_front : O(1)
li.pop_back : O(1)
li.insert(itr): O(1)
li.erase(itr) : O(1)
li.clear : O(N)
6、queue
q.frontで先頭の値を得る。q.popで先頭の値を1つ捨てる。
q.pushでqueueの最後に値を追加。
q.front : O(1)
q.back : O(1)
q.push : O(1)
q.pop : O(1)
7、deque
queueと違い先頭に値を戻せる。
q.front : O(1)
q.back : O(1)
q.push_front : O(1)
q.pop_front : O(1)
q.push_back : O(1)
q.pop_back : O(1)
8、priority_queue
priority_queueはqueueとは挙動がだいぶ異なる。
pushすると機動的に降順にソートされる。
pq.topで最大値を得る。
pq.pushで値を追加、q.popで最大値を1つ捨てる。
最小値を得るpriority_queueは以下のようにする。
priority_queue<int, vector<int>, greater<int> > q;
pq.top : O(1)
pq.push : O(logN)
pq.pop : O(logN)