Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: map

From cppreference.net

(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
(1)
map ( ) ;
(до C++11)
map ( ) : map ( Compare ( ) ) { }
(начиная с C++11)
(constexpr начиная с C++26)
explicit map ( const Compare & comp,
const Allocator & alloc = Allocator ( ) ) ;
(2) (constexpr начиная с C++26)
explicit map ( const Allocator & alloc ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)
template < class InputIt >

map ( InputIt first, InputIt last,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr начиная с C++26)
template < class InputIt >

map ( InputIt first, InputIt last,
const Allocator & alloc )

: map ( first, last, Compare ( ) , alloc ) { }
(5) (начиная с C++14)
(constexpr начиная с C++26)
map ( const map & other ) ;
(6) (constexpr начиная с C++26)
map ( const map & other, const Allocator & alloc ) ;
(7) (начиная с C++11)
(constexpr начиная с C++26)
map ( map && other ) ;
(8) (начиная с C++11)
(constexpr начиная с C++26)
map ( map && other, const Allocator & alloc ) ;
(9) (начиная с C++11)
(constexpr начиная с C++26)
map ( std:: initializer_list < value_type > init,

const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(10) (начиная с C++11)
(constexpr начиная с C++26)
map ( std:: initializer_list < value_type > init,

const Allocator & alloc )

: map ( init, Compare ( ) , alloc ) { }
(11) (начиная с C++14)
(constexpr начиная с C++26)
template < container-compatible-range < value_type > R >

map ( std:: from_range_t , R && rg,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(12) (начиная с C++23)
(constexpr начиная с C++26)
template < container-compatible-range < value_type > R >

map ( std:: from_range_t , R && rg,
const Allocator & alloc )

: map ( std:: from_range , std:: forward < R > ( rg ) , Compare ( ) , alloc ) { }
(13) (начиная с C++23)
(constexpr начиная с C++26)

Создает новый контейнер из различных источников данных и, опционально, с использованием предоставленного пользователем аллокатора alloc или функционального объекта сравнения comp .

1-3) Создает пустой контейнер.
4,5) Конструирует контейнер с содержимым диапазона [ first , last ) .
Если [ first , last ) не является допустимым диапазоном , поведение не определено.
6,7) Создает контейнер с копией содержимого other .

Если alloc не предоставлен, аллокатор получается путем вызова std:: allocator_traits < allocator_type > ::
select_on_container_copy_construction ( other. get_allocator ( ) )
.

(начиная с C++11)

Во время вывода аргументов шаблона класса только первый аргумент участвует в выводе параметра шаблона Allocator контейнера.

(начиная с C++23)
8,9) Конструирует контейнер с содержимым other с использованием семантики перемещения. Если alloc не предоставлен, аллокатор получается путем перемещающего конструирования из аллокатора, принадлежащего other .

Во время вывода аргументов шаблона класса только первый аргумент участвует в выводе параметра шаблона Allocator контейнера.

(since C++23)
10,11) Конструирует контейнер с содержимым списка инициализации init .
12,13) Конструирует контейнер с содержимым rg .

Содержание

Параметры

alloc - аллокатор для использования во всех выделениях памяти этого контейнера
comp - функциональный объект сравнения для использования во всех сравнениях ключей
first, last - пара итераторов, определяющая исходный диапазон элементов для копирования
other - другой контейнер, используемый в качестве источника для инициализации элементов контейнера
init - список инициализации для инициализации элементов контейнера
rg - совместимый с контейнером диапазон , то есть input_range , элементы которого конвертируются в value_type
Требования к типам
-
InputIt должен удовлетворять требованиям LegacyInputIterator .
-
Compare должен удовлетворять требованиям Compare .
-
Allocator должен удовлетворять требованиям Allocator .

Сложность

1-3) Константа.
4,5) N·log(N) где N равно std:: distance ( first, last ) в общем случае, линейно по N если [ first , last ) уже отсортирован по value_comp ( ) .
6,7) Линейно по размеру other .
8,9) Константная. Если alloc задан и alloc ! = other. get_allocator ( ) , то линейная.
10,11) N·log(N) где N это init. size ( ) в общем случае, линейно по N если init уже отсортирован с помощью value_comp ( ) .
12,13) N·log(N) где N это ranges:: distance ( rg ) в общем случае, линейно по N если rg уже отсортирован по value_comp ( ) .

Исключения

Вызовы Allocator::allocate могут генерировать исключения.

Примечания

После перемещающего конструирования контейнера (перегрузка ( 8,9 ) ), ссылки, указатели и итераторы (кроме конечного итератора) на other остаются действительными, но ссылаются на элементы, которые теперь находятся в * this . Текущий стандарт обеспечивает эту гарантию с помощью общего положения в [container.reqmts]/67 , и более прямая гарантия рассматривается через LWG issue 2321 .

Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (в ожидании LWG2844 ).

