![](/img/trans.png)
[英]What is the best\simplest\fastest way to create set of 1 element? (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.