Я пытался решить проблему сортировки параллельных векторов (то есть векторов, которые содержат атрибут одного и того же объекта для каждого индекса). У меня есть несколько векторов, и мне нужно отсортировать их, используя один из значений этих векторов в качестве ключа. Общий способ сделать это в ржавчине состоит в том, чтобы распределить вектор кортежей, сортировать его по одному из его полей и расстегнуть его обратно в векторы. Слово, которое мне здесь не нравится, «распределять». Я просто хочу сортировать ссылочный вектор на месте, и для каждого подсасывания элемента выполнять один и тот же обмен во всех других векторах, не нужно что-либо выделять. Короче говоря, код выглядит следующим образом: < /p>
Код: Выделить всё
std::vector keys { 1, 4, 3, 0, 2, 8, 6, 5, 7, 9 };
std::vector values {'E', 'O', 'L', 'H', 'L', 'L', 'O', 'W', 'R', 'D'};
auto zip = std::ranges::views::zip(keys, values);
std::ranges::sort(zip, [](const auto & lhs, const auto & rhs) {
return std::get(lhs) < std::get(rhs);
});
Это сортирует значения Использование ключей в качестве ссылки.
В статье говорится, что с этим подходом «Временные векторы не созданы, объекты не являются (без необходимости) копированы» . Насколько я понимаю, этот код делает именно то, что я хочу. Я прав? И если бы я был, как бы я сделал это в ржавчине?
Подробнее здесь:
https://stackoverflow.com/questions/795 ... y-is-and-c