未清除C ++ STL向量前值

时间:2018-08-07 21:20:26

标签: c++ vector stl

为什么清除向量后为什么要得到前元素值? 我想念一些明显的东西吗?我也尝试使用擦除功能,并得到了相同的结果。这里的预期结果是什么?向量的大小在清除后也显示为0,但vect.front()显示一个值。 我的代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
        vector <int> vect;
        vector <int>::iterator it;
        vect.push_back(10);
        vect.push_back(3);
        vect.push_back(5);
        for( int i=0;i<vect.size();i++)
        {
                cout<<vect[i]<<endl;
        }
        vect.clear();
        cout<<"front element "<<vect.front()<<endl;
        cout<<"last element "<<vect.back()<<endl;
        if(vect.empty())
                cout<<"empty"<<endl;
        return 0;
}

输出为:

nm@nm:~$ g++ vectortest2.cpp
nm@nm:~$ ./a.out
10
3
5
front element 10
last element 0
empty
nm@nm:~$ 

1 个答案:

答案 0 :(得分:3)

载体(或任何容器)上调用front()back()未定义的行为,因此任何事情都会发生。

碰巧的是,当您clear() std::vector时,您正在从中“擦除”元素,因为size()递减了,但是内部数组的物理内存仍被分配,而capacity()保持不变。

因此,在front()的情况下,很可能会返回对已分配内存前端的有效引用,但是您将输出仍存在于该内存位置但在技术上过时且过时的旧数据。无效。但是,对于back(),它不能返回对任何有效内存的引用,因此从其中输出的数据是不确定的。