C++ STLのsetコンテナでlower_bound()関数を使う方法
C++ STLのsetコンテナには、lower_bound()という便利なメンバ関数が用意されています。この関数は、引数として渡した値kと等しい要素を指すイテレータを返します。もしkがset内に存在しない場合は、「kより大きい要素のうち最小のもの」、つまり直後の要素を指すイテレータを返します。
setは内部的に要素を常にソート済みの状態で保持しているため、lower_bound()は二分探索によってO(log n)の計算量で効率的に動作します。
アルゴリズム
Begin
空のsetコンテナsを初期化する。
lower boundの値を指すためのイテレータを宣言する。
setコンテナsに要素をいくつか挿入する。
引数で渡したキーのlower boundを求める関数を呼び出し、
結果をイテレータiterに格納する。
求めたキーのlower boundの値を出力する。
End.
サンプルコード
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int> s; // 空のsetコンテナを宣言
set<int>::iterator iter; // lower boundの値を指すイテレータを宣言
s.insert(7); // setコンテナsに要素を挿入
s.insert(6);
s.insert(1);
s.insert(4);
s.insert(2);
s.insert(9);
s.insert(10);
iter = s.lower_bound(4); // キーを引数に渡してlower boundを取得
cout << "The lower bound of 4 is: " << *iter << endl;
iter = s.lower_bound(5); // 5は存在しないため、次に大きい6が返る
cout << "The lower bound of 5 is: " << *iter << endl;
iter = s.lower_bound(8); // 8は存在しないため、次に大きい9が返る
cout << "The lower bound of 8 is: " << *iter << endl;
return 0;
}
実行結果
The lower bound of 4 is: 4 The lower bound of 5 is: 6 The lower bound of 8 is: 9
ポイント解説
- キーが存在する場合: そのキー自身を指すイテレータが返されます(例:
lower_bound(4)→ 4)。 - キーが存在しない場合: キーより大きい最初の要素を指すイテレータが返されます(例:
lower_bound(5)→ 6)。 - 注意点: キーがコンテナ内の全要素よりも大きい場合、
lower_bound()は終端イテレータend()を返します。end()を逆参照(*)すると未定義動作になるため、実際にアクセスする前にiter != s.end()のチェックを行うことが重要です。
-
C++ STLのnegate関数で値の符号を反転する方法
C++のSTL(標準テンプレートライブラリ)には、値の符号を簡単に反転できるnegate関数が用意されています。negateは「否定する」という意味を持つ関数オブジェクトで、正の値を負の値へ、負の値を正の値へと変換します。この記事では、std::transformと組み合わせてnegateを使う方法を解説します。関数プロトタイプnegateは通常、transformアルゴリズムと一緒に使われます。基本的な構文は以下の通りです。function transform(a_begin, a_end, a1_begin, negate()): a_begin = 配列の先頭(
-
C++ STLのatan2()関数の使い方を徹底解説!構文・戻り値・サンプルコード付き
atan2()関数は、座標yとxから逆正接(アークタンジェント)を求めるための関数です。ここでいうyとxは、それぞれy座標とx座標の値を指します。atan2()はC++のSTL(標準テンプレートライブラリ)に組み込まれている関数で、<cmath>ヘッダをインクルードすることで利用できます。通常のatan()関数と異なり、atan2()はxの符号も考慮して正しい象限の角度を返すため、実務でも広く使われています。atan2()関数の構文atan2(dataType var1, dataType var2)構文を見ると分かるように、atan2()関数はfloat型、double型、lon