从 C++ 数组元素的指针获取索引的最快方法是什么
What is the fastest way to obtain an index from a pointer of an array element in C++?
假设你有一个指向数组中整数的指针。这是找出指针指向数组的哪一项的最佳方法吗?
int nmbr = pointer - &array[0];
cout<<"Item number "<<nmbr+1;
如果指针指向第 6 项,是否始终打印"第 6 项"?这容易出错吗?有没有更快的方法可以做到这一点?由于可能存在重复值,迭代数组将不起作用,但这总是有效吗?在这种情况下,我们假设数组从项目 0 开始到项目 x。是否存在数组的项目未存储在连续行中的情况(如果数组初始化为 int array[x];
)?
假设已知pointer
指向array
的元素,则
std::ptrdiff_t nmbr = pointer - array;
会做到的。 如果指针不指向数组的元素,则行为未定义。 std::ptrdiff_t
在标准标头<cstddef>
中声明,并且是实现定义的有符号整数类型。 使用 int
不是一个好主意,特别是对于大型数组,因为std::ptrdiff_t
可能能够表示比int
更大的值范围(并且,如果该值大于int
可以表示的值,则将结果转换为 int
也会给出未定义的行为)。
代码中的 +1
不正确,因为 C++ 中的数组索引从零开始。
所有数组,在声明为
some_type array[some_positive_value];
具有连续元素。 请注意,C++不支持 C 的 VLA(可变长度数组),即 some_positive_value
必须在编译时知道。
正如 XTF 提到的,是的,它保证可以工作。但是,不需要获取第 0 个元素的地址,只需按原样使用 array
即可。
对于更通用的解决方案,该解决方案也适用于其他容器,您可以考虑以下示例:
#include <iostream>
#include <iterator>
#include <array>
int main()
{
{
int array[10];
int * p = &array[5]; // Somehow get a pointer to the sixth element
std::cout << std::distance(std::begin(array), p) << std::endl;
}
{
std::array<int, 10> array;
int * p = &array[5]; // Somehow get a pointer to the sixth element
std::cout << std::distance(std::begin(array), p) << std::endl;
}
}
两个 +1 看起来都不对。但是,是的,这是最快,最简单的方法。它保证有效。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?