在C ++ 11中,来自priorC ++ 11的std :: vector :: begin()是否等同于std :: vector :: data()?

时间:2016-05-04 13:12:24

标签: c++ c++11 vector

来自先前的std::vector::begin() - C++11相当于C ++ 11中的std::vector::data()吗? 之所以我提出这个问题,早于C ++ 11,我曾经将std :: vector :: begin()视为指针,但在C ++ 11之后,它不是,我不能强制转换为等效的指针。那么,我可以在C ++ 11之后使用data()吗?

3 个答案:

答案 0 :(得分:8)

不,begin返回迭代器,而data返回指针。对于给定的实现,这些可能是相同的,但你不应该依赖它。

答案 1 :(得分:4)

使用迭代器作为指针是完全错误的,因为它是实现定义的。如果在迭代器中仍需要指向数据的指针,则应该使用dereferenced iterator的地址,如下所示:

std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;

当然,在c ++ 11中,您可以使用.data()作为向量元素的指针。

答案 2 :(得分:2)

  

在C ++ 11中,先前的C ++ 11中的std :: vector :: begin()等同于std :: vector :: data()吗?

取决于你的意思。取消引用会产生对向量中第一项的引用,但是begin()返回的迭代器不能保证可以转换为data()返回的指针类型。

  

我问这个的原因,早于C ++ 11,我曾经把std :: vector :: begin()当作指针但是在C ++ 11之后,它不是,我不能转换为指针等效。

你的代码运气好(或坏),取决于你如何看待它。

  

那么,我可以在C ++ 11之后使用data()吗?

有两个迭代器对跨越了矢量的数据:

begin()end()

data()data() + size()

您可以在任何标准算法中使用,结果也是相同的。

作为一个好的风格,你应该尽可能地使用begin()end()(这几乎总是如此)。