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