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

时间:2012-10-11 13:47:31

标签: c++ vector standard-library

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

有人可以指出区别吗?

5 个答案:

答案 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

两者都将输出相同的输出,不同之处仅在于是否要使用迭代器。