C++ STLのupper_bound()関数とは?使い方とサンプルコードを解説
この記事では、C++ STLにおけるupper_bound()関数について解説します。この関数は、コンテナ内で「valより後」とみなされる最初の要素を指すイテレータを返します。構文は以下の通りです。
iterator upper_bound (const value_type& val); const_iterator upper_bound (const value_type& val) const;
戻り値はイテレータであり、コンテナ内でvalより後とみなされる最初の要素を指します。なお、upper_bound()はlower_bound()と対になる関数で、lower_bound()が「val以上」の最初の要素を返すのに対し、upper_bound()は「valより大きい」最初の要素を返す点が異なります。
使用例
#include <iostream>
#include <set>
using namespace std;
int main () {
set<int> myset;
set<int>::iterator itlow,itup;
for (int i = 1; i < 10; i++) myset.insert(i*10);
itup = myset.upper_bound (60);
myset.erase(itup);
cout << "myset contains:";
for (set<int>::iterator it = myset.begin(); it!=myset.end(); ++it)
cout << ' ' << *it;
}
実行結果
myset contains: 10 20 30 40 50 60 80 90
コードの解説
このサンプルコードでは、まずsetに10から90までの10の倍数を挿入しています。続いてupper_bound(60)を呼び出すことで、60より大きい最初の要素である「70」を指すイテレータを取得し、その要素をerase()で削除しています。
その結果、実行結果の出力には70が含まれておらず、upper_bound()が正しく「指定した値より後の最初の要素」を特定できていることが確認できます。
注意点
upper_bound()を使用する際には、以下の点に注意しましょう。
- 対象のコンテナは、あらかじめソートされた状態(または
setやmapのような自動的にソートされる連想コンテナ)である必要があります。 - 該当する要素が存在しない場合、戻り値は
end()イテレータになります。 - 計算量は二分探索によるもので、要素数をnとするとO(log n)です。
-
C++で実装する二分探索木(BST)イテレータの作り方
二分探索木(BST)に対するイテレータを実装することを考えてみましょう。このイテレータには、次の2つのメソッドが必要です。 next():次の要素(次に小さい値)を返すメソッド hasNext():次の要素が存在するかどうかをブール値で返すメソッド 例えば、以下のような二分探索木があるとします。 この木に対して、関数呼び出しのシーケンスが [next(), next(), hasNext(), next(), hasNext(), next(), hasNext(), next(), hasNext()] である場合、出力は [3, 7, true, 9, true, 15, true,
-
C++におけるイテレータの無効化――原因とコンテナ別のルールを解説
イテレータ無効化とはC++には、vector、list、set、mapなど、用途に応じたさまざまなコンテナが標準ライブラリとして用意されています。これらのコンテナを走査する際にはイテレータを使用しますが、扱い方を誤ると予期しない動作を引き起こすことがあります。特に注意が必要なのが「イテレータの無効化(invalidation)」です。コンテナを反復処理している最中に要素の追加や削除などでコンテナの構造やサイズが変化すると、イテレータが無効化され、最悪の場合は未定義動作につながります。以下のサンプルコードで、無効化が引き起こす問題を確認してみましょう。問題を引き起こすサンプルコード#includ