我需要能够通过指针访问std::vector的元素(只读,不涉及任何大小调整或类似操作)。例如。,

std::vector<int> foo(10);
int *ptr_begin = &foo[0];

到目前为止,可以保证它可以在当前标准(23.3.6.1)中工作:



因此,我们可以使用指针访问 vector 的所有元素,因为它们存储在连续的内存块中。但是,倒数第二个元素呢?我的意思是,执行此操作合法吗?
int *ptr_end = ptr_begin + foo.size()

(请注意,我并不是试图访问过去-最后一个值,而只是定义一个指向它的指针-如果您愿意,它等效于foo.end())。该标准仅提及通过指针算术访问元素,但显然在这里我们不访问任何元素。

(作为一个旁注,过去的东西的存在的定义似乎与数组的基本概念紧密相关(例如参见5.7/5),但是在整个标准中,这似乎是连续存储和存储的概念。数组可互换使用。我读错了吗?)

最佳答案

是的,只要您在比较中仅使用ptr_end *并且不尝试遵从它,这很好。引用C++ 11标准草案中第5.7节中有关带指针的加法运算(强调我的意思)的信息:



§5.9中为关系运算符列出了类似的规定:



关于出于上述目的,vector的缓冲区是否计为数组,第8.3.4节指出:



这与§23.3.6.1关于vector所说的一致:



由于指针是iterator,对于使用标准库算法并以任意内存块作为输入的情况,这种事情很方便。例如,假设您要使用lower_bound算法,但是您的数据存储在MFC CArray中:

CArray<int> someInts;
// populate and check for empty
int* begin = someInts.GetData();
int* end = begin + someInts.GetSize(); // for bounds-checking only; don't dereference
int* answer = std::lower_bound(begin, end, 100);

*还有一些其他合法的操作;例如由于您知道 vector 不是空的,因此可以减去一个以获得指向最后一个元素的指针。重要的是不要取消引用。

07-24 09:46
查看更多