如何从数组生成对视图?
How to generate a view of pairs from an array?
我有一个 int
的 C 数组及其大小,即 int* arr, unsigned size
。我想要一个类似视图的东西,它将有成对的 int
作为元素。
澄清一下,任务是:我收到一个像 [1,2,3,4]
这样的数组,我想要一个像 [(1,2),(3,4)]
.
这样的视图
是否有任何方便的方法通过 boost 或范围(std::ranges 或 range-v3)以这种方式转换数组?
您可以使用 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";
});
}
使用 range v3,您可以使用 ranges::v3::view::chunk(2)
创建大小为 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);
我有一个 int
的 C 数组及其大小,即 int* arr, unsigned size
。我想要一个类似视图的东西,它将有成对的 int
作为元素。
澄清一下,任务是:我收到一个像 [1,2,3,4]
这样的数组,我想要一个像 [(1,2),(3,4)]
.
是否有任何方便的方法通过 boost 或范围(std::ranges 或 range-v3)以这种方式转换数组?
您可以使用 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";
});
}
使用 range v3,您可以使用 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);