vector
对front()
返回对向量容器中第一个元素的引用。 与成员
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
?
有人可以指出区别吗?
答案 0 :(得分:12)
根据 C ++编程语言中的 Stroustrup ,第16.3.3节;将front()
视为第一个元素,将begin()
视为指向第一个元素的指针。
答案 1 :(得分:8)
在begin()的情况下,是不是随机访问迭代器只是一个指针?
不,迭代器有一些指针语义,但它实际上是一个类。
即使是这样,也应该回答这个问题。这就像问为什么指针的地址与它指向的对象的地址不一样。
如果取消引用迭代器,你将获得相同的值,这将为您提供第一个元素:
&(*vec.begin())
,因为
*vec.begin() == vec.front()
答案 2 :(得分:4)
对于向量,begin()
和end()
返回随机访问迭代器。他们可能会返回一个普通指针;没关系,因为它满足了随机访问迭代器的要求。特别是,您可以编写*begin()
来获取对序列中第一个对象的引用(假设有一个)。 front()
为您提供序列中第一个对象的引用,而不通过中间迭代器。像这样:
vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front(); // j == 3
答案 3 :(得分:3)
假设矢量中至少有1个元素,
vec.front()
与
相同*vec.begin()
答案 4 :(得分: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
两者都将输出相同的输出,不同之处仅在于是否要使用迭代器。