以前的C++11
中的std::vector::begin()
等价于C++11中的std::vector::data()
吗?我问这个问题的原因是,在C++11之前,我曾将std::vector::begin()视为指针,但在C++11之后,它就不是了,而且我不能转换为等效的指针。那么,我可以在C++11之后使用data()吗?
否,begin
返回迭代器,而data
返回指针。对于给定的实现,这些可能是相同的,但您不应该指望这一点。
使用迭代器作为指针是完全错误的,因为它是由实现定义的。若您仍然需要在迭代器中指向数据的指针,则应该使用去引用迭代器的地址,如下所示:
std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;
当然,在c++11中,您可以使用.data()
作为指向向量元素的指针。
来自prior-C++11的std::vector::begin()是否等效于C++11中的std::vector::data()?
取决于你所说的等价物是什么意思。取消引用将产生对向量中第一个项的引用,但begin()返回的迭代器不能保证转换为data()所返回的指针类型。
我问这个问题的原因是,在C++11之前,我曾将std::vector::begin()视为指针,但在C++11之后,它就不是了,而且我不能转换为等效的指针。
你的代码经历了好运气(或坏运气),这取决于你如何看待它
那么,我可以在C++11之后使用data()吗?
有两个迭代器对横跨矢量的数据:
begin()
至end()
和
data()
至data() + size()
您可以在任何标准算法中使用任何一种,结果都是一样的。
作为一种好的风格,你应该尽可能使用begin()
到end()
(几乎总是这样)。