最終更新日時: 2026年02月17日 23時22分33秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<set>

# std::multiset::upper_bound

    iterator upper_bound(const key_type& x);           // (1) C++03
    constexpr iterator upper_bound(const key_type& x); // (1) C++26

    template <class K>
    iterator upper_bound(const K& x);           // (2) C++14
    template <class K>
    constexpr iterator upper_bound(const K& x); // (2) C++26

    const_iterator upper_bound(const key_type& x) const;           // (3) C++03
    constexpr const_iterator upper_bound(const key_type& x) const; // (3) C++26

    template <class K>
    const_iterator upper_bound(const K& x) const;           // (4) C++14
    template <class K>
    constexpr const_iterator upper_bound(const K& x) const; // (4) C++26

## 概要

`x` より大きいコンテナ内の最初の要素を指すイテレータを返す（コンテナの比較オブジェクトを使う）。

`lower_bound()` と異なり、このメンバ関数は `x` と等しいときは要素へのイテレータを返さず、それは大きい場合にのみ要素へのイテレータを返す。

内部的に、`multiset` コンテナ内の全ての要素は常に比較オブジェクトで定義された基準に従って並ぶため、この関数が返す値に続く全ての要素は `x` より大きいことに注意。

- (1), (3) : `key_type`型のキーを受け取り、そのキーより大きい最初の要素へのイテレータを取得する。
- (2), (4) : `key_type`と比較可能な`K`型のキーを受け取り、そのキーより大きい最初の要素へのイテレータを取得する。

## 戻り値

- (1), (3) : キー`x`より大きい最初の要素へのイテレータを返す。そのような要素がない場合は、`end()`を返す。
- (2), (4) : `key_compare`型の関数オブジェクトを`c`、コンテナ内の各要素が持つキーを`k`として、キーが小さくないか判定する式`c(x, k)`が`true`となる要素へのイテレータを返す。そのような要素がない場合は、`end()` を返す。

## 計算量

`size()` について対数時間。

## 備考

- (2), (4) : この関数がオーバーロード解決に参加する条件は、`find()`メンバ関数の備考欄を参照。

## 例

    #include <iostream>
    #include <string>
    #include <set>

    int main()
    {
      // (1)
      {
        std::multiset<std::string> s = { "A", "B", "B", "C", "D" };

        // B以上D以下の範囲を取得
        decltype(s)::iterator it = s.lower_bound("B");
        decltype(s)::iterator last = s.upper_bound("D");

        while (it != last) {
          std::cout << *it << std::endl;
          ++it;
        }
        std::cout << std::endl;
      }

      // (2)
      {
        std::multiset<std::string, std::less<>> s = { "A", "B", "B", "C", "D" };

        // std::lessのvoidに対する特殊化を使用することで、
        // 文字列リテラルをlower_bound()関数の引数として渡した際に、
        // std::string型の一時オブジェクトが生成されない。
        decltype(s)::iterator it = s.lower_bound("B");
        decltype(s)::iterator last = s.upper_bound("D");

        while (it != last) {
          std::cout << *it << std::endl;
          ++it;
        }
      }
    }

### 出力

    B
    B
    C
    D

    B
    B
    C
    D

## 関連項目

名前 | 説明
--- | ---
`lower_bound` | 与えられた値よりも小さくない最初の要素へのイテレータを返す
`equal_range` | 指定したキーにマッチする要素範囲を返す
`find` | 指定したキーで要素を探す
`count` | 指定したキーにマッチする要素の数を返す

## 参照

- N3657 Adding heterogeneous comparison lookup to associative containers (rev 4)
- P3372R3 constexpr containers and adaptors