C++ begin()和data()之间的区别是什么

C++ begin()和data()之间的区别是什么,c++,vector,stl,C++,Vector,Stl,begin和data都返回指向第一个元素的迭代器。但是,数据的定义表示它返回一个直接指针,指向向量内部用于存储其所属元素的内存数组。我还可以使用它们访问任何元素。那么,两者有什么不同呢?考虑下面的例子, #include <iostream> #include <vector> int main() { std::vector<int> v; v.reserve(5); for (int i = 1; i <= 5; i ++

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

#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;
}
std::vector::begin 返回引用向量中第一个元素的迭代器

std::vector::data 返回指向向量内部使用的数组中第一个元素的指针。

std::vector::begin 返回引用向量中第一个元素的迭代器

std::vector::data
返回指向向量内部使用的数组中第一个元素的指针。

所有容器类型都有迭代器,但只有某些容器类型是连续的并支持数据。比如说,

向量v; copyv.begin、v.end、ostream\u迭代器输出\n; v、 数据;//好啊 清单l; copyl.begin、l.end、ostream\u迭代器输出\n; l、 数据;//不 确实,int*from int*vector::data满足迭代器_traits::迭代器_category==random\u access\u迭代器_标记,并且vector::迭代器可以实现为int*。然而,该标准并没有规定这一点,并且使用类似的工具实现vector::iterator是合法的

类向量{ 类迭代器{ 向量*v; 向量::大小\类型位置; }; };
因此,在没有数据的情况下,必须使用&v[0]或&*v.front之类的技巧才能访问支持向量的底层连续内存。这是C++11引入数据之前的情况。

所有容器类型都有迭代器,但只有一些容器类型是连续的并支持数据。比如说,

向量v; copyv.begin、v.end、ostream\u迭代器输出\n; v、 数据;//好啊 清单l; copyl.begin、l.end、ostream\u迭代器输出\n; l、 数据;//不 确实,int*from int*vector::data满足迭代器_traits::迭代器_category==random\u access\u迭代器_标记,并且vector::迭代器可以实现为int*。然而,该标准并没有规定这一点,并且使用类似的工具实现vector::iterator是合法的

类向量{ 类迭代器{ 向量*v; 向量::大小\类型位置; }; };
因此,在没有数据的情况下,必须使用&v[0]或&*v.front之类的技巧才能访问支持向量的底层连续内存。这是C++11引入数据之前的情况。

你错了。这些方法中只有一个返回迭代器。另一个没有。从某种角度来看,OP实际上并没有错。指针是有效的迭代器。迭代器被设计成模拟指针。因此,从这个意义上说,begin和data都将迭代器返回到第一个元素,只是不同类型的迭代器。你错了。这些方法中只有一个返回迭代器。另一个没有。从某种角度来看,OP实际上并没有错。指针是有效的迭代器。迭代器被设计成模拟指针。因此,从这个意义上说,begin和data都将迭代器返回到第一个元素,只是不同类型的迭代器。