简单的问题。我有一个指向数组的指针。
vector<int> myVector = { 22, 18, 12, -4, 58, 7, 31, 42 };
int* myPtr = myVector.data();
我还有一个函数,它将对数组的引用作为参数。
template<typename T> void sort_quick(T (&arr)[]);
如何将vector的数组传递给此函数,而无需复制data()中潜在的大数组。
sort_quick(*arr); // No matching function call for 'sort_quick'
另外,我需要将它作为一个数组传递,它是一个先决条件,所以不要谈论只是传递矢量,因为我希望我能。
编辑:
template<typename T, int N> void sort_quick(T (&arr)[N]);
这应该是合法的语法吗?
EDIT2:
template<typename T> void sort_quick(T* arr, size_t length);
我认为当需要处理数组而不是向量时,这将是最好的版本。
答案 0 :(得分:2)
必须在编译时知道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());
答案 1 :(得分:-1)
排序函数的签名采用数组引用;您可能不知道的是,C或C ++中的 rvalue 表达式可能不会产生数组,也就是说,rvalue可能不是数组类型。您可能也不知道数组在作为参数传递给函数时如何衰减到指针,但这可能有点偏离主题;
无论如何,你可能不会做类似的事情:
sort_quick(my_vec.data());
如果绝对必须将该函数与该签名一起使用(即它是一个无法控制的接口),则需要使用值为[my_vec.data(); my_vec.size()]
的值为有效的信息构造一个数组。至于为什么你不能只使用std::vector::data()
,如果仔细观察,你会发现它的返回类型是T*
,并且指针不会神奇地反向衰减到数组引用中。
答案 2 :(得分:-2)
如果您不使用C ++ 11,您可以这样做:
sort_quick( &arr[0] );