5

帮助vectorfront()

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

关于矢量的帮助说begin()

返回引用向量容器中第一个元素的迭代器。请注意,与 member 不同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()is not a random access iteratorjust a的情况下pointer

有人可以指出区别吗?

4

5 回答 5

14

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

于 2012-10-11T13:53:00.413 回答
8

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

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

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

如果您取消引用迭代器,您将获得相同的值,这将为您提供第一个元素:

&(*vec.begin())

因为

*vec.begin() == vec.front()
于 2012-10-11T13:49:25.523 回答
4

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

vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front();  // j == 3
于 2012-10-11T13:52:59.283 回答
3

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

vec.front()

是相同的

*vec.begin()
于 2012-10-11T13:49:43.723 回答
0

为了让你头脑清楚,假设你有一个来自 STL 的向量,请始终尝试记住以下两行代码v

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

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

于 2020-08-20T13:59:13.000 回答