C++
 Computer >> コンピューター >  >> プログラミング >> C++

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()のチェックを行うことが重要です。

  1. C++ STLのnegate関数で値の符号を反転する方法

    C++のSTL(標準テンプレートライブラリ)には、値の符号を簡単に反転できるnegate関数が用意されています。negateは「否定する」という意味を持つ関数オブジェクトで、正の値を負の値へ、負の値を正の値へと変換します。この記事では、std::transformと組み合わせてnegateを使う方法を解説します。関数プロトタイプnegateは通常、transformアルゴリズムと一緒に使われます。基本的な構文は以下の通りです。function transform(a_begin, a_end, a1_begin, negate()):    a_begin = 配列の先頭(

  2. 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