Namespaces
Variants

std::flat_set<Key,Compare,KeyContainer>:: equal_range

From cppreference.net

std:: pair < iterator, iterator > equal_range ( const Key & key ) ;
(1) (C++23以降)
(C++26以降 constexpr)
std:: pair < const_iterator, const_iterator >
equal_range ( const Key & key ) const ;
(2) (C++23以降)
(C++26以降 constexpr)
template < class K >
std:: pair < iterator, iterator > equal_range ( const K & x ) ;
(3) (C++23以降)
(C++26以降 constexpr)
template < class K >

std:: pair < const_iterator, const_iterator >

equal_range ( const K & x ) const ;
(4) (C++23以降)
(C++26以降 constexpr)

指定されたキーを持つ全ての要素を含む範囲を返します。この範囲は2つのイテレータによって定義され、1つは指定されたキーより 小さくない 最初の要素を指し、もう1つは指定されたキーより大きい最初の要素を指します。

あるいは、最初のイテレータは lower_bound() で取得し、2番目のイテレータは upper_bound() で取得することもできます。

1,2) キーを key と比較します。
3,4) キーを値 x と比較します。
このオーバーロードは、 Compare transparent である場合にのみ、オーバーロード解決に参加します。これにより、 Key のインスタンスを構築せずにこの関数を呼び出すことが可能になります。

目次

パラメータ

key - 要素を比較するキー値
x - Key と比較可能な代替値

戻り値

std::pair 必要な範囲を定義する一組のイテレータを含む:

  • 最初のイテレータは、指定されたキー以上である最初の要素を指し、そのような要素が存在しない場合は end ( ) を指します。
  • 第二のイテレータは、指定されたキーより大きい最初の要素を指し、そのような要素が存在しない場合は end ( ) を指します。

計算量

コンテナのサイズに対して対数的。

#include <flat_set>
#include <functional>
#include <print>
#include <ranges>
#include <string>
#include <string_view>
#include <tuple>
struct Names
{
    std::string forename, surname;
    friend auto operator<(const Names& lhs, const Names& rhs)
    {
        return std::tie(lhs.surname, lhs.forename) < std::tie(rhs.surname, rhs.forename);
    }
};
struct SurnameCompare
{
    std::string_view surname;
    friend bool operator<(const Names& lhs, const SurnameCompare& rhs)
    {
        return lhs.surname < rhs.surname;
    }
    friend bool operator<(const SurnameCompare& lhs, const Names& rhs)
    {
        return lhs.surname < rhs.surname;
    }
}; 
std::set<Names, std::less<>> characters
{
    {"Homer", "Simpson"},
    {"Marge", "Simpson"},
    {"Lisa", "Simpson"},
    {"Ned", "Flanders"},
    {"Joe", "Quimby"}
};
void print_unique(const Names& names)
{
    auto [begin, end] = characters.equal_range(names);
    std::print
    (
        "名前 \"{} {}\" のキャラクターを {} 件見つけました\n", 
        std::distance(begin, end), 
        names.forename, names.surname
    );
}
void print_by_surname(std::string_view surname)
{
    auto [begin, end] = characters.equal_range(SurnameCompare{surname});
    std::print("名字 \"{}\" のキャラクターを {} 件見つけました:\n", std::distance(begin, end), surname);
    for (const Names& names : std::ranges::subrange(begin, end))
        std::print("    {} {}\n", names.forename, names.surname);
}
int main()
{
    print_unique({"Maude", "Flanders"});
    print_unique({"Lisa", "Simpson"});
    print_by_surname("Simpson");
}

出力:

名前 "Maude Flanders" のキャラクターを 0 件見つけました
名前 "Lisa Simpson" のキャラクターを 1 件見つけました
名字 "Simpson" のキャラクターを 3 件見つけました:
    Homer Simpson
    Lisa Simpson
    Marge Simpson

関連項目

指定されたキーを持つ要素を検索
(public member function)
コンテナが指定されたキーを持つ要素を含むかどうかをチェック
(public member function)
指定されたキーに一致する要素の数を返す
(public member function)
指定されたキーより 大きい 最初の要素へのイテレータを返す
(public member function)
指定されたキーより 小さくない 最初の要素へのイテレータを返す
(public member function)
指定されたキーに一致する要素の範囲を返す
(function template)