Namespaces
Variants

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

From fr.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 .

Contenu

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 qui se référaient initialement aux éléments de other restent valides, mais se réfèrent aux éléments qui se trouvent maintenant dans *this. La norme actuelle garantit cela par l'énoncé général dans [container.reqmts]/67, et une garantie plus directe est à l'étude via LWG issue 2321.

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

Test de fonctionnalité macro Valeur Norme Fonctionnalité
__cpp_lib_containers_ranges 202202L (C++23) Construction et insertion conscientes des plages; 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)