Namespaces
Variants

std::set<Key,Compare,Allocator>:: equal_range

From cppreference.net

std:: pair < iterator, iterator > equal_range ( const Key & key ) ;
(1) (constexpr начиная с C++26)
std:: pair < const_iterator, const_iterator >
equal_range ( const Key & key ) const ;
(2) (constexpr начиная с C++26)
template < class K >
std:: pair < iterator, iterator > equal_range ( const K & x ) ;
(3) (начиная с C++14)
(constexpr начиная с C++26)
template < class K >

std:: pair < const_iterator, const_iterator >

equal_range ( const K & x ) const ;
(4) (начиная с C++14)
(constexpr начиная с C++26)

Возвращает диапазон, содержащий все элементы с заданным ключом в контейнере. Диапазон определяется двумя итераторами: один указывает на первый элемент, который не меньше заданного ключа, а другой указывает на первый элемент, больший заданного ключа.

В качестве альтернативы, первый итератор может быть получен с помощью lower_bound() , а второй с помощью upper_bound() .

1,2) Сравнивает ключи с key .
3,4) Сравнивает ключи со значением x .
Эта перегрузка участвует в разрешении перегрузки только если Compare является прозрачным . Это позволяет вызывать данную функцию без создания экземпляра Key .

Содержание

Параметры

key - значение ключа для сравнения с элементами
x - альтернативное значение, которое можно сравнить с Key

Возвращаемое значение

std::pair содержащий пару итераторов, определяющих требуемый диапазон:

  • Первый итератор указывает на первый элемент, не меньший заданного ключа, или на end ( ) если такой элемент не существует.
  • Второй итератор указывает на первый элемент, больший заданного ключа, или на end ( ) если такой элемент не существует.

Сложность

Логарифмическая от размера контейнера.

Примечания

Feature-test макрос Значение Стандарт Функциональность
__cpp_lib_generic_associative_lookup 201304L (C++14) Гетерогенный поиск сравнения в ассоциативных контейнерах , для перегрузок ( 3,4 )

Пример

#include <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");
}

Вывод:

Найдено 0 персонажей с именем "Maude Flanders"
Найдено 1 персонажей с именем "Lisa Simpson"
Найдено 3 персонажей с фамилией "Simpson":
    Homer Simpson
    Lisa Simpson
    Marge Simpson

Смотрите также

находит элемент с заданным ключом
(public member function)
(C++20)
проверяет, содержит ли контейнер элемент с заданным ключом
(public member function)
возвращает количество элементов, соответствующих заданному ключу
(public member function)
возвращает итератор на первый элемент больший чем заданный ключ
(public member function)
возвращает итератор на первый элемент не меньший чем заданный ключ
(public member function)
возвращает диапазон элементов, соответствующих заданному ключу
(function template)