std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert_or_assign
template< class M > std::pair<iterator, bool> insert_or_assign( const key_type& k, M&& obj ); | (1) | (начиная с C++23) |
template< class M > std::pair<iterator, bool> insert_or_assign( key_type&& k, M&& obj ); | (2) | (начиная с C++23) |
template< class K, class M > std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj ); | (3) | (начиная с C++23) |
template< class M > iterator insert_or_assign( const_iterator hint, const key_type& k, M&& obj ); | (4) | (начиная с C++23) |
template< class M > iterator insert_or_assign( const_iterator hint, key_type&& k, M&& obj ); | (5) | (начиная с C++23) |
template< class K, class M > iterator insert_or_assign( const_iterator hint, K&& k, M&& obj ); | (6) | (начиная с C++23) |
k, присваивает std::forward<M>(obj) объекту mapped_type, соответствующему ключу k. Если ключ не существует, вставляет новое значение так, как если бы выполнялось -
(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)).
Программа некорректна, если
3,6) Если в контейнере уже существует ключ, эквивалентный std::is_assignable_v<mapped_type&, M> или std::is_constructible_v<mapped_type, M> является false.k, присваивает std::forward<M>(obj) объекту mapped_type, соответствующему ключу k. В противном случае эквивалентно -
(3)
try_emplace(std::forward<K>(k), std::forward<M>(obj)), -
(6)
try_emplace(hint, std::forward<K>(k), std::forward<M>(obj)).
Преобразование
Эти перегрузки участвуют в разрешении перегрузки только при выполнении следующих условий: k в key_type должно создавать объект u, для которого find(k) == find(u) является true. В противном случае поведение не определено.- Квалифицированное имя
Compare::is_transparentкорректно и обозначает тип. -
std::is_constructible_v<key_type, K>являетсяtrue. -
std::is_assignable_v<mapped_type&, M>являетсяtrue. -
std::is_constructible_v<mapped_type, M>являетсяtrue.
Параметры
| k | - | ключ, используемый как для поиска, так и для вставки, если он не найден |
| hint | - | итератор на позицию, перед которой будет вставлен новый элемент |
| obj | - | значение для вставки или присваивания |
Возвращаемое значение
1-3) Компонент bool равен
true, если произошла вставка, и false, если произошло присваивание. Компонент-итератор указывает на вставленный или обновлённый элемент.
4-6) Итератор, указывающий на вставленный или обновлённый элемент.
Сложность
1-3) Такая же, как у
emplace.
4-6) Такая же, как у
emplace_hint.Примечания
insert_or_assign возвращает больше информации, чем operator[], и не требует, чтобы отображаемый тип был конструируемым по умолчанию.
Пример
#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);
}
Вывод:
inserted: [a] = apple inserted: [b] = banana inserted: [c] = cherry assigned: [c] = clementine [a] = apple [b] = banana [c] = clementine
См. также
| доступ к указанному элементу или его вставка (открытая функция-член) |
|
| доступ к указанному элементу с проверкой границ (открытая функция-член) |
|
| вставляет элементы (открытая функция-член) |
|
| создаёт элемент на месте (открытая функция-член) |
|
| вставляет элемент на месте, если ключ не существует; ничего не делает, если ключ существует (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/flat_map/insert_or_assign