Хотя формально это не требовалось до C++23, некоторые реализации уже поместили параметр шаблона Allocator в невыводимые контексты в более ранних режимах.

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_containers_ranges 202202L (C++23) Ориентированное на диапазоны создание и вставка; перегрузки ( 12,13 )

Пример

#include <iomanip>
#include <iostream>
#include <map>
#include <string>
template<typename Key, typename Value, typename Cmp>
std::ostream& operator<<(std::ostream& os, const std::map<Key, Value, Cmp>& map)
{
    os << "{ ";
    for (auto comma{map.size()}; const auto& p : map)
        os << '\'' << p.первый << "' это " << p.second << (--comma ? ", " : " ");
    return os << "}\n";
}
struct Point
{
    double x, y;
    friend std::ostream& operator<<(std::ostream& os, Point pt)
    {
        return os << '(' << pt.x << ", " << pt.y << ')';
    }
};
struct PointCmp
{
    bool operator()(const Point& lhs, const Point& rhs) const
    {
        return lhs.x < rhs.x; // NB: y намеренно игнорируется
    }
};
int main()
{
    // (1) Конструктор по умолчанию
    std::map<std::string, int> map1;
    map1["что-то"] = 69;
    map1["что угодно"] = 199;
    map1["эта вещь"] = 50;
    std::cout << "map1 = " << map1;
    // (4) Конструктор диапазона
    std::map<std::string, int> iter(map1.find("что угодно"), map1.end());
    std::cout << "\niter = " << iter;
    std::cout << "map1 = " << map1;
    // (6) Конструктор копирования
    std::map<std::string, int> copied(map1);
    std::cout << "\ncopied = " << copied;
    std::cout << "map1 = " << map1;
    // (8) Move constructor
    std::map<std::string, int> moved{std::move(map1)};
    std::cout << "\nmoved = " << moved;
    std::cout << "map1 = " << map1;
    // (10) Конструктор со списком инициализации
    const std::map<std::string, int> init
    {
        {"this", 100},
        {"может", 100},
        {"быть", 100},
        {"const", 100}
    };
    std::cout << "\ninit = " << init;
    std::cout << "\nCustom Key класс вариант 1:\n";
    // Использовать структуру сравнения
    std::map<Point, double, PointCmp> mag =
    {
        {{5, -12}, 13},
        {{3, 4}, 5},
        {{-8, -15}, 17}
    };
    std::cout << "mag = " << mag << '\n';
    std::cout << "Custom Key class option 2:\n";
    // Использовать лямбда-выражение для сравнения
    // Данная лямбда сортирует точки в соответствии с их величинами, где
    // эти величины взяты из локальной переменной mag.
    auto cmpLambda = [&mag](const Point& lhs, const Point& rhs)
    {
        return mag[lhs] < mag[rhs];
    };
    // Вы также можете использовать лямбду, не зависящую от локальных переменных, например так:
    // auto cmpLambda = [](const Point& lhs, const Point& rhs){ return lhs.y < rhs.y; };
    std::map<Point, double, decltype(cmpLambda)> magy(cmpLambda);
    // Различные способы добавления элементов:
    magy.insert(std::pair<Point, double>({5, -12}, 13));
    magy.insert({{3, 4}, 5});
    magy.insert({Point{-8.0, -15.0}, 17});    
    std::cout << "magy = " << magy << '\n';
    std::cout << "Создание из диапазона:\n";
    using PS = std::pair<const std::string, int>;
    const auto rg = {PS{"один", 1}, {"один", 101}, {"два", 2}, {"три", 3}};
#if __cpp_lib_containers_ranges
    std::map<std::string, int> nums(std::from_range, rg); // перегрузка (12)
#else
    std::map<std::string, int> nums(rg.begin(), rg.end()); // переход к (4)
#endif
    std::cout << "nums = " << nums << '\n';
}

Вывод:

map1 = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
iter = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
map1 = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
copied = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
map1 = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
moved = { 'anything' равно 199, 'something' равно 69, 'that thing' равно 50 }
map1 = { }
init = { 'be' равно 100, 'can' равно 100, 'const' равно 100, 'this' равно 100 }
Custom Key class option 1:
mag = { '(-8, -15)' равно 17, '(3, 4)' равно 5, '(5, -12)' равно 13 }
Custom Key class option 2:
magy = { '(3, 4)' равно 5, '(5, -12)' равно 13, '(-8, -15)' равно 17 }
Construction from a range:
nums = { 'one' равно 1, 'three' равно 3, 'two' равно 2 }

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2076 C++11 перегрузка ( 4 ) условно требовала, чтобы Key и T были CopyInsertable в * this не требуется
LWG 2193 C++11 конструктор по умолчанию был explicit сделан не-explicit

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

присваивает значения контейнеру
(публичная функция-член)