目录
1.vector基本概念
- vector是顺序容器中的一种。可变大小数据。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。
- vector与普通数组区别:
①vector容器可变大小数据,空间动态扩展。
②数组是静态空间,固定的内存空间。
2.创建vector
-
初始化vector常用方法
vector<T>v1; v1是一个空vector,它是一个模板类型。执行默认初始化
vector<T>v2(v1) v2包含v1所有元素副本
vector<T>v2=v1 等价于v2(v1),v2中包含v1所有元素副本
vector<T>v3(n,val) v3包含n个重复的元素,每个元素的值都是val
vector<T>v3(3,5) v3包含3个重复的元素,每个元素的值都是5
vector(const vector &vec) 拷贝构造函数
-
代码演示
#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 test() { vector<int>v1;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); //通过区间方式进行构造 vector<int>v2(v1.begin(), v1.end()); printVector(v2); //n个elem方式构造 vector<int>v3(10, 100); printVector(v3); //拷贝构造 相当于 vector<int>v4=v3; vector<int>v4(v3); printVector(v4); } int main() { test(); return 0; }
3.vector赋值
- 常见赋值操作
vector<T>v1;
v1.push_back(10);
v1.assign(begin,end) //将[begin,end)区间的数据拷贝赋值给本身
v1.assing(n,val); //将n个val赋值给本身
- 代码演示
#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 test()
{
vector<int>v1,v2,v3,v4;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//赋值操作 operator =
v2 = v1;
printVector(v2);
//assign
v3.assign(v1.begin(), v1.end());
printVector(v3);
//n个val赋值
v4.assign(10, 100);
printVector(v4);
}
int main()
{
test();
return 0;
}
4.vector容量及大小
- 容器及大小接口函数
empty()//判断容器是否为空
capacity()//容器的容量为多少
size()//返回容器中元素的个数
resize(T val,val)//重新指定大小,如果重新指定比原来长,默认用0来填充
//也可指定填充,如(20,200)就用200来填充
resize(20,100)
- 代码演示
#include<iostream> #include<vector> using namespace std; void printV(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test() { vector<int>v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } if (v1.empty()) { cout << "v1为空" << endl; } else { cout << "v1不为空" << endl; cout << "v1的容量为: " << v1.capacity() << endl; cout << "v1的大小为:" << v1.size() << endl; } //重新指定大小 //v1.resize(15,100); //如果重新指定比原来长,默认用0来填充 //也可指定填充,如(15,100)就用100来填充 //printV(v1); v1.resize(3); printV(v1); cout << "v1的容量为: " << v1.capacity() << endl; } int main() { test(); return 0; }
5.vector插入和删除
- 插入和删除接口
push_back(val)//尾部插入元素 pop_back()//删除最后一个元素 clear()//删除容器中所以元素
- 代码演示
#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 test()
{
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);
printVector(v1);
v1.insert(v1.begin(), 2, 1000);
printVector(v1);
//删除 参数也是迭代器
v1.erase(v1.begin());
printVector(v1);
//清空
//v1.erase(v1.begin(), v1.end()); 和下面代码用处一样
v1.clear();
printVector(v1);
}
int main()
{
test();
return 0;
}
6.vector数据存取
- 数据存储
at(T val)//返回val所指数据
[val] //返回val所指数据
front() //返回元素中第一个数据
back() //返回元素中最后一个数据
- 代码演示
#include<iostream>
#include<vector>
using namespace std;
void test()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(10);
}
//利用 []方式访问数组中元素
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
//利用at方式访问
for (int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
}
cout << endl;
//获取第一个元素
cout << "第一个元素为: " << v1.front() << endl;
cout << "最后一个元素为: " << v1.back() << endl;
}
int main()
{
test();
return 0;
}
7.vector互换容器
- 作用:两个容器内元素互换,减少内存空间的使用
- 代码演示
#include<iostream>
#include<vector>
using namespace std;
//vector容器互换
void printVector(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//1.基本使用
void test()
{
vector<int>v1,v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
cout << "交换前: " << endl;
printVector(v1);
for (int i = 10; i > 0; i--)
{
v2.push_back(i);
}
printVector(v2);
cout << "交换后: " << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//2.实际用途
//巧用swap可以收缩内存空间
void test02()
{
vector<int>v;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
}
cout << "v的容量为: " << v.capacity()<<"大小为: "<<v.size()<<endl;
v.resize(3);//重新指定大小
cout << "v的容量为: " << v.capacity() << "大小为: " << v.size() << endl;
//巧用swap收缩内存
vector<int>(v).swap(v);
cout << "v的容量为: " << v.capacity() << "大小为: " << v.size() << endl;
}
int main()
{
test02();
return 0;
}
8.vector预留空间
- 作用:减少动态扩展时的扩展次数
reserve(T val)
- 代码演示
#include<iostream>
#include<vector>
using namespace std;
void test()
{
vector<int>v;
v.reserve(10000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
if (p != &v[0])
{
p = &v[0];
num++;
}
}
cout << "num = " << num << endl;
}
int main()
{
test();
return 0;
}