我需要能够通过指针访问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 不是空的,因此可以减去一个以获得指向最后一个元素的指针。重要的是不要取消引用。