C++ Boost Range. Массив пар из массива
У меня есть массив целых C, и его размер, т.е. int* arr, unsigned size
, Я хочу иметь что-то похожее на что-то, что будет содержать пары элементов в качестве элементов.
Чтобы уточнить, задача заключается в следующем: я получаю массив, как [1,2,3,4]
и я хочу посмотреть что-то вроде [(1,2),(3,4)]
,
Есть ли какой-нибудь удобный способ трансформировать массив таким способом через boost или, может быть, std диапазоны?
2 ответа
Решение
С помощью диапазона v3 вы можете создать диапазон размера 2 с помощью ranges::v3::view::chunk(2)
или создайте кортеж:
auto r = ranges::view::counted(p, size);
auto even = r | ranges::view::stride(2);
auto odd = r | ranges::view::drop(1) | ranges::view::stride(2);
auto pairs = ranges::view::zip(even, odd);
Вы можете использовать Range-V3, он имеет span
для просмотра необработанного массива, и view::chunk
сгруппировать смежные элементы:
#include <iostream>
#include <range/v3/view/chunk.hpp>
#include <range/v3/span.hpp>
#include <range/v3/algorithm/for_each.hpp>
namespace view = ranges::view;
int main() {
int vec[] = { 1, 2, 3, 4, 5, 6 };
ranges::span<int> s(vec, sizeof(vec)/sizeof(vec[0]));
ranges::for_each(s | view::chunk(2), [] (auto chunk) {
std::pair pr{chunk.at(0), chunk.at(1)};
std::cout << pr.first << " " << pr.second << "\n";
});
}