目录
vector 容器基本概念
vector 的数据安排以及操作方式,与 array 非常相似,两者的唯一差别在于空间的 运用的灵活性。
Array 是静态空间,一旦配置了就不能改变。
Vector 是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。
vector容量是用来装元素的,不同类型元素都可存储(内置模板)
vector是单端动态容器:一个入口和出口,且可以动态开辟空间
vector和自定义MyArray非常类似: push_back-存(动态开辟二倍) pop_back_取出
push_back(): 尾部插入
pop_back() 尾部删除
v.begin() 返回的是vector容器的起始迭代器(首元素的位置)
v.end() 返回的是vector容器的结束迭代器(尾元素的下一个元素位置)。
vector 是随机访问迭代器。(随意根据下标取元素)
头文件
#include <vector>
vector 迭代器
Vector 维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为 vector 的迭代器,因为 vector 迭代器所需要的操作行为,如 operaroe, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指针天生 具备。Vector 支持随机存取,而普通指针正有着这样的能力。所以 vector 提供的 是随机访问迭代器(Random Access Iterators).
根据上述描述,如果我们写如下的代码:
Vector::iterator it1;
Vector::iterator it2;
it1 的型别其实就是 Int,it2 的型别其实就是 Teacher*.
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
for (int i = 0; i < 10;i ++){
v.push_back(i);
cout << v.capacity() << endl; // v.capacity()容器的容量
}
system("pause");
return EXIT_SUCCESS;
}
注意: 所谓动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚 有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对 vector 的任何操作,一旦引起空间的重新配置,指向原 vector 的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。
迭代器遍历
#include <vector> //使用vector容器需要添加该头文件
void test_01()
{
vector <int>v(5,10);
cout<<"大小:"<<v.size()<<" 容量"<<v.capacity()<<endl; //5 5
vector<int>::iterator it = v.begin(); //定义迭代器
while(it != v.end()) //使用迭代器遍历 迭代器等于v.end时遍历结束
{
cout<<*it++<<" "; //*it取元素
}
cout<<endl;
}
未雨绸缪机制
vector空间不够时,自动扩容,每次扩2倍
#include <vector>
void test_01()
{
vector <int>v; //定义一个空的vector容器
cout<<"大小:"<<v.size()<<" 容量"<<v.capacity()<<endl; //0 0
int cunt = 0; //判断第几次增容
vector<int>::iterator it = v.begin(); //将迭代器指向头(v.begin)
for(int i=0;i<1000;i++) //使vector遍历增容一千次
{
v.push_back(i); //尾插赋值
if(it != v.begin()) //判断是否增容
{
cout<<"第"<<cunt<<"增容"<<v.capacity()<<endl; //增容后打印
cunt++; //增加打印次数
it = v.begin(); //更新迭代器指向的地址
}
}
}
构造函数
vector v; | 采用模板实现类实现,默认构造函数 |
vector(v.begin(), v.end()); | 将 v[begin(), end()]区间中的元素拷贝给本身。 |
vector(n, elem); | 构造函数将 n 个 elem 拷贝给本身。 |
vector(const vector &vec); | 拷贝构造函数。 |
#include <vector> //头文件
void printvector(vector<int> &v) //使用迭代器打印
{
vector<int>::iterator it = v.begin();
while(it != v.end()) //使用迭代器遍历容器
{
cout<<*it++<<" "; //迭代器++
}
cout<<endl;
}
void test_01()
{
//1. vector v; 采用模板实现类实现,默认构造函数
vector <int>v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
cout<<"--------v--------"<<endl;
printvector(v); //10 20 30 40
cout<<"v:大小:"<<v.size()<<" 容量:"<<v.capacity()<<endl; // 4 4
//2. vector(v.begin(), v.end()); 将 v[begin(), end()]区间中的元素拷贝给本身。
cout<<"--------v1--------"<<endl;
int arr[] = {2,3,4,1,9};
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
printvector(v1); //2,3,4,1,9
cout<<"v:大小:"<<v1.size()<<" 容量:"<<v1.capacity()<<endl; //5 5
//3. vector(const vector &vec); 拷贝构造函数。
vector <int>v3 = v;
cout<<"--------v3--------"<<endl;
printvector(v3); //10 20 30 40 50
cout<<"v3:大小:"<<v3.size()<<" 容量:"<<v3.capacity()<<endl; //5 8
}
常用赋值操作
assign(beg, end); | 将[beg, end)区间中的数据拷贝赋值给本身。 |
assign(n, elem); | /将 n 个 elem 拷贝赋值给本身。 |
vector& operator=(const vector &vec); | 重载等号操作符。 |
swap(vec); | 将 vec 与本身的元素互换。 |
#include <vector>
void printvector(vector<int> &v)
{
vector<int>::iterator it = v.begin();
while(it != v.end())
{
cout<<*it++<<" ";
}
cout<<endl;
}
void test_01()
{
vector <int>v; //初始化一个vector容器
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
printvector(v); //10 20 30 40 50
cout<<"v:大小:"<<v.size()<<" 容量:"<<v.capacity()<<endl; //5 8
//1. vector& operator=(const vector &vec); 重载等号操作符。
vector <int>v3;
v3 = v;
cout<<"--------v3--------"<<endl;
printvector(v3); //10 20 30 40 50
cout<<"v3:大小:"<<v3.size()<<" 容量:"<<v3.capacity()<<endl; //5 5
//2. assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身。
vector <int>v1;
v1.assign(v.begin(),v.end());
cout<<"--------v1--------"<<endl;
printvector(v1); //10 20 30 40 50
cout<<"v1:大小:"<<v1.size()<<" 容量:"<<v1.capacity()<<endl; //5 5
//3. assign(n, elem); /将 n 个 elem 拷贝赋值给本身。
vector <int>v2;
v2.assign(5,10);
cout<<"--------v2--------"<<endl;
printvector(v2); //10 10 10 10 10
cout<<"v2:大小:"<<v2.size()<<" 容量:"<<v2.capacity()<<endl; //5 5
//swap(vec); 将 vec 与本身的元素互换。
v3.swap(v2);
cout<<"--------v2--------"<<endl;
printvector(v2); //10 20 30 40 50
cout<<"v2:大小:"<<v2.size()<<" 容量:"<<v2.capacity()<<endl; //5 5
cout<<"--------v3--------"<<endl;
printvector(v3); //10 10 10 10 10
cout<<"v3:大小:"<<v3.size()<<" 容量:"<<v3.capacity()<<endl; //5 5
}
vector大小操作
size(); | 返回容器中元素的个数 |
empty(); | 判断容器是否为空 |
resize(int num); | 重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。 如果容器变短,则末尾超出容器长度的元素被删除。 |
resize(int num, elem); | 重新指定容器的长度为 num,若容器变长,则以 elem 值填 充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。 |
capacity(); | 容器的容量 |
#include <vector>
void printvector(vector<int> &v)
{
vector<int>::iterator it = v.begin();
while(it != v.end())
{
cout<<*it++<<" ";
}
cout<<endl;
}
void test_01()
{
vector <int>v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
if(!v.empty()) //empty(); 判断容器是否为空 不为空打印
{
//size(); 返回容器中元素的个数 capacity(); 容器的容量
cout<<"大小:"<<v.size()<<" 容量:"<<v.capacity()<<endl; //4 4
}
printvector(v); //10 20 30 40
v.resize(8); //重置大小 8个空间 不足补零
//v.resize(8,100); //重置大小 8个空间 不足补100
//v.resize(2); //重置大小 10 20
if(!v.empty()) //empty(); 判断容器是否为空 不为空打印
{
cout<<"大小:"<<v.size()<<" 容量:"<<v.capacity()<<endl; //8 8
}
printvector(v); //10 20 30 40 0 0 0 0
cout<<"头元素:"<<v.front()<<"尾元素:"<<v.back()<<endl; //10 0
//[]不会抛出异常 at()会抛出异常可被catch捕获
cout<<"元素:"<<v[2]<<"元素:"<<v.at(3)<<endl; //30 40
}
预留空间
reserve(int len); 容器预留 len 个元素长度,预留位置不初始化,元素不可访问。
void test_01()
{
vector <int>v; //无参构造
cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl; //0 0
v.reserve(1000); //预留1000个空间
cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl; //0 1000
}
插入于删除
insert(const_iterator pos, int count,ele); | 迭代器指向位置 pos 插入 count 个元素 ele |
push_back(ele); | 尾部插入元素 ele |
pop_back(); | 删除最后一个元素 |
erase(const_iterator start, const_iterator end); | 删除迭代器从 start 到 end 之间的元素 |
erase(const_iterator pos); | 删除迭代器指向的元素 |
clear(); | 删除容器中所有元素 |
#include <vector>
void printVectorInt(vector<int> &v)
{
vector<int>::iterator it = v.begin();
while(it != v.end())
{
cout<<*it++<<" ";
}
cout<<endl;
}
void test_01()
{
vector <int>v;
//push_back(ele); 尾部插入元素 ele
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
printVectorInt(v); //10 20 30 40 50
//pop_back(); 删除最后一个元素
v.pop_back();
v.pop_back();
v.pop_back();
printVectorInt(v); //10 20 30
//insert(const_iterator pos, int count,ele);
//迭代器指向位置 pos 插入 count 个元素 ele
v.insert(v.begin()+1,3,100); //从下标1位置添加三个100
printVectorInt(v); //10 100 100 100 20
//erase(const_iterator start, const_iterator end);
//删除迭代器从 start 到 end 之间的元素
v.erase(v.begin()+1,v.begin()+4); //从下标1位置向后删除到下标4位置
//v.erase(v.begin(),v.end()); //删除所有
//clear(); 删除容器中所有元素
//v.clear(); //删除所有
printVectorInt(v); //10 20
}
巧用swap
作用:将预留的空间但没用到了 清除
void test_01()
{
vector <int>v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
v.reserve(100);
cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl; //5 100
(vector <int>(v)).swap(v); //匿名对象 不会保留预留空间
cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl; //5 5
}
存自定义对象
使用vector容器存储自定义的对象并打印
#include <vector>
class Person //创建一个类
{
friend void printVectorPerson(vector <Person>&v); //将打印函数作为友元
private:
string name;
int age;
public:
Person(){} //无参构造
Person(string name,int age) //有参构造
{
this->name = name;
this->age = age;
}
};
void printVectorPerson(vector <Person>&v) //打印函数
{
vector <Person>::iterator it = v.begin();
while(it != v.end()) //判断迭代器是否遍历到最后
{
cout<<(*it).name<<" "<<(*it).age<<endl; //解引用后才可以访问类成员属性
it++; //迭代器++
}
}
void test_01()
{
//模板设置为Person
vector <Person>v; //创建一个vector容器
v.push_back(Person("zs",20));
v.push_back(Person("ls",30));
v.push_back(Person("ww",25));
v.push_back(Person("zl",40));
v.push_back(Person("dq",35)); //初始化vector 调用有参构造
printVectorPerson(v); //打印
}
容器嵌套容器
#include <vector>
void printVectorVector(vector <vector<int>> &vv)
{
vector <vector<int>>::iterator it = vv.begin(); //创建外层迭代器
//使用双循环打印 因为需要两重解引用
while(it != vv.end()) //判断外层迭代器是否遍历完毕
{
vector <int>::iterator iit = (*it).begin(); //创建内层迭代器
while(iit != (*it).end()) //判断内层迭代器是否遍历完毕
{
cout<<*iit++<<" "; //内层迭代器++
}
cout<<endl; //打印回车
it++; //外层迭代器++
}
}
void test_01()
{
vector <int>v1; //创建一个vector容器
v1.push_back(1);
v1.push_back(2); //初始化vector
v1.push_back(3);
vector <int>v2; //创建一个vector容器
v2.push_back(10);
v2.push_back(20); //初始化vector
v2.push_back(30);
vector <int>v3; //创建一个vector容器
v3.push_back(100);
v3.push_back(200); //初始化vector
v3.push_back(300);
//将模板设置为vector<int>
vector <vector<int>>v; //创建一个可以存放vector的vector容器
v.push_back(v1); //将vector<int>类型的容器存入
v.push_back(v2);
v.push_back(v3);
printVectorVector(v); //打印
}
由于作者水平有限,内容纯手敲整理可能有误。
如果有哪些不足或者错误的地方,也希望大家督促我尽快改正哦