来自prioric++11的std::vector::begin()是否等效于C++11中的std::vector::d

Is std::vector::begin() from priorC++11 equivalent to std::vector::data() in C++11?

本文关键字:vector std C++11 中的 prioric++11 begin 来自 是否      更新时间:2023-10-16

以前的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()(几乎总是这样)。

相关文章: