繁体   English   中英

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

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

先前的C++11 std::vector::begin()是否等同于C++11中的std::vector::data() 我问这个的原因,早于C ++ 11,我曾经把std :: vector :: begin()当作指针,但是在C ++ 11之后,它不是,我不能转换为等效的指针。 那么,我可以在C ++ 11之后使用data()吗?

不, begin返回一个迭代器,而data返回一个指针。 对于给定的实现,这些可能是相同的,但您不应指望这一点。

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

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

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

先前的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()你可以(几乎总是)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM