Namespaces
Variants

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

From cppreference.net

(1)
map ( ) ;
(jusqu'à C++11)
map ( ) : map ( Compare ( ) ) { }
(depuis C++11)
(constexpr depuis C++26)
explicit map ( const Compare & comp,
const Allocator & alloc = Allocator ( ) ) ;
(2) (constexpr depuis C++26)
explicit map ( const Allocator & alloc ) ;
(3) (depuis C++11)
(constexpr depuis C++26)
template < class InputIt >

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

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr depuis C++26)
template < class InputIt >

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

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

const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(10) (depuis C++11)
(constexpr depuis C++26)
map ( std:: initializer_list < value_type > init,

const Allocator & alloc )

: map ( init, Compare ( ) , alloc ) { }
(11) (depuis C++14)
(constexpr depuis 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) (depuis C++23)
(constexpr depuis 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) (depuis C++23)
(constexpr depuis C++26)

Construit un nouveau conteneur à partir de diverses sources de données et optionnellement en utilisant l'allocateur fourni par l'utilisateur alloc ou l'objet fonction de comparaison comp .

1-3) Construit un conteneur vide.
4,5) Construit le conteneur avec le contenu de la plage [ first , last ) .
Si [ first , last ) n'est pas un intervalle valide , le comportement est indéfini.
6,7) Construit le conteneur avec la copie du contenu de other .

Si alloc n'est pas fourni, l'allocateur est obtenu en appelant std:: allocator_traits < allocator_type > ::
select_on_container_copy_construction ( other. get_allocator ( ) )
.

(depuis C++11)

Pendant la déduction d'arguments de modèle de classe , seul le premier argument contribue à la déduction du paramètre de modèle Allocator du conteneur.

(depuis C++23)
8,9) Construit le conteneur avec le contenu de other en utilisant la sémantique de déplacement. Si alloc n'est pas fourni, l'allocateur est obtenu par construction par déplacement depuis l'allocateur appartenant à other .

Pendant la déduction d'arguments de modèle de classe , seul le premier argument contribue à la déduction du paramètre de modèle Allocator du conteneur.

(depuis C++23)
10,11) Construit le conteneur avec le contenu de la liste d'initialisation init .
12,13) Construit le conteneur avec le contenu de rg .

Table des matières

Paramètres

alloc - allocateur à utiliser pour toutes les allocations de mémoire de ce conteneur
comp - objet fonction de comparaison à utiliser pour toutes les comparaisons de clés
first, last - la paire d'itérateurs définissant la plage source des éléments à copier
other - un autre conteneur à utiliser comme source pour initialiser les éléments du conteneur
init - liste d'initialisation pour initialiser les éléments du conteneur
rg - une plage compatible avec le conteneur , c'est-à-dire une input_range dont les éléments sont convertibles en value_type
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
Compare doit satisfaire aux exigences de Compare .
-
Allocator doit satisfaire aux exigences de Allocator .

Complexité

1-3) Constant.
4,5) N·log(N) N est std:: distance ( first, last ) en général, linéaire en N si [ first , last ) est déjà trié selon value_comp ( ) .
6,7) Linéaire en fonction de la taille de other .
8,9) Constant. Si alloc est donné et alloc ! = other. get_allocator ( ) , alors linéaire.
10,11) N·log(N) N est init. size ( ) en général, linéaire en N si init est déjà trié par value_comp ( ) .
12,13) N·log(N) N est ranges:: distance ( rg ) en général, linéaire en N si rg est déjà trié selon value_comp ( ) .

Exceptions

Les appels à Allocator::allocate peuvent lever une exception.

Notes

Après la construction par déplacement du conteneur (surcharge ( 8,9 ) ), les références, pointeurs et itérateurs (à l'exception de l'itérateur de fin) vers other restent valides, mais se réfèrent aux éléments qui se trouvent désormais dans * this . La norme actuelle garantit cela via l'énoncé général dans [container.reqmts]/67 , et une garantie plus directe est à l'étude via LWG issue 2321 .

Si plusieurs éléments de la plage ont des clés équivalentes, il n'est pas spécifié quel élément est inséré (en attente de LWG2844 ).

Bien que non formellement requis avant C++23, certaines implémentations ont déjà placé le paramètre template Allocator dans des contextes non déduits dans les modes antérieurs.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_containers_ranges 202202L (C++23) Construction et insertion compatibles avec les Ranges ; surcharges ( 12,13 )

Exemple

#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.premier << "' est " << 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 est intentionnellement ignoré
    }
};
int main()
{
    // (1) Constructeur par défaut
    std::map<std::string, int> map1;
    map1["quelque chose"] = 69;
    map1["anything"] = 199;
    map1["cette chose"] = 50;
    std::cout << "map1 = " << map1;
    // (4) Constructeur de plage
    std::map<std::string, int> iter(map1.find("anything"), map1.end());
    std::cout << "\niter = " << iter;
    std::cout << "map1 = " << map1;
    // (6) Constructeur de copie
    std::map<std::string, int> copied(map1);
    std::cout << "\ncopied = " << copied;
    std::cout << "map1 = " << map1;
    // (8) Constructeur de déplacement
    std::map<std::string, int> moved{std::move(map1)};
    std::cout << "\nmoved = " << moved;
    std::cout << "map1 = " << map1;
    // (10) Constructeur de liste d'initialisation
    const std::map<std::string, int> init
    {
        {"this", 100},
        {"peut", 100},
        {"être", 100},
        {"const", 100}
    };
    std::cout << "\ninit = " << init;
    std::cout << "\nOption 1 de la classe Custom Key :\n";
    // Utiliser une structure de comparaison
    std::map<Point, double, PointCmp> mag =
    {
        {{5, -12}, 13},
        {{3, 4}, 5},
        {{-8, -15}, 17}
    };
    std::cout << "mag = " << mag << '\n';
    std::cout << "Option de classe de clé personnalisée 2 :\n";
    // Utiliser un lambda de comparaison
    // Cette lambda trie les points selon leurs magnitudes, où
    // ces magnitudes sont extraites de la variable locale mag.
    auto cmpLambda = [&mag](const Point& lhs, const Point& rhs)
    {
        return mag[lhs] < mag[rhs];
    };
    // Vous pourriez également utiliser une lambda qui ne dépend pas de variables locales, comme ceci :
    // auto cmpLambda = [](const Point& lhs, const Point& rhs){ return lhs.y < rhs.y; };
    std::map<Point, double, decltype(cmpLambda)> magy(cmpLambda);
    // Différentes manières d'insérer des éléments :
    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 << "Construction à partir d'une plage :\n";
    using PS = std::pair<const std::string, int>;
    const auto rg = {PS{"un", 1}, {"un", 101}, {"deux", 2}, {"trois", 3}};
#if __cpp_lib_containers_ranges
    std::map<std::string, int> nums(std::from_range, rg); // surcharge (12)
#else
    std::map<std::string, int> nums(rg.begin(), rg.end()); // repli sur (4)
#endif
    std::cout << "nums = " << nums << '\n';
}

Sortie :

map1 = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
iter = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
map1 = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
copied = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
map1 = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
moved = { 'anything' est 199, 'something' est 69, 'that thing' est 50 }
map1 = { }
init = { 'be' est 100, 'can' est 100, 'const' est 100, 'this' est 100 }
Classe de clé personnalisée option 1 :
mag = { '(-8, -15)' est 17, '(3, 4)' est 5, '(5, -12)' est 13 }
Classe de clé personnalisée option 2 :
magy = { '(3, 4)' est 5, '(5, -12)' est 13, '(-8, -15)' est 17 }
Construction à partir d'une plage :
nums = { 'one' est 1, 'three' est 3, 'two' est 2 }

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 2076 C++11 la surcharge ( 4 ) exigeait conditionnellement que Key et T soient CopyInsertable dans * this non requis
LWG 2193 C++11 le constructeur par défaut était explicite rendu non-explicite

Voir aussi

assigne des valeurs au conteneur
(fonction membre publique)