Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用较大数组的一部分调用函数_C++_C++17 - Fatal编程技术网

C++ 使用较大数组的一部分调用函数

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

我正在重构一些代码,并决定将一个二维数组合并成一个一维的、更大的数组。现在的问题是,我有一些函数将这些较小的数组作为参数,我更愿意保留它们的签名。是否可以仅使用较大数组的一部分调用函数

f1是我目前拥有的,f2是重构后的外观:

#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
@Jarod42
size()
constepr
@Jarod42,但
s
不需要。那怎么办?但5号的尺寸不再从签名中检查。(取决于
func
是否重要)。@Jarod42您可以执行
static\u assert(s.size()==5)
参数不是
constepr
,因此
assert
,而不是
static\u assert
@Jarod42
size()
constepr
@Jarod42,但
s
不需要。那么...怎么样