std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert_or_assign
Von cppreference.com
| template< class M > std::pair<iterator, bool> insert_or_assign( const key_type& k, M&& obj ); |
(1) | (seit C++23) |
| template< class M > std::pair<iterator, bool> insert_or_assign( key_type&& k, M&& obj ); |
(2) | (seit C++23) |
template< class K, class M > std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj ); |
(3) | (seit C++23) |
| template< class M > iterator insert_or_assign( const_iterator hint, const key_type& k, M&& obj ); |
(4) | (seit C++23) |
| template< class M > iterator insert_or_assign( const_iterator hint, key_type&& k, M&& obj ); |
(5) | (seit C++23) |
template< class K, class M > iterator insert_or_assign( const_iterator hint, K&& k, M&& obj ); |
(6) | (seit C++23) |
1,2) Wenn ein Schlüssel, der äquivalent zu k ist, bereits im Container existiert, wird std::forward<M>(obj) dem
mapped_type, der dem Schlüssel k entspricht, zugewiesen. Wenn der Schlüssel nicht existiert, wird der neue Wert eingefügt, als ob durch- (1,2) try_emplace(std::forward<decltype(k)>(k), std::forward<M>(obj)),
- (4,5) try_emplace(hint, std::forward<decltype(k)>(k), std::forward<M>(obj)).
Das Programm ist schlecht formuliert, wenn entweder std::is_assignable_v<mapped_type&, M> oder std::is_constructible_v<mapped_type, M> false ist.
3,6) Wenn ein Schlüssel, der äquivalent zu k ist, bereits im Container existiert, wird std::forward<M>(obj) dem
mapped_type, der dem Schlüssel k entspricht, zugewiesen. Andernfalls ist es äquivalent zu- (3) try_emplace(std::forward<K>(k), std::forward<M>(obj)),
- (6) try_emplace(hint, std::forward<K>(k), std::forward<M>(obj)).
Die Konvertierung von k in
key_type muss ein Objekt u konstruieren, für das find(k) == find(u) true ist. Andernfalls ist das Verhalten undefiniert. Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn
- Der qualifizierte Bezeichner
Compare::is_transparentgültig ist und einen Typ bezeichnet. - std::is_constructible_v<key_type, K> true ist.
- std::is_assignable_v<mapped_type&, M> true ist.
- std::is_constructible_v<mapped_type, M> true ist.
| Informationen zur Iterator-Invalidierung sind von hier kopiert. |
Inhalt |
[bearbeiten] 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 |
| obj | - | der einzufügende oder zuzuweisende Wert |
[bearbeiten] Rückgabewert
1-3) Die Komponente bool ist true, wenn die Einfügung stattgefunden hat, und false, wenn die Zuweisung stattgefunden hat. Die Iterator-Komponente zeigt auf das Element, das eingefügt oder aktualisiert wurde.
4-6) Iterator, der auf das eingefügte oder aktualisierte Element zeigt.
[bearbeiten] Komplexität
1-3) Wie für
emplace.4-6) Wie für
emplace_hint.[bearbeiten] Hinweise
insert_or_assign gibt mehr Informationen zurück als operator[] und erfordert keine Default-Konstruierbarkeit des zugeordneten Typs.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <flat_map> #include <iostream> #include <string> void print_node(const auto& node) { std::cout << '[' << node.first << "] = " << node.second << '\n'; } void print_result(auto const& pair) { std::cout << (pair.second ? "inserted: " : "assigned: "); print_node(*pair.first); } int main() { std::flat_map<std::string, std::string> map; print_result(map.insert_or_assign("a", "apple")); print_result(map.insert_or_assign("b", "banana")); print_result(map.insert_or_assign("c", "cherry")); print_result(map.insert_or_assign("c", "clementine")); for (const auto& node : map) print_node(node); }
Ausgabe
inserted: [a] = apple inserted: [b] = banana inserted: [c] = cherry assigned: [c] = clementine [a] = apple [b] = banana [c] = clementine
[bearbeiten] Siehe auch
| greift auf ein Element zu oder fügt es ein (public member function) | |
| Greift mit Überprüfung auf ein bestimmtes Element zu (public member function) | |
| fügt Elemente ein (public member function) | |
| konstruiert Elemente direkt (in-place) (public member function) | |
| fügt "in place" ein, wenn der Schlüssel nicht existiert, tut nichts, wenn der Schlüssel existiert (public member function) |