gpt4 book ai didi

c++ - begin()和data()有什么区别

转载 作者:行者123 更新时间:2023-12-03 07:08:44 32 4
gpt4 key购买 nike

begin()data()都返回指向第一个元素的迭代器。但是,data()的定义表示它返回一个指向 vector 内部用于存储其拥有的元素的内存数组的直接指针。我也可以使用它们来访问任何元素。那么,两者有何不同?考虑下面的例子,

#include <iostream>
#include <vector>

int main() {
std::vector<int> v;
v.reserve(5);

for (int i = 1; i <= 5; i ++) v.push_back(i);

auto it = v.begin();
auto pos = v.data();

std::cout << "First element : " << *it << std::endl;
std::cout << "First element : " << *pos << std::endl;

std::cout << "Third element : " << it[2] << std::endl;
std::cout << "Third element : " << pos[2] << std::endl;
}

最佳答案

所有的容器类型都有一个iterator,但是只有一些容器类型是连续的并且支持data()。例如,

vector<int> v;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
v.data(); // ok

list<int> l;
copy(l.begin(), l.end(), ostream_iterator<int>(cout, "\n"));
l.data(); // no
的确, int*中的 int* vector<int>::data()满足 iterator_traits<int*>::iterator_category == random_access_iterator_tag,并且 vector<int>::iterator可以实现为 int*。但是,该标准并未强制要求这样做,并且使用类似
class vector<T> {
class iterator {
vector<T>* v;
vector<T>::size_type pos;
};
};
因此,在没有 vector<int>::iterator的情况下,您必须求助于 data()&v[0]之类的技巧,以访问支持 &*v.front()的底层连续内存。这是C++ 11引入 vector之前的状态。

关于c++ - begin()和data()有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64725302/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com