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

C++ STLのmultiset::equal_range()関数を徹底解説!構文・使い方・実行例

本記事では、C++ STLにおける multiset::equal_range() 関数の仕組み、構文、そして具体的な使用例について詳しく解説します。

C++ STLにおけるmultisetとは?

multiset(マルチセット)は、setコンテナとよく似た連想コンテナです。setと同様に、値をキーとして格納し、常にソートされた順序で管理します。

multisetでも値はキーとして識別されます。multisetとsetの最大の違いは、setが重複しない一意なキーのみを持つのに対し、multisetでは同じキー(同じ値)を複数格納できるという点です。

また、multisetは内部的に二分探索木として実装されており、キーはその構造構築に利用されます。これにより、高速な検索が可能になっています。

multiset::equal_range()とは?

multiset::equal_range() は、C++ STLに組み込まれた関数で、<set> ヘッダーファイル内で定義されています。この関数は、multisetコンテナ内にある「指定した値と等しい要素」の範囲を取得します。

戻り値としては、引数で渡した値と一致するすべての要素を含む範囲の境界(lower_bound と upper_bound のペア)を返します。

構文

ms_name.equal_range(value_type& val);

パラメータ

この関数は1つの引数を受け取ります。

  • val − コンテナ内で検索したい値。この値と等しい要素の範囲を取得します。

戻り値

この関数は、指定した値と等しい要素の範囲を表す lower_bound(下限) と upper_bound(上限) のペア(pair)を返します。

使用例

入力

std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.equal_range(2);

出力

2 2

この例では、multiset内に「2」が2つ存在するため、equal_range(2) はその2つの要素を含む範囲を返します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int main(){
    multiset<int> check;
    check.insert(10);
    check.insert(20);
    check.insert(30);
    check.insert(40);
    check.insert(50);
    check.insert(60);
    check.insert(70);
    check.insert(80);
    cout<<"Elements are: ";
    for (auto i = check.begin(); i!= check.end(); i++)
       cout << *i << " ";
    //lower bound と upper bound
    auto i = check.equal_range(30);
    cout<<"\nThe lower bound of 30 is " << *i.first;
    cout<<"\nThe upper bound of 30 is " << *i.second;
    // 最後の要素
    i = check.equal_range(20);
    cout<<"\nThe lower bound of 20 is " << *i.first;
    cout<<"\nThe upper bound of 20 is " << *i.second;
    i = check.equal_range(80);
    cout<<"\nThe lower bound of 80 is " << *i.first;
    cout<<"\nThe upper bound of 80 is " << *i.second;
    return 0;
}

出力結果

Elements are: 10 20 30 40 50 60 70 80
The lower bound of 30 is 30
The upper bound of 30 is 40
The lower bound of 20 is 20
The upper bound of 20 is 30
The lower bound of 80 is 80
The upper bound of 80 is 8

出力結果のポイント

  • 「30」の場合:lower_bound は30自身を指し、upper_bound は次の要素「40」を指します。
  • 「20」の場合:lower_bound は20自身、upper_bound は次の要素「30」を指します。
  • 「80」(最後の要素)の場合:lower_bound は80自身を指しますが、upper_bound は end() イテレータを指すため、それを逆参照すると未定義動作となり、意図しない値が出力される可能性があります。実務では、upper_bound が end() でないか必ず確認してからアクセスするようにしましょう。
  1. C++ STLのcosh()関数とは?双曲線余弦の求め方をサンプルコード付きで解説

    cosh()関数とは? C++のSTLに組み込まれているcosh()関数は、ラジアン単位で与えられた角度の双曲線余弦(ハイパボリック・コサイン)を計算して返す関数です。使用するには、<cmath>ヘッダーをインクルードする必要があります。 双曲線余弦は、数学的に次の式で定義されます。 cosh(x) = (e^x + e^(-x)) / 2 構文 cosh()関数の構文は以下の通りです。 cosh(var) 構文から分かるように、cosh()関数はfloat型、double型、long double型のいずれかの引数varを受け取ります。そして、その双曲線余弦を返します。なお、引

  2. C++ STLのsinh()関数の使い方を徹底解説

    sinh()関数とはsinh()関数は、ラジアンで指定された値の双曲線正弦(ハイパボリックサイン)を返す関数です。C++のSTL(標準テンプレートライブラリ)に組み込まれており、<cmath>ヘッダをインクルードすることで利用できます。双曲線正弦は、以下の数式で定義されます。sinh(x) = (e^x − e^−x) / 2sinh()関数の構文sinh()関数の構文は以下のとおりです。sinh(var)構文からわかるように、sinh()関数はfloat型、double型、long double型のいずれかのパラメータvarを受け取ります。戻り値は、varの双曲線正弦です。sin