vector的基本概念
功能:
vector容器与数组非常类似,也称单端数组(动态数组)
vector容器的内部结构图示:
vector与普通数组之间的区别:
vector可以动态扩展,而普通数组是静态空间,一旦确定了大小就不能修改
动态扩展:
动态扩展并非是在原有空间接新空间(因为不知道后面空间的使用情况),而是找更大的内存空间,然后将原数据拷贝到新空间中,释放原空间
vector容器的迭代器是支持随机访问的迭代器(即可以进行+2,+n的操作)
vector构造函数
功能:对vector容器进行初始化操作
eg:
注:1、用vector时需包含头文件vector
2、常用的构造函数有无参构造和拷贝构造
vector赋值操作
功能:为vector容器赋值
eg:
vector容量和大小操作
总结:判断容器是否为空用成员函数empty,返回元素个数用size,返回容器容量用capacity,重新指定大小用resize。(注:容器容量永远大于等于容器元素个数)
eg:
#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int>v;//默认构造,又称无参构造
for (int i = 0; i < 5; i++)
{
v.push_back(i);//将i插入到动态数组中
}
if (v.empty())//若容器v为空,则返回true,否则返回false
{
cout << "容器vector为空" << endl;
}
else
{
cout << "vector容器不为空" << endl;
printVector(v);//打印v中的元素
cout << "容器v的大小为:" << v.size() << endl;
cout << "容器v的容量为:" << v.capacity() << endl;
}
//v.resize(10);//若容器变长,则变长的位置默认填0
//printVector(v);
v.resize(10, 100);//可用resize的重载版本将变长位置的值改成其他的值
printVector(v);
cout << "容器v的容量为:" << v.capacity() << endl;
v.resize(3);//若容器变短,则末尾超出容器长度的元素被删除
printVector(v);
system("pause");
return 0;
}
测试结果:
vector的插入与删除
各插入与删除操作与成员函数对应关系如下:
尾插--pop_back 、尾删--push_back、插入--insert(位置迭代器)、删除--erase(位置迭代器)、清空---clear
#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int>v;//默认构造,又称无参构造
for (int i = 0; i < 5; i++)
{
v.push_back(i);//尾插法
}
printVector(v);//打印数组中的元素
v.pop_back();//尾删法--删除最后一个元素
printVector(v);
v.insert(v.begin()+2, 100);//将迭代器指针往起始位置向后偏移2个单位,并将100插入到此位置中
printVector(v);
v.insert(v.begin(), 2, 100);//insert的重载版本--将2个100插入到容器v的起始位置中
printVector(v);
v.erase(v.begin() + 4);//删除从起始位置向后偏移4个单位的元素
printVector(v);
v.erase(v.begin(), v.begin() + 2);//删除[v.begin(),v.begin()+2]之间的所有元素
printVector(v);
v.clear();//清空数组中所有元素
printVector(v);
system("pause");
return 0;
}
vector数据存取
可以通过下标、成员函数at,front,back来访问vector中的元素
vector互换容器
用内置成员函数swap来实现两个vector容器的交换
实际应用:swap可以使两个容器互换,达到实用的收缩内存效果
eg:
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector<int>v;
for (int i = 0; i < 10000000; i++)//首先用尾插法将v的空间扩的非常大
{
v.push_back(i);//尾插法
}
cout << "容器的大小为:" << v.size() << endl;//结果为10000000
cout << "容器的容量为:" << v.capacity() << endl;//11958657
//现在resize将容器的大小变为3
v.resize(3);
cout << "容器的大小为:" << v.size() << endl;//结果为3
cout << "容器的容量为:" << v.capacity() << endl;//11958657
//可以发现容器的大小变为了3,但容器容量还为11958657,造成了大量的空间浪费,因此需用容器交换来解决
vector<int>(v).swap(v);
//vector<int>(v)表示创建了一个匿名对象,并用拷贝构造的方式将v的数据传给了此匿对象(设为x)。
//vector<int>(v).swap(v)---将v与x进行交换,使得v指向x所指向的空间,x指向v所指向的空间。而匿名对象的特点就是执行完本行后,
//所占空间会立即被回收。从而达到了收缩内存的效果
cout << "容器的大小为:" << v.size() << endl;//结果为3
cout << "容器的容量为:" << v.capacity() << endl;//输出结果同样为3
system("pause");
return 0;
}
vector预留空间
作用:若一开始就知道要插入很多的数,为了减少动态开辟的次数,可以在一开始就利用reserve预留空间。
eg:
#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int>v;
int count = 0;//用以统计数组动态增长的次数
int*p=NULL;
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
if (p != &v[0])
{
p = &v[0];
count++;
}
}
cout << count << endl;//结果为30,说明动态增加到100000个数,需要动态开辟30次空间
//若要减少动态开辟的次数,则可提前给v预留100000个空间,即
vector<int>v1;
v1.reserve(100000);
count = 0;
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (p != &v1[0])
{
p = &v1[0];
count++;
}
}
cout << count << endl;//输出结果为1,大大减少了动态开辟内存造成的开销
system("pause");
return 0;
}