std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::at
T& at( const Key& key ); | (1) | (начиная с C++23) |
const T& at( const Key& key ) const; | (2) | (начиная с C++23) |
template< class K > T& at( const K& x ); | (3) | (начиная с C++23) |
template< class K > const T& at( const K& x ) const; | (4) | (начиная с C++23) |
Возвращает ссылку на отображаемое значение элемента с указанным ключом. Если такой элемент не существует, выбрасывается исключение типа std::out_of_range.
1,2) Ключ эквивалентен
key.
3,4) Ключ сравнивается на эквивалентность со значением
x. Ссылка на отображаемое значение получается, как если бы использовалось выражение this->find(x)->second.
Выражение
this->find(x) должно быть корректно сформировано и иметь определённое поведение; в противном случае поведение не определено.
Эти перегрузки участвуют в разрешении перегрузки только в том случае, если квалифицированное имя
Compare::is_transparent является допустимым и обозначает тип. Это позволяет вызывать эту функцию без создания экземпляра Key.Параметры
| key | - | ключ искомого элемента |
| x | - | значение любого типа, которое можно прозрачно сравнить с ключом |
Возвращаемое значение
Ссылка на отображаемое значение запрошенного элемента.
Исключения
3,4)
std::out_of_range, если контейнер не содержит указанный элемент, то есть если find(x) == end() равно true.Сложность
Логарифмическая относительно размера контейнера.
Пример
#include <cassert>
#include <iostream>
#include <flat_map>
struct LightKey { int o; };
struct HeavyKey { int o[1000]; };
// The container must use std::less<> (or other transparent Comparator) to
// access overloads (3,4). This includes standard overloads, such as
// comparison between std::string and std::string_view.
bool operator<(const HeavyKey& x, const LightKey& y) { return x.o[0] < y.o; }
bool operator<(const LightKey& x, const HeavyKey& y) { return x.o < y.o[0]; }
bool operator<(const HeavyKey& x, const HeavyKey& y) { return x.o[0] < y.o[0]; }
int main()
{
std::flat_map<int, char> map{{1, 'a'}, {2, 'b'}};
assert(map.at(1) == 'a');
assert(map.at(2) == 'b');
try
{
map.at(13);
}
catch(const std::out_of_range& ex)
{
std::cout << "1) out_of_range::what(): " << ex.what() << '\n';
}
#ifdef __cpp_lib_associative_heterogeneous_insertion
// Transparent comparison demo.
std::flat_map<HeavyKey, char, std::less<>> map2{{{1}, 'a'}, {{2}, 'b'}};
assert(map2.at(LightKey{1}) == 'a');
assert(map2.at(LightKey{2}) == 'b');
try
{
map2.at(LightKey{13});
}
catch(const std::out_of_range& ex)
{
std::cout << "2) out_of_range::what(): " << ex.what() << '\n';
}
#endif
}
Возможный вывод:
1) out_of_range::what(): map::at: key not found 2) out_of_range::what(): map::at: key not found
См. также
| доступ к указанному элементу или его вставка (открытая функция-член) |
|
| находит элемент с указанным ключом (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/flat_map/at