如何从指向数组的指针获取对该数组的引用
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样式数组边界必须在编译时已知。您最初对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());
排序函数的签名采用数组引用;您可能不知道的是,C或C++中没有右值表达式可能会产生数组,也就是说,右值可能不是数组类型。您可能也不知道数组在作为参数传递给函数时如何衰减为指针,但这可能有点偏离主题;
无论如何,您可能不会执行以下操作:
sort_quick(my_vec.data());
如果您绝对必须将该函数与该签名一起使用(即,它是一个您无法控制的接口),则需要使用值集为[my_vec.data(); my_vec.size()]
有效的信息来构造数组。至于为什么不能只使用std::vector::data()
,如果你仔细观察,你会发现它的返回类型是T*
,指针不会神奇地反向衰减到数组引用。
如果你不使用C++11,你可以这样做:
sort_quick( &arr[0] );
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用指针从C++中的数组中获取最大值
- 获取字符串的长度并将其分配给数组
- 数组长度,为什么从命令行获取时不能使用它?
- 如何在 nlohmann 的 json 库中获取数组长度?
- 在c++中获取两个大int,并将它们存储在数组中
- 如何在C++中获取二维数组中最少的一列数?
- 从 numpy 数组获取指针以将图像发送到C++
- 指针数组.获取指针元素的值
- 循环以使用 cstring 数组 c++ 获取用户输入
- 一种从元组/数组获取参数包的方法
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- 如何使用数组获取命令行参数
- 从 JSON 数组获取天气
- 布尔数组获取意外的默认值
- 填充列表<>使用数组获取错误的数字
- 如何在C++中为矢量数据结构中的二维数组获取用户输入,而不使用行和列上的两个for循环
- 在自定义库中操作2d C++数组-获取行数
- 使用数组获取测试结果
- 数组c++获取值