std::ranges::views::keys, std::ranges::keys_view
Определено в заголовке <ranges> | ||
|---|---|---|
template< class R > using keys_view = ranges::elements_view<R, 0>; | (1) | (с C++20) |
namespace views {
inline constexpr auto keys = ranges::elements<0>;
}
| (2) | (с C++20) |
Принимает view подобных кортежам значений (например, std::tuple или std::pair) и создаёт представление с типом значения, равным первому элементу типа значения адаптированного представления.
1) Псевдоним для
ranges::elements_view<R, 0>.
2) RangeAdaptorObject (а также RangeAdaptorClosureObject). Выражение
views::keys(e) эквивалентно выражению keys_view<views::all_t<decltype((e))>>{e} для любого подходящего подвыражения e.Примечания
keys_view может быть полезно для извлечения ключей из ассоциативных контейнеров, например:
std::map<std::string, int> map{{"one", 1}, {"two", 2}};
for (auto const& key : std::views::keys(map))
std::cout << key << ' ';
// prints: one twoПример
Отображает значения для каждого типа кварка в физике частиц.
#include <iomanip>
#include <iostream>
#include <locale>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
int main()
{
const std::vector<std::tuple<std::string, double, bool>> quark_mass_charge
{
// name, MeV/c², has positive electric-charge:
{"up", 2.3, true}, {"down", 4.8, false},
{"charm", 1275, true}, {"strange", 95, false},
{"top", 173'210, true}, {"bottom", 4'180, false},
};
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << "Quark name: │ ";
for (std::string const& name : std::views::keys(quark_mass_charge))
std::cout << std::setw(9) << name << " │ ";
std::cout << "\n" "Mass MeV/c²: │ ";
for (const double mass : std::views::values(quark_mass_charge))
std::cout << std::setw(9) << mass << " │ ";
std::cout << "\n" "E-charge: │ ";
for (const bool pos : std::views::elements<2>(quark_mass_charge))
std::cout << std::setw(9) << (pos ? "+2/3" : "-1/3") << " │ ";
std::cout << '\n';
}Вывод:
Quark name: │ up │ down │ charm │ strange │ top │ bottom │ Mass MeV/c²: │ 2.3 │ 4.8 │ 1,275 │ 95 │ 173,210 │ 4,180 │ E-charge: │ +2/3 │ -1/3 │ +2/3 │ -1/3 │ +2/3 │ -1/3 │
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| LWG 3563 | C++20 |
keys_view не может участвовать в CTAD из-за использования views::all_t |
views::all_t удалено |
См. также
|
(C++20) | принимает view, состоящую из значений типа пара, и производит view вторых элементов каждой пары(шаблон класса) (объект адаптера диапазона) |
|
(C++20) | принимает view, состоящую из tuple-like значений и числа N, и производит view N-го элемента каждого кортежа(шаблон класса) (объект адаптера диапазона) |
| Срез valarray, подобный BLAS: начальный индекс, длина, шаг (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/keys_view