我应该如何将较小的std::数组构造为较大数组的切片
How should I construct a smaller std::array as a slice of a larger one?
对于constexpr I和k,我想将std::array
的元素I到I+k-1表示为另一个std::array
,最好不复制,并且在constexpr函数中。
这能做到吗?如果是这样,正确的方法是什么?
使用std::array
复制是不可避免的。如果可以使用Microsoft指南支持库中的span<T, N>
,则可以避免复制。
如果你必须坚持使用std::array
,那么你可以引入这个辅助功能:
template<std::size_t OFFSET, std::size_t K, class T, std::size_t N>
std::array<T, K>
subarray(const std::array<T, N>& a)
{
static_assert(OFFSET+K<=N, "your error message here");
std::array<T, K> s;
std::copy(a.begin()+OFFSET, a.begin()+OFFSET+K, s.begin());
return s;
};
这样使用:
std::array<int, 5> a = { 1, 2, 3, 4, 5 };
std::array<int, 3> s = subarray<1, 3>(a);
您要的是array
的slice
,甚至可能是vector
。遗憾的是,我们在标准库中没有任何东西(直到C++17),但正如Leon在回答中提到的,您可以使用span
。
GSL实施:https://github.com/Microsoft/GSL/blob/master/include/span.h
std::array<int, 4> arr = {1, 2, 3, 4};
span<int> s{&arr[0], 2};
我的slice(测试)实现:https://github.com/arun11299/Slices-in-Cpp\
std::vector<int> vec{1,2,3,4,5,6,7,8,9,10};
// all elements
auto vslice = make_slice(vec, 0, vec.size());
assert(len(vslice) == 10);
vslice = vslice(beg, 8);
assert(len(vslice) == 8);
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- Valarray 切片数组与 'operator*' 不匹配
- 如何在考虑对象切片的同时通过传入单个 Base 对象来打印出数组中的对象?
- 在数组中计数不同的切片
- 我应该如何将较小的std::数组构造为较大数组的切片
- 整数数组切片
- c#中的c++锯齿状数组切片
- 我可以将 std::数组转换为切片吗?或者我还能用什么
- C++中的字符切片数组(python到c ++)
- 切片C数组创建c++向量,每3个元素只保留2个元素
- 特征布尔数组切片
- c++字符串数组切片
- 如何使用SWIG让python切片与我的c++数组类一起工作
- c++中二维数组中的对象切片