Я пытаюсь понять, как range :: views :: zip работает в range-v3. Я понимаю, что это диапазон, который позволяет выполнять итерацию по нескольким диапазонам в одном цикле, создавая кортеж из элементов в разных диапазонах.
std::vector<int> v1 = {0, 1, 2};
std::vector<char> v2 = {'a', 'b', 'c'};
auto zip = ranges::views::zip(v1,v2);
// zip(v1,v2) = [(0,a), (1,b), (2,c)]
ranges::actions::sort(zip);
std::sort(std::begin(zip), std::end(zip));
Сортировка с использованием ranges::actions
работает нормально, но std::sort
не компилируется и выдает следующую ошибку
/usr/include/c++/9.3.0/bits/stl_algobase.h:151: error: no matching function for call to ‘swap(concepts::return_t<ranges::common_pair<int&, double&>, void>, concepts::return_t<ranges::common_pair<int&, double&>, void>)’
151 | swap(*__a, *__b);
| ~~~~^~~~~~~~~~~~
Почему это происходит?
Я также попытался удалить элементы в обоих контейнерах одновременно. ranges::actions::unique
не компилируется со следующей ошибкой:
/home/jjcasmar/projects/cpfsofaplugin/src/CPFSofaPlugin/minimalExample.cpp:27: error: no match for call to ‘(const ranges::actions::action_closure<ranges::actions::unique_fn>) (ranges::zip_view<ranges::ref_view<std::vector<int, std::allocator<int> > >, ranges::ref_view<std::vector<double, std::allocator<double> > > >&)’
27 | ranges::actions::unique(v1Andv2);
| ^
но auto lastIt = std::unique(std::begin(v1Andv2), std::end(v1Andv2))
компилирует find, хотя я не знаю, как заставить внутренние итераторы zip-архива стирать последние элементы.
Я действительно не понимаю, как это работает под капотом и почему в некоторых случаях алгоритмы std работают нормально, но в некоторых случаях это не так. Может кто-нибудь дать объяснение по этому поводу?