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

时间:2017-01-06 11:01:25

标签: c++ arrays performance pointers

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

int nmbr = pointer - &array[0];
cout<<"Item number "<<nmbr+1;

如果指针指向第6个项目,是否会始终打印&#34;项目编号6&#34;?这容易出错吗?有更快的方法吗?迭代数组因为可能重复的值而无法工作,但这总是有效吗?在这种情况下,我们假设数组从项目0开始到项目x。是否存在阵列的项目不是以连续的行存储的情况(如果数组初始化为int array[x];)?

3 个答案:

答案 0 :(得分:3)

假设已知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

答案 1 :(得分:2)

两个+ 1看起来都错了.. 但是,这是最快最简单的方法。它保证有效。

答案 2 :(得分:1)

正如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;
    }
}