C++ 使用较大数组的一部分调用函数
我正在重构一些代码,并决定将一个二维数组合并成一个一维的、更大的数组。现在的问题是,我有一些函数将这些较小的数组作为参数,我更愿意保留它们的签名。是否可以仅使用较大数组的一部分调用函数 f1是我目前拥有的,f2是重构后的外观:C++ 使用较大数组的一部分调用函数,c++,c++17,C++,C++17,我正在重构一些代码,并决定将一个二维数组合并成一个一维的、更大的数组。现在的问题是,我有一些函数将这些较小的数组作为参数,我更愿意保留它们的签名。是否可以仅使用较大数组的一部分调用函数 f1是我目前拥有的,f2是重构后的外观: #include <array> void func(std::array<int const, 5> const& arr, int i); void f1() { static std::array<std::arra
#include <array>
void func(std::array<int const, 5> const& arr, int i);
void f1() {
static std::array<std::array<int const, 5>, 2> const arr{{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}}};
func(arr[0], 0);
func(arr[1], 1);
}
void f2() {
static std::array<int const, 10> const arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
//TODO: call func with first and last 5 elements.
}
#包括
void func(标准::数组常量和数组,int i);
void f1(){
静态std::数组常量arr{{{1,2,3,4,5},{6,7,8,9,0};
func(arr[0],0);
func(arr[1],1);
}
无效f2(){
静态std::数组常量arr{1,2,3,4,5,6,7,8,9,0};
//TODO:使用第一个和最后5个元素调用func。
}
如果您将函数更改为采用Peter评论的一系列元素,这将变得微不足道。第一个数组通过arr.begin()
和arr.begin()+5
,第二个数组通过arr.begin()+5
,arr.end()
void func(int*b,int*e,int i);
您也可以使用span
来让事情变得更干净。此处已使用,但如果需要,您可以:
#包括
void func(gsl::span s,int i);
静态std::数组常量arr{1,2,3,4,5,6,7,8,9,0};
func({arr.begin(),arr.begin()+5},0);
func({arr.begin()+5,arr.end()},1);
如果您将函数更改为采用Peter评论的一系列元素,这将变得微不足道。第一个数组通过arr.begin()
和arr.begin()+5
,第二个数组通过arr.begin()+5
,arr.end()
void func(int*b,int*e,int i);
您也可以使用span
来让事情变得更干净。此处已使用,但如果需要,您可以:
#包括
void func(gsl::span s,int i);
静态std::数组常量arr{1,2,3,4,5,6,7,8,9,0};
func({arr.begin(),arr.begin()+5},0);
func({arr.begin()+5,arr.end()},1);
嗯,不,如果不创建副本,就不可能将std::array
的一部分传递给需要std::array
的函数。为什么不更改func()
,使其接受一对表示开始和结束的迭代器(或者,如果您知道可以安全地假定为5个元素,则接受与第一个元素对应的单个迭代器)。这使得它完全独立于调用方如何组织其数据。@Peter我希望保持签名清晰,因为它只适用于一定数量的元素。但我喜欢只接受begin迭代器,并在函数中保留硬编码的元素数。没有想到。不,不可能在不创建副本的情况下将std::array
的一部分传递给需要std::array
的函数。为什么不更改func()
,使其接受一对表示开始和结束的迭代器(或者,如果您知道可以安全地假定为5个元素,则接受与第一个元素对应的单个迭代器)。这使得它完全独立于调用方如何组织其数据。@Peter我希望保持签名清晰,因为它只适用于一定数量的元素。但我喜欢只接受begin迭代器,并在函数中保留硬编码的元素数。我没想到。但5号的尺寸不再是从签名中检查出来的。(取决于func
是否重要)。@Jarod42您可以执行static\u assert(s.size()==5)
参数不是constepr
,因此assert
,而不是static\u assert
@Jarod42size()
是constepr
@Jarod42,但s
不需要。那怎么办?但5号的尺寸不再从签名中检查。(取决于func
是否重要)。@Jarod42您可以执行static\u assert(s.size()==5)
参数不是constepr
,因此assert
,而不是static\u assert
@Jarod42size()
是constepr
@Jarod42,但s
不需要。那么...怎么样