常用容器
3.2 vector 容器
3.2.1 vector 基本概念
功能: vector数据结构和数组非常相似,也称为单端数组
vector与普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展。
动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
3.2.2 vector 构造函数
功能描述:创建vector容器
函数原型:
(1)vector < T > v;——采用模板实现类实现,默认构造函数
(2)vector(v.begin(),v.end());——将v [begin(),end())区间中的元素拷贝给本身
(3)vector(n,elem);——构造函数将n个elem拷贝给本身
(4)vector(const vector &vec);——拷贝构造函数
#include <iostream>
using namespace std;
//包含容器头文件
#include <vector>
//vector构造函数
void printVector(vector<int> &v)
{
//打印vector容器中的数据
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//vector<int>::iterator为vector的迭代器
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//1.默认构造函数
vector<int> v1;
for (int i = 0; i < 10; i++)//vector容器中添加数据
{
v1.push_back(i);
}
printVector(v1);
//2.通过区间的方式构造
vector<int> v2(v1.begin(), v1.end());
printVector(v2);
//3.n个elem方式构造
vector<int> v3(4, 12);//4个12
printVector(v3);
//4.拷贝构造
vector<int> v4(v3);
printVector(v4);
}
int main()
{
test01();
}
3.2.3 vector赋值操作
功能描述:给vector容器赋值(=或v.assign())
函数原型:
(1)vector & operator=(const vector &vec);——重载等号操作符
(2)assign(beg,end);——将[beg,end)区间中的数据拷贝赋值给本身
(3)assign(n,elem);——将n个elem拷贝赋值给本身
#include<iostream>
using namespace std;
#include <vector>
void printVector(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//vector容器的迭代器vector<int>::iterator
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//1.=赋值
vector <int> v2 = v1;
printVector(v2);
//2.assign方式
vector<int> v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
//3.assign方式
vector<int> v4;
v4.assign(10, 100);
printVector(v4);
}
int main()
{
test01();
}
3.2.4 vector容量和大小
功能描述:对vector的容量和大小进行操作
函数原型:
(1)v.empty();——判断容器是否为空
(2)v.capacity();——容器容量
(3)v.size();——返回容器中元素个数
(4)v.resize(int num);——重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则超出容器长度的元素被删除
(5)v.resize(int num,elem);——重新指定容器的长度为num,若容器的长度变长,则以elem值填充新位置,如果容器变短则超出容器长度的原始将会被删除
#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;
}
//vector容器的容量和大小
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
printVector(v);
//1.判断容器是否为空
if (v.empty())
{
cout << "容器为空!" << endl;
}
else
{
cout << "容器不为空!" << endl;
//2.容器容量
cout << "容器的容量为:" << v.capacity() << endl;//如果容器容量满了就可以开始动态扩展。提升容量
//3.容器大小
cout << "容器的大小为:" << v.size() << endl;
}
//3.重新设置容器大小,如果增加大小,则新位置用默认值填充,如果减小位置,则原始数据删除
v.resize(15);//扩大容器的大小,使用默认值填充新位置
printVector(v);
//4.重新设置容器的大小,与3不同的是,使用指定值进行填充
v.resize(8);
printVector(v);
v.resize(10,6);
printVector(v);
}
int main()
{
test01();
}
3.2.5 vector插入和删除
功能描述:对vector容器进行
(1)插入(v.insert())
(2)删除(v.erase())
函数原型:
(1)push_back(elem);——尾部插入元素elem
(2)pop_back();——删除最后一个元素
(3)insert(const_iterator pos,ele);——迭代器指向位置pos插入元素
(4)insert(const_iterator pos,int count,elem);——迭代器指向位置pos插入count个元素elem
(5)erase(const_iterator pos);——删除迭代器指向元素
(6)erase(const_iterator start,const_iterator end);——删除迭代器从start到end之间的元素
(7)clear();——删除容器中所有元素
#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;
//1.vector容器尾部插入元素:push_back(elem);
v1.push_back(10);
v1.push_back(12);
v1.push_back(14);
v1.push_back(41);
printVector(v1);
//2.vector容器删除尾部最后一个元素:pop_back();
v1.pop_back();
printVector(v1);
//3.迭代器指定位置插入元素:insert(const_iterator pos,ele)
v1.insert(v1.begin(), 100);//头部位置插入100
printVector(v1);
//4.迭代器指向位置插入count个elem:insert(const_iterator pos,int count,elem);
v1.insert(v1.begin(), 2, 11);
printVector(v1);
//5.删除迭代器指向元素:erase(const_iterator pos);
v1.erase(v1.begin());
printVector(v1);
//6.删除迭代器从start到end之间的元素:erase(const_iterator start,const_iterator end);
v1.erase(v1.begin(), v1.end());
printVector(v1);
//7.清空容器clear();
vector<int>v2;
v2.push_back(10);
v2.push_back(12);
v2.clear();
printVector(v2);
}
int main()
{
test01();
}
3.2.6 vector数据存储
功能描述:对vector容器存取操作
函数原型:
(1)at(int idx);——返回索引idx所指向的数据
(2)operator[];——返回索引idx所指的数据
(3)front();——返回容器中第一个数据元素
(4)back();——返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//1.返回索引指向的数据:at(idx)
for (int i = 0; i < v.size(); i++)
{
cout<<v.at(i)<<" ";
}
cout << endl;
//2.liyong 【】方式,返回索引idx所指向的数据
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
//3.返回容器中第一个数据元素:front()
cout << "第一个数据元素:" << v.front() << endl;
//4.返回容器中最后一个数据元素:v.back()
cout << "最后一个数据元素:" << v.back() << endl;
}
int main()
{
test01();
}
3.2.7 vector互换容器
功能描述:实现两个容器内元素进行互换(v.swap(vec))
函数原型:
swap(vec);——将vec与本身的元素互换
#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()
{
//1.容器1
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
//2.容器2
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v2.push_back(i+11);
}
printVector(v2);
cout << "两个容器互换!" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//实际用途:巧用swap可以收缩内存空间
void test02()
{
vector<int> v2;
for (int i = 0; i < 100000; i++)
{
v2.push_back(i);
}
cout << "v的容量为:" << v2.capacity() << endl;//138255
cout << "v的大小为:" << v2.size() << endl;//100000
cout << "重新指定大小!!!!!!!!!!!!!!!!!!!!!" << endl;
v2.resize(3);
cout << "v的容量为:" << v2.capacity() << endl;//138255
cout << "v的大小为:" << v2.size() << endl;//3
cout << "使用swap收缩内存!!!!!!!!!!!!!!!!!!!!!" << endl;
vector<int>(v2).swap(v2);
cout << "v的容量为:" << v2.capacity() << endl;//138255
cout << "v的大小为:" << v2.size() << endl;//3
}
int main()
{
test01();
test02();
}
3.2.8 vector预留空间
功能描述:减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len);——容器预留len元素长度,预留位置不初始化,元素不可访问。
#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;
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++;
}
}
cout << "num=" << num << endl;
}
int main()
{
test01();
}
总结:如果数据量较大,可以一开始利用reserve预留空间