std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::try_emplace
| 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.
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)...);
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)...);
- Das qualifizierte ID `Compare::is_transparent` gültig ist und einen Typ bezeichnet.
- std::is_constructible_v<key_type, K> ist true.
- std::is_assignable_v<mapped_type&, Args...> ist true.
- Nur für (3): std::is_convertible_v<K&&, const_iterator> und std::is_convertible_v<K&&, iterator> sind beide false.
| Informationen zur Iterator-Invalidierung sind von hier kopiert. |
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
emplace.emplace_hint.[edit] Komplexität
emplace.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) | |
| konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) | |
| fügt Elemente ein (public member function) | |
| fügt ein Element ein oder weist einem vorhandenen Element einen Wert zu, falls der Schlüssel bereits existiert (public member function) |