Namensräume
Varianten
Aktionen

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::try_emplace

Von cppreference.com
< cpp‎ | container‎ | flat map
 
 
 
 
template< class... Args >
std::pair<iterator, bool> try_emplace( const key_type& k, Args&&... args );
(1) (seit C++23)
template< class... Args >
std::pair<iterator, bool> try_emplace( key_type&& k, Args&&... args );
(2) (seit C++23)
template< class K, class... Args >
std::pair<iterator, bool> try_emplace( K&& k, Args&&... args );
(3) (seit C++23)
template< class... Args >
iterator try_emplace( const_iterator hint, const key_type& k, Args&&... args );
(4) (seit C++23)
template< class... Args >
iterator try_emplace( const_iterator hint, key_type&& k, Args&&... args );
(5) (seit C++23)
template< class K, class... Args >
iterator try_emplace( const_iterator hint, K&& k, Args&&... args );
(6) (seit C++23)

Wenn ein Schlüssel, der zu k äquivalent ist, bereits im Container vorhanden ist, tut die Funktion nichts. Andernfalls wird ein neues Element in die zugrunde liegenden Container c mit dem Schlüssel k und dem Wert, konstruiert aus args, eingefügt.

1,2,4,5) Äquivalent zu
auto key_it = ranges::upper_bound(c.keys, k, compare);
auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it);
c.keys.insert(key_it, std::forward<decltype(k)>(k));
c.values.emplace(value_it, std::forward<Args>(args)...);
3,6) Äquivalent zu
auto key_it = ranges::upper_bound(c.keys, k, compare);
auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it);
c.keys.emplace(key_it, std::forward<K>(k));
c.values.emplace(value_it, std::forward<Args>(args)...);
Die Konvertierung von k in `key_type` muss ein Objekt u konstruieren, für das find(k) == find(u) den Wert true ergibt. Andernfalls ist das Verhalten undefiniert.
Diese Überladungen nehmen an der Overload Resolution teil, nur wenn 

Inhalt

[edit] Parameter

k - der Schlüssel, der sowohl zur Suche als auch zum Einfügen verwendet wird, wenn er nicht gefunden wird
hint - Iterator zu der Position, vor der das neue Element eingefügt wird
args - Argumente, die an den Konstruktor des Elements weitergeleitet werden

[edit] Rückgabewert

1-3) Wie für emplace.
4-6) Wie für emplace_hint.

[edit] Komplexität

1-3) Wie für emplace.
4-6) Wie für emplace_hint.

[edit] Hinweise

Im Gegensatz zu insert oder emplace verschieben diese Funktionen keine Rvalue-Argumente, wenn keine Einfügung stattfindet. Dies erleichtert die Manipulation von Maps, deren Werte nur-verschiebbar sind, wie z.B. std::flat_map<std::string, std::unique_ptr<foo>>. Darüber hinaus behandelt `try_emplace` den Schlüssel und die Argumente für den `mapped_type` getrennt, im Gegensatz zu emplace, das Argumente zum Konstruieren eines `value_type` (d.h. eines std::pair) benötigt.

Die Überladungen (3,6) können aufgerufen werden, ohne ein Objekt vom Typ `key_type` zu konstruieren.

[edit] Beispiel

#include <flat_map>
#include <iostream>
#include <string>
#include <utility>
 
void print_node(const auto& node)
{
    std::cout << '[' << node.first << "] = " << node.second << '\n';
}
 
void print_result(auto const& pair)
{
    std::cout << (pair.second ? "inserted: " : "ignored:  ");
    print_node(*pair.first);
}
 
int main()
{
    using namespace std::literals;
    std::map<std::string, std::string> m;
 
    print_result(m.try_emplace( "a", "a"s));
    print_result(m.try_emplace( "b", "abcd"));
    print_result(m.try_emplace( "c", 10, 'c'));
    print_result(m.try_emplace( "c", "Won't be inserted"));
 
    for (const auto& p : m)
        print_node(p);
}

Ausgabe

inserted: [a] = a
inserted: [b] = abcd
inserted: [c] = cccccccccc
ignored:  [c] = cccccccccc
[a] = a
[b] = abcd
[c] = cccccccccc

[edit] Siehe auch

konstruiert Elemente direkt (in-place)
(public member function) [edit]
konstruiert Elemente "in place" unter Verwendung eines Hinweises
(public member function) [edit]
fügt Elemente ein
(public member function) [edit]
fügt ein Element ein oder weist einem vorhandenen Element einen Wert zu, falls der Schlüssel bereits existiert
(public member function) [edit]