Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++ 在堆栈上为API调用传递std::array是否有优势_C++_Arrays_Stl - Fatal编程技术网

C++ 在堆栈上为API调用传递std::array是否有优势

C++ 在堆栈上为API调用传递std::array是否有优势,c++,arrays,stl,C++,Arrays,Stl,我读到了关于std::array和C类型array之间的关键区别,并了解到其中一个关键区别是,当调用API时,C类型array作为指针,而std::array的副本被传递。其中一个博客提到这是一个优势,但我不这么认为。与C型数组相比,使用std::array的主要优势是什么?我的探索和理解表明,几乎所有的事情都可以用C型数组来完成。它们甚至可以传递给STL算法。因此,我不认为使用std::array比使用C-type数组有任何关键优势。实际上是这样吗?确实,您可以用std::array做的所有事

我读到了关于
std::array
和C类型array之间的关键区别,并了解到其中一个关键区别是,当调用API时,C类型array作为指针,而
std::array
的副本被传递。其中一个博客提到这是一个优势,但我不这么认为。与C型数组相比,使用
std::array
的主要优势是什么?我的探索和理解表明,几乎所有的事情都可以用C型数组来完成。它们甚至可以传递给STL算法。因此,我不认为使用
std::array
比使用C-type数组有任何关键优势。实际上是这样吗?

确实,您可以用
std::array
做的所有事情都可以用C array完成。实际上,
std::array
只是在内部包装了一个固定大小的C数组。然而,
std::array
通常更方便

按值传递数组的能力是一个优势。如果要使用C数组执行此操作,则必须传递指针和大小,然后创建本地副本。使用
std::array
,您可以避免这种情况,并选择更适合您需要的:

void takeArrayByValue(std::array<int, 5> arr)
{
    arr[0] = newValue; // arr is a local copy, caller does not see this
}

void takeArrayByReference(std::array<int, 5>& arr)
{
     arr[0] = newValue; // variable passed as argument is modified
}

// compare with this:
void takeCArrayAndMakeLocalCopy(const int (&arr)[5])
{
    int localArr[5];
    std::copy(std::begin(arr), std::end(arr), localArr);

   // do something with localArr
}
在本例中,
takeCArray
实际使用指针。它应该是
takeCArray(int(&arr)[5])
,但编译器不会对此抱怨,而且这个bug可能在一开始就被忽略了。这不能发生在
std::array

void takeStdArray(std::array<int, 5>& arr);

std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
void takeStdArray(标准::数组和arr);
std::阵列arr;
takeStdArray(arr);//编译器错误!

确实,您可以使用
std::array
执行的所有操作都可以使用C array完成。实际上,
std::array
只是在内部包装了一个固定大小的C数组。然而,
std::array
通常更方便

按值传递数组的能力是一个优势。如果要使用C数组执行此操作,则必须传递指针和大小,然后创建本地副本。使用
std::array
,您可以避免这种情况,并选择更适合您需要的:

void takeArrayByValue(std::array<int, 5> arr)
{
    arr[0] = newValue; // arr is a local copy, caller does not see this
}

void takeArrayByReference(std::array<int, 5>& arr)
{
     arr[0] = newValue; // variable passed as argument is modified
}

// compare with this:
void takeCArrayAndMakeLocalCopy(const int (&arr)[5])
{
    int localArr[5];
    std::copy(std::begin(arr), std::end(arr), localArr);

   // do something with localArr
}
在本例中,
takeCArray
实际使用指针。它应该是
takeCArray(int(&arr)[5])
,但编译器不会对此抱怨,而且这个bug可能在一开始就被忽略了。这不能发生在
std::array

void takeStdArray(std::array<int, 5>& arr);

std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
void takeStdArray(标准::数组和arr);
std::阵列arr;
takeStdArray(arr);//编译器错误!

struct将C样式数组的性能和可访问性与标准容器的优点结合在一起,例如了解其自身的大小、支持赋值、随机访问迭代器等(),因为标准比较运算符对于
std::array
是重载的。关于通过值传递时对
std::array
的复制,那么不需要吗?使用引用。该结构将C样式数组的性能和可访问性与标准容器的优点结合在一起,例如了解其自身大小、支持赋值、随机访问迭代器等(),因为标准比较运算符对于
std::array
是重载的。关于通过值传递时对
std::array
的复制,那么不需要吗?使用参考资料。