Push_back方法在此代码中的工作方式不同。为什么?

时间:2016-08-13 18:48:32

标签: c++ vector

#include<bits/stdc++.h>
#define MAX 20
using namespace std;
int main()
{
//Creating a vector
vector <int> v;
std::vector<int>::iterator vIterator;
int i;

for(i=1;i<MAX;i++)
{
    v.push_back(i);
}

cout<<"Numbers:"<<endl;
for(vIterator = v.end();vIterator>v.begin();vIterator--)
{

    cout<<*vIterator<<endl;
}

int el_count = v.size();
cout<<"Size="<<el_count;

return 0;
}

这里是代码的输出:

编号: 0 19 18 17 16 15 14 13 12 11 10 9 8 7 6 五 4 3 2 大小= 19

为什么我会得到这个&#34; 0&#34;在开始时? 为什么我的列表以2开头?

1 个答案:

答案 0 :(得分:1)

这是因为向量的索引范围是从v.begin()v.end()-1。您改为使用v.begin()+1v.end()

循环中的语句应为

for(vIterator = v.end()-1; vIterator>=v.begin(); --vIterator)

访问v.end()将是未定义的行为,这里给出0,显然你正在跳过第一个元素。

编辑:(感谢@Revolver_Ocelot)

从注释中可以看出,在最后一次迭代中,当调用vIterator=v.begin(),然后调用vIterator--时,迭代器指向的位置将导致未定义的行为。这是因为当vIterator>=v.begin()减少到vIterator以下时v.begin()可能会或可能不会。另一种选择可能是,

for(vIterator = v.end()-1; vIterator>v.begin(); --vIterator)
{
    cout<<*vIterator<<endl;
}
cout<<*vIterator<<endl;

另一种方法是使用反向迭代器,

std::vector<int>::reverse_iterator vIterator;
for(vIterator = v.rbegin(); vIterator!=v.rend(); ++vIterator)