从 C++ 数组元素的指针获取索引的最快方法是什么

What is the fastest way to obtain an index from a pointer of an array element in C++?

本文关键字:方法 是什么 索引 获取 C++ 数组元素 指针      更新时间:2023-10-16

假设你有一个指向数组中整数的指针。这是找出指针指向数组的哪一项的最佳方法吗?

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 看起来都不对。但是,是的,这是最快,最简单的方法。它保证有效。