- 功能:vector数据结构和数组非常相似,也称为单端数组
- 区别:数组是静态空间,vector可以动态扩展
1.构造函数
- 动态扩展:并不是在原空间后续接新空间,而是找一个更大的内存空间,然后将原数据拷贝到新空间,再释放原空间。vector容器的迭代器是支持随机访问的迭代器
- vector构造函数:
功能:创建一个vector容器
- 函数原型:
vector<T> v;//采取模板实现类实现,默认构造函数
vector<v.begin().v.end());//将[v.begin().v.end())区间的元素拷贝给本身
vector(n,elem);//构造函数将n个elme拷贝给本身
vector(const vector&v);//拷贝构造函数
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
//无参构造 //采取模板实现类实现,默认构造函数
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//将[v.begin().v.end())区间的元素拷贝给本身
vector<int>v2(v1.begin(), v1.end());
printVector(v2);
//构造函数将n个elme拷贝给本身
vector<int>v3 (10, 100);
printVector(v3);
//***拷贝构造函数
vector<int>v4(v3);
printVector(v4);
}
void printVector(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
2.赋值操作
- 功能:给vector容器进行赋值
- 函数原型:
vector&operator=(const vector&v);//重载等会操作
assign(beg,end);//将[beg,end)区间的数据拷贝赋值给本身
assign(n,ellem);//将n个elem拷贝赋值给本身
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//赋值
vector<int>v2;
v2 = v1;
printVector(v2);
vector<int>v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
vector<int>v4;
v4.assign(10, 100);
printVector(v4);
}
void printVector(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
3.vector容器的容量和大小
- 功能:给vector容器的容量和大小操作
- 函数原型:
empty();//判断容器是否为空
capacity();//容器的容量
size();//返回容器中元素个数
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置**若容器变短。则末尾超出容器长度的元素被删除
resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置**若容器变短。则末尾超出容器长度的元素被删除
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);//0 1 2 3 4 5 6 7 8 9
if (v1.empty())
{
cout << "该容器为空" << endl;
}
else
{
cout << "该容器不为空" << endl;
cout << "该容器的容量为:" << v1.capacity() << endl;//13 因为是动态扩展
cout << "该容器的大小为:" <<v1.size()<< endl;//10
}
//重新指定大小
//v1.resize(15);//指定长了,默认值为0 输出:0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
//printVector(v1);
//v1.resize(15,3);//指定长了,重新设置默认值为3 输出:0 1 2 3 4 5 6 7 8 9 3 3 3 3 3
//printVector(v1);
v1.resize(5);
printVector(v1);//比原来小了,超出的就删掉
}
void printVector(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
4.插入和删除
- 功能:对vector容器进行插入和删除
- 函数原型:
push_back(ele);//在尾部插入元素ele
pop_back();//删除最后一个元素
insert(const_iterator pos,ele);//迭代器指向位置pos擦汗如元素ele
insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);//删除迭代器指向的元素
erase(const_iterator start,const_iterator end);//迭代器删除从start到end之间的元素
clear();//删除容器所以元素
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v);
void test01()
{
vector<int>v;
//尾插
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
printVector(v);
//尾删
v.pop_back();
printVector(v);
//insert(const_iterator pos,ele);//迭代器指向位置pos插入元素ele
v.insert(v.begin() + 1, 99);
printVector(v);
//insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele
v.insert(v.begin() + 1,2, 99);
printVector(v);
//erase(const_iterator pos);//删除迭代器指向的元素
v.erase(v.begin());
printVector(v);
//erase(const_iterator start, const_iterator end);//迭代器删除从start到end之间的元素
v.erase(v.begin()+1,v.begin()+5);//删除 第一个元素之后到第五个元素
printVector(v);
//clear();//删除容器所以元素
v.clear();
printVector(v);
}
void printVector(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
5.数据存取
- 功能:对vector容器中的数据的存取操作
- 函数原型:
at(int idx);//返回索引idx的所指的数据
operator[];//返回索引idx的所指的数据
front();//返回容器的第一个数据元素
back();//返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
void test01()
{
vector<int>v;
for(int i=0;i<10;i++)
{
v.push_back(i);
}
//at(int idx);//返回索引idx的所指的数据
for (int i = 0; i < v.size(); i++)
{
cout << v.at(i) << " ";
}cout << endl;
//operator[];//返回索引idx的所指的数据
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}cout << endl;
//front();//返回容器的第一个数据元素
cout << "容器的第一个数据元素" << v.front() << endl;
//back();//返回容器中最后一个数据元素
cout << "容器中最后一个数据元素" << v.back() << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
6.互换容器
- 功能:实现两个容器内元素进行互换
- 函数原型:
swap(v);//将v与本身的元素互换
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//基本使用
void test01()
{
vector<int>v1;
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int>v2;
for (int i = 10; i>0; i--)
{
v2.push_back(i);
}
printVector(v2);
cout << "交换后的元素:" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//实际用途
//利用swap可以收缩内存空间
void test02()
{
vector<int>v1;
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
}
cout << "v1的容量为:" << v1.capacity() << endl;
cout << "v1的大小为:" << v1.size() << endl;
//容量会比大小多
//重新指定大小
v1.resize(3);
cout << "v1的容量为:" << v1.capacity() << endl;
cout << "v1的大小为:" << v1.size() << endl;
//利用swap可以收缩内存空间
vector<int>(v1).swap(v1);
//vector<int>(v1)--同名的匿名对象{指向的是3个大小元素}和v1交换元素;
//匿名对象指向100000个大小的元素,匿名对象特点:当前行执行完后,编译器回收
cout << "v1的容量为:" << v1.capacity() << endl;
cout << "v1的大小为:" << v1.size() << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
7.预留空间
- 功能:减少vector在动态扩展时的扩展次数
- 函数原型:
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问;和resize不同
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//预留空间
void test02()
{
vector<int>v1;
v1.reserve(100000);
int num = 0;//统计开辟次数
int* p = NULL;
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (p != &v1[0])
{
p = &v1[0];
num++;
}//如果需要开辟新的空间,那么就需要指针指向首地址
}//使用reserve函数可以直接一次确定所需要的空间
cout << "开辟次数=" << num << endl;
}
int main()
{
test02();
system("pause");
return 0;
}