如图示(图片来自侯捷的<<STL源码剖析>>),vector::capacity()代表了vector从begin()开始的连续空间的内存量。
vector::erase(begin() + n)函数可以删去vector中第n位置的元素。但是删除之后,vector占用的capacity不一定减少。C++11增加了shrink_to_fit函数,可以在执行erase之后让vector的size()等于capacity()。
看下面例子。构造一个vector {1,2,3,4},然后点击deduct按钮,删去第3个元素。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <vector>
using namespace std;
vector<int> vec;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString qstrInput = ui->lineEdit->text();
QStringList qstrlst = qstrInput.split(QString(","));
foreach(QString qstrItem, qstrlst)
{
int iVal = qstrItem.toInt();
vec.push_back(iVal);
}
vec.shrink_to_fit();
ui->lineEdit_3->setText(QString().setNum(vec.size()));
ui->lineEdit_4->setText(QString().setNum(vec.capacity()));
ui->label->setText(QString().setNum(*prev(vec.end())));
}
void MainWindow::on_pushButton_2_clicked()
{
int iOldSize = vec.size();
int iIndex = ui->lineEdit_2->text().toInt();
vec.erase(vec.begin() + iIndex);
//vec.shrink_to_fit();
int iTail = *prev(vec.end());
ui->label->setText(QString().setNum(iTail));
ui->lineEdit_3->setText(QString().setNum(vec.size()));
ui->lineEdit_4->setText(QString().setNum(vec.capacity()));
}
效果:capacity 仍然等于4
加入shrink_to_fit函数,capacity 变为3
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <vector>
using namespace std;
vector<int> vec;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString qstrInput = ui->lineEdit->text();
QStringList qstrlst = qstrInput.split(QString(","));
foreach(QString qstrItem, qstrlst)
{
int iVal = qstrItem.toInt();
vec.push_back(iVal);
}
vec.shrink_to_fit();
ui->lineEdit_3->setText(QString().setNum(vec.size()));
ui->lineEdit_4->setText(QString().setNum(vec.capacity()));
ui->label->setText(QString().setNum(*prev(vec.end())));
}
void MainWindow::on_pushButton_2_clicked()
{
int iOldSize = vec.size();
int iIndex = ui->lineEdit_2->text().toInt();
vec.erase(vec.begin() + iIndex);
vec.shrink_to_fit();
int iTail = *prev(vec.end());
ui->label->setText(QString().setNum(iTail));
ui->lineEdit_3->setText(QString().setNum(vec.size()));
ui->lineEdit_4->setText(QString().setNum(vec.capacity()));
}