繁体   English   中英

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

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

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

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

如果指针指向第六项,是否总是打印“第六项”? 这容易出错吗? 有更快的方法吗? 由于可能存在重复值,因此无法对数组进行迭代,但这是否总是可行? 在这种情况下,我们假设数组从项目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

+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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM