如何从指向该数组的指针获取对该数组的引用
How to get a reference to an array from a pointer to that array
简单的问题。我有一个指向数组的指针。
vector<int> myVector = { 22, 18, 12, -4, 58, 7, 31, 42 };
int* myPtr = myVector.data();
我还有一个将数组引用作为参数的函数。
template<typename T> void sort_quick(T (&arr)[]);
如何将我的矢量数组传递给此函数,而不必在 data() 中复制可能很大的数组。
sort_quick(*arr); // No matching function call for 'sort_quick'
此外,我需要将其作为数组传递,这是先决条件,所以不要因为我希望我可以而谈论只传递向量。
编辑:
template<typename T, int N> void sort_quick(T (&arr)[N]);
这现在应该是合法语法了吗?
编辑2:
template<typename T> void sort_quick(T* arr, size_t length);
我相信当需要处理数组而不是向量时,这将是最好的版本。
如果你不使用 C++11,你可以这样做:
sort_quick( &arr[0] );
排序函数的签名采用数组引用;你可能不知道的是,在 C 或 C++ 中,没有 rvalue 表达式可以产生数组,也就是说,右值可能不是数组类型。您可能还不知道数组作为参数传递给函数时如何衰减为指针,但这可能有点偏离主题;
无论如何,您不能做如下事情:
sort_quick(my_vec.data());
如果您绝对必须使用具有该签名的函数(即它是您无法控制的接口),您将需要使用值集为 [my_vec.data(); my_vec.size()]
的信息构造一个数组已验证。至于为什么你不能只使用 std::vector::data()
,如果你仔细看,你会发现它的 return 类型是 T*
,并且指针不会神奇地反向衰减到数组引用中。
C 风格的数组边界必须在编译时已知。您对 sort_quick
的原始定义是非法的。这是合法的:
template<typename T, int N> void sort_quick(T (&arr)[N]);
但是它只能用实际数组调用。
为了支持在编译时才知道大小的排序容器,您需要制作一个带有两个参数的版本。这些可以是两个指针,或者一个起始指针和一个长度。版本获取数组可以委托给新版本。
惯用的方法是使用迭代器:
template<typename Iterator> void sort_quick(Iterator begin, Iterator end);
然后您可以像这样调用函数:
sort_quick(myVector.begin(), myVector.end());
简单的问题。我有一个指向数组的指针。
vector<int> myVector = { 22, 18, 12, -4, 58, 7, 31, 42 };
int* myPtr = myVector.data();
我还有一个将数组引用作为参数的函数。
template<typename T> void sort_quick(T (&arr)[]);
如何将我的矢量数组传递给此函数,而不必在 data() 中复制可能很大的数组。
sort_quick(*arr); // No matching function call for 'sort_quick'
此外,我需要将其作为数组传递,这是先决条件,所以不要因为我希望我可以而谈论只传递向量。
编辑:
template<typename T, int N> void sort_quick(T (&arr)[N]);
这现在应该是合法语法了吗?
编辑2:
template<typename T> void sort_quick(T* arr, size_t length);
我相信当需要处理数组而不是向量时,这将是最好的版本。
如果你不使用 C++11,你可以这样做:
sort_quick( &arr[0] );
排序函数的签名采用数组引用;你可能不知道的是,在 C 或 C++ 中,没有 rvalue 表达式可以产生数组,也就是说,右值可能不是数组类型。您可能还不知道数组作为参数传递给函数时如何衰减为指针,但这可能有点偏离主题;
无论如何,您不能做如下事情:
sort_quick(my_vec.data());
如果您绝对必须使用具有该签名的函数(即它是您无法控制的接口),您将需要使用值集为 [my_vec.data(); my_vec.size()]
的信息构造一个数组已验证。至于为什么你不能只使用 std::vector::data()
,如果你仔细看,你会发现它的 return 类型是 T*
,并且指针不会神奇地反向衰减到数组引用中。
C 风格的数组边界必须在编译时已知。您对 sort_quick
的原始定义是非法的。这是合法的:
template<typename T, int N> void sort_quick(T (&arr)[N]);
但是它只能用实际数组调用。
为了支持在编译时才知道大小的排序容器,您需要制作一个带有两个参数的版本。这些可以是两个指针,或者一个起始指针和一个长度。版本获取数组可以委托给新版本。
惯用的方法是使用迭代器:
template<typename Iterator> void sort_quick(Iterator begin, Iterator end);
然后您可以像这样调用函数:
sort_quick(myVector.begin(), myVector.end());