std::vector::front() 和 begin() 之间的区别

Difference between std::vector::front() and begin()

本文关键字:之间 区别 begin vector std front      更新时间:2023-10-16

帮助vectorfront()

返回对矢量容器中第一个元素的引用。 与成员vector::begin不同,成员返回同一元素的迭代器,此>函数返回直接引用。

矢量上的帮助说begin()

返回引用矢量容器中第一个元素的迭代器。 请注意,与返回对第一个元素的引用的成员vector::front不同,此函数>返回随机访问迭代器。

这段代码输出:

char arr[] = { 'A', 'B', 'C' };
vector<char> vec(arr, arr+sizeof(arr));
cout << "address of vec.front() " << (void*)&vec.front() << endl;
cout << "address of vec.begin() " << (void*)&vec.begin() << endl;

vec.front() 00401F90地址vec.begin() 0030F494地址

我不明白"直接引用"是什么意思? 就begin()而言,random access iterator不就是pointer吗?

有人可以指出区别吗?

根据StroustrupThe C++ Programming Language,第16.3.3节; 将front()视为第一个元素,begin()视为指向第一个元素的指针。

在begin()的情况下,随机访问迭代器不只是一个指针吗?

不,迭代器有一些指针语义,但它实际上是一个类。

即使是这样,也应该回答这个问题。这就像问为什么指针的地址与它指向的对象的地址不同。

如果你取消引用迭代器,你会得到相同的值,这将给你第一个元素:

&(*vec.begin())

因为

*vec.begin() == vec.front()

对于向量,begin()end() 返回随机访问迭代器。他们可能会返回一个普通指针;没关系,因为它满足成为随机访问迭代器的要求。特别是,您可以编写*begin()以获取对序列中第一个对象的引用(假设有一个)。 front()为您提供对序列中第一个对象的引用,而无需通过中间迭代器。喜欢这个:

vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front();  // j == 3

假设向量中至少有 1 个元素,

vec.front()

*vec.begin()

为了保持头脑清晰,请始终尝试记住以下两行,假设您有一个名为 v 的 STL 向量:

v.front() = * v.begin()
&&
v.back() = * v.end()

这意味着如果你有一个向量:

v = {1,2,3,4};

你有一个名为 IT 的迭代器,并且您想要访问第一个和最后一个元素您可以执行以下操作之一:

IT = v.begin();
std::cout<<*IT<<std::endl; // output : 1
IT = v.end();
std::cout<<*IT<<std::endl; // output : 4

或者您可以轻松执行此操作:

std::cout<<v.front<<std::endl; // output  : 1
std::cout<<v.back<<std::endl; // output  : 4

两者都将打印相同的输出,区别仅在于是否要使用迭代器。