功能:
vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别:
不同之处在于数组是静态空间,而vector可以动态扩展
动态扩展:
并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
vector容器的迭代器是支持随机访问的迭代器
vector构造函数
#include <iostream>
#include <vector>
using namespace std;
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(v1.begin(),v1.end()); //构造v2时把v1的区间数据拷贝给v2
printVector(v2);
vector<int>v3(10,100); //构造v3时把10个100拷贝给v3
printVector(v3);
vector<int>v4(v3); //构造v4时把v3拷贝给v4
printVector(v4);
}
int main()
{
test01();
return 0;
}
vector赋值操作
#include <iostream>
#include <vector>
using namespace std;
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;
v2 = v1; //=赋值
printVector(v2);
vector<int>v3;
v3.assign(v1.begin(),v1.end()); //assign赋值,区间内全拷贝过去,左闭右开区间
printVector(v3);
vector<int>v4;
v4.assign(10,100); //assign赋值。10个100
printVector(v4);
}
int main()
{
test01();
return 0;
}
vector容量和大小
#include <iostream>
#include <vector>
using namespace std;
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);
if(v1.empty())
{
cout << "v1为空" << endl;
}
else
{
cout << "v1不为空" << endl;
cout << "v1的容量为" << v1.capacity() << endl; //默认是16?
cout << "v1的大小为" << v1.size() << endl;
}
//resize重新指定大小,默认用0填充,可以替换填充值
v1.resize(20,10);
printVector(v1);
cout << "v1的容量为" << v1.capacity() << endl;
cout << "v1的大小为" << v1.size() << endl;
//resize重新指定大小,如果变小,超出部分删除
v1.resize(5);
printVector(v1);
}
int main()
{
test01();
return 0;
}
vector插入和删除
#include <iostream>
#include <vector>
using namespace std;
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;
//尾插
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
printVector(v1);
//尾删
v1.pop_back();
printVector(v1);
//插入
v1.insert(v1.begin(),100); //开始位置插入100
printVector(v1);
v1.insert(v1.begin(),2,1000); //开始位置插入2个1000
printVector(v1);
//清空
v1.erase(v1.begin(),v1.end());
v1.clear();
printVector(v1);
}
int main()
{
test01();
return 0;
}
vector数据存取
#include <iostream>
#include <vector>
using namespace std;
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);
for(unsigned int i = 0 ;i < v1.size() ;i++)
{
cout << v1[i] << " "; //直接索引
}
cout << endl;
for(unsigned int i = 0 ;i < v1.size() ;i++)
{
cout << v1.at(i) << " " ; //at索引
}
cout << endl;
cout << "front:" << v1.front() << endl;
cout << "back:" << v1.back() << endl;
}
int main()
{
test01();
return 0;
}
vector互换容器
#include <iostream>
#include <vector>
using namespace std;
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);
}
void test02()
{
vector<int>v;
for(int i = 0 ;i < 10000 ;i++)
{
v.push_back(i);
}
cout << "v的容量为" << v.capacity() << endl;
cout << "v的大小为" << v.size() <<endl;
v.resize(3);
cout << "v的容量为" << v.capacity() << endl;
cout << "v的大小为" << v.size() <<endl;
//收缩内存
vector<int>(v).swap(v); //匿名对象
//先利用v的大小建立一个新的匿名对象,再把两个交换,达到v的内存收缩
cout << "v的容量为" << v.capacity() << endl;
cout << "v的大小为" << v.size() <<endl;
}
int main()
{
//test01();
test02();
return 0;
}
vector预留空间
#include <iostream>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
for(vector<int>::iterator it = v.begin() ; it != v.end() ;it++)
{
cout << *it << " ";
}
cout << endl;
}
//预留空间
void test01()
{
vector<int>v;
//预留空间
v.reserve(100000);
int num = 0; //统计开辟空间次数
int *p = NULL; //标记
for(int i = 0 ;i < 100000 ;i++)
{
v.push_back(i);
if(p != &v[0]) //判断指针p是否指向数组头部,如果没有,说明开辟了空间,把p强制指向数组头部,num加1
{
p = & v[0];
num ++;
}
}
cout << "num : " << num << endl;
}
int main()
{
test01();
return 0;
}
//vector扩展是需要重新开辟空间的,所以数据量过大的话,可以预留空间