一、初识Vector容器
学习目标1:学会往Vector容器中添加内置数据类型和Vector容器的遍历
示例:
#include "iostream"
#include <vector>
#include <algorithm>
using namespace std;
void print(int val)
{
cout << val << endl;
}
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);
//通过迭代器访问容器中的数据
vector<int>::iterator itBegin = v.begin();
vector<int>::iterator itEnd = v.end();
//遍历方式一
while (itBegin!=itEnd)
{
cout << *itBegin << endl;
itBegin++;
}
cout << "第二种遍历方式" << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
cout << "第三种遍历方式:用STL中的算法遍历" << endl;
for_each(v.begin(), v.end(), print);
}
int main01()
{
test01();
system("pause");
return 0;
}
学习目标2:往Vector容器中添加自定义数据类型与遍历
示例:
#include "iostream"
#include <string>
#include <vector>
using namespace std;
//自定义数据库 类型
class People
{
public:
//People() {};
People(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
void ShowPeoleInfo()
{
cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;
}
string m_Name;
int m_Age;
};
void testPeople()
{
//vector<People> arr;
//People p1("小黄", 21);
//People p2("小兰", 32);
//People p3("小红", 41);
//People p4("小名", 22);
//People p5("小花", 12);
//arr.push_back(p1);
//arr.push_back(p2);
//arr.push_back(p3);
//arr.push_back(p4);
//arr.push_back(p5);
//cout << "Vector容器的当前容量是:" << arr.capacity() << endl;
//cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;
遍历容器中的数据
//for (vector<People>::iterator it = arr.begin(); it != arr.end(); it++)
//{
// //cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;
// cout << "姓名:" << (*it).m_Name<<" " << "年龄:" << (*it).m_Age << endl;
//}
vector<People*> arr;
People p1("小黄", 21);
People p2("小兰", 32);
People p3("小红", 41);
People p4("小名", 22);
People p5("小花", 12);
arr.push_back(&p1);
arr.push_back(&p2);
arr.push_back(&p3);
arr.push_back(&p4);
arr.push_back(&p5);
cout << "Vector容器的当前容量是:" << arr.capacity() << endl;
cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;
//遍历容器中的数据
for (vector<People*>::iterator it = arr.begin(); it != arr.end(); it++)
{
//cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;
cout << "姓名:" << (*it)->m_Name << " " << "年龄:" << (*it)->m_Age << endl;
}
}
int main()
{
testPeople();
system("pause");
return 0;
}
学习目标3:容器中嵌套容器
示例:
#include "iostream"
#include <vector>
#include <string>
using namespace std;
//容器中嵌套容器
void test02()
{
//1、***********定义一个大容器***********
vector<vector<int>> V;
//2、创建小容器
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
//3、向小容器中添加数据
for (int i = 0; i < 4; i++)
{
v1.push_back(i);
v2.push_back(i + 1);
v3.push_back(i + 2);
v4.push_back(i + 3);
}
//4、把小容器放到大容器中
V.push_back(v1);
V.push_back(v2);
V.push_back(v3);
V.push_back(v4);
//5、遍历大容器中的所有数据
for (vector<vector<int>>::iterator it = V.begin(); it != V.end(); it++)
{
//(*it) ---是指vector<int>
//再遍历每一个小容器中的数据
cout << "遍历每个小容器的数据" << endl;
for (vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); it1++)
{
cout << *it1 << endl;
}
}
}
int main()
{
test02();
system("pause");
return 0;
}
二、vector容器的构造函数
学习目标:学会灵活使用vector容器的几种构造函数
vector容器与数组不同之处在于:空间可以动态扩展。
动态扩展:动态扩展并不是在原来的内存空间上扩展,而是寻找(开辟)更大的内存空间,把原来的数据拷贝到新空间,最后把原来的空间释放掉。
vector容器支持随机访问的迭代器。
vector函数原型:
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(),v.end()) //将v[begin(),end())区间的元素拷贝给本身
vector(n,elem) //构造函数将n个elem拷贝给本身
vector(const vector &vec) //拷贝构造函数
示例:
#include "iostream"
#include <vector>
#include <string>
using namespace std;
void printVector(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it<<" ";
}
cout << endl;
}
void test04()
{
vector<int> v1; //1、默认构造参数
for (int i = 1; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1); //1 2 3 4 5 6 7 8 9
//2、通过区间的方式进行构造
vector<int> v2(v1.begin(), v1.end());
printVector(v2); //1 2 3 4 5 6 7 8 9
//3、n个elem来构造
vector<int> v3(10, 100);
printVector(v3); //100 100 100 100 100 100 100 100 100 100
//4、拷贝构造
vector<int> v4(v3);
printVector(v4); //100 100 100 100 100 100 100 100 100 100
}
int main()
{
test04();
system("pause");
return 0;
}
三、vector容器的赋值操作
学习目标:学会利用几种原型函数给vector容器进行赋值
函数原型:
vector& operator=(const vector &vec) //重载等号赋值操作
assign(begin,end) //将[begin,end)区间的数据拷贝赋值给本身
assign(n,elem) //将n个elem拷贝赋值给本身
示例:
#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 test05()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
PrintVector(v);
//1、等号进行赋值操作
cout << "赋值操作 operator=" << endl;
vector<int> v2;
v2 = v;
PrintVector(v2);
//2、assign
vector<int> v3;
v3.assign(v.begin(), v.end());
PrintVector(v3);
//3、 assign n个elem进行赋值
vector<int> v4;
v4.assign(10, 100);
PrintVector(v4);
}
int main()
{
test05();
system("pause");
return 0;
}
总结:vector赋值最简单的方式是用等号进行赋值
四、vector容器的容量与大小操作
学习目标:能灵活对vector容器的容量与大小进行操作
函数原型:
empty(); //判断容器是否为空
capacity(); //获取容器的容量
size(); //获取容器中的元素个数
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
//若容器变短,则末尾超出容器长度的元素被删除
resize(int num,elem) //重新指定容器的长度为num,若容器变长,则以elem填充新位置
//若容器变短,则末尾超出容器长度的元素被删除
示例:
#include "iostream"
#include <vector>
using namespace std;
void PrintVector06(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test06()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
PrintVector06(v); //0 1 2 3 4 5 6 7 8 9
if (v.empty()) //为真代表容器为空
{
cout << "v容器为空!!!!" << endl;
}
else {
cout << "v容器不不不为空!!!!" << endl;
cout <<"v容器的容量是:"<< v.capacity() << endl;
cout << "v容器的大小是:" << v.size() << endl;
}
//重新指定v容器的大小
v.resize(15);
PrintVector06(v); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
//
v.resize(20,100);
PrintVector06(v); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 100 100 100 100 100
v.resize(2);
PrintVector06(v); //0 1
}
int main()
{
test06();
system("pause");
return 0;
}
五、vector容器的插入和删除操作
学习目标:能够进行vector容器的插入、删除操作
函数原型:
push_back(elem);
pop_back(); //删除最后一个元素
insert(const_iterator pos,elem); //迭代器指向位置pos插入元素elem
insert(const_iterator pos,int count,elem); //迭代器指向位置pos插入count个元素elem
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
clear(); //删除容器中所有元素
示例:
#include "iostream"
#include <vector>
using namespace std;
void PrintVector07(vector<int> &v)
{
if (v.empty())
{
cout << "容器为空!" << endl;
}
else
{
cout << "容器的容量为:"<<v.capacity() << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
}
cout << endl;
}
void test07()
{
vector<int> v;
//尾插法
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
PrintVector07(v); //10 20 30 40 50
//尾删法
v.pop_back();
PrintVector07(v); //10 20 30 40
//插入法 第一个参数是迭代器
v.insert(v.begin(), 1000);
PrintVector07(v); //1000 10 20 30 40
v.insert(v.begin(), 2,1000);
PrintVector07(v); //1000 1000 1000 10 20 30 40
//删除
v.erase(v.begin());
PrintVector07(v); //1000 1000 10 20 30 40
//v.erase(v.begin(), v.end());
v.clear();
PrintVector07(v); //输出为空
}
int main()
{
test07();
system("pause");
return 0;
}
总结:尾插、尾删、插入、删除、清空
六、vector数据的存取
学习目标:对vector容器中的数据进行存取操作
函数原型:
at(int index); //返回索引index所指的数据
operator[]; //返回索引index所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
示例:
#include "iostream"
#include <vector>
using namespace std;
void PrintVector08(vector<int> &v)
{
if (v.empty())
{
cout << "容器为空!" << endl;
}
else
{
cout << "容器的容量为:" << v.capacity() << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
}
cout << endl;
}
void test08()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//1、用[] 来访问容器中的元素
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
//2、利用at方式来访问元素
for (int i = 0; i < v.size(); i++)
{
cout << v.at(i) << " ";
}
cout << endl;
//3、获取容器中的第一个元素
cout << "v容器中的第一个元素:" << v.front() << endl;
//4、获取最后一个元素
cout << "v容器的最后一个元素:" << v.back() << endl;
}
int main()
{
test08();
system("pause");
return 0;
}
七、vector容器互换
学习目标:实现两容器内的元素互换
函数原型:
swap(vec); //将vec与本身的元素互换
示例:
#include "iostream"
#include <vector>
using namespace std;
void PrintVector09(vector<int> &v)
{
if (v.empty())
{
cout << "容器为空!" << endl;
}
else
{
cout << "容器的容量为:" << v.capacity() << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
}
cout << endl;
}
void test09()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
cout << "交换前:"<<endl;
PrintVector09(v1);
vector<int> v2;
for (int i =10; i >0; i--)
{
v2.push_back(i);
}
PrintVector09(v2);
cout << "交换后:" << endl;
v1.swap(v2);
PrintVector09(v1);
PrintVector09(v2);
}
//实际用途 巧用swap可以收缩内存空间
void test009()
{
vector<int> v;
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
}
cout << "v的容量为:" << v.capacity() << endl; //138255
cout << "v的大小为:" << v.size() << endl; //100000
v.resize(3); //重新指定大小
cout << "v的容量为:" << v.capacity() << endl; //138255
cout << "v的大小为:" << v.size() << endl; //3
//巧用swap收缩内存
vector<int>(v).swap(v); //vector<int>(v)匿名对象
cout << "v的容量为:" << v.capacity() << endl; //3
cout << "v的大小为:" << v.size() << endl; //3
}
int main09()
{
//test09();
test009();
system("pause");
return 0;
}
总结:巧用swap收缩内存 vector<int>(v).swap(v)
八、vector预留空间
预留空间的作用:减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可以访问
示例:
#include "iostream"
#include <vector>
using namespace std;
void test10()
{
std::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 = &v[0];
num++;
}
}
cout << "num=" << num << endl; //未加v.reserve(100000); 30 进行了30次动态扩展
cout << "num=" << num << endl; //加v.reserve(100000); 1 进行了1次动态扩展
}
int main10()
{
test10();
system("pause");
return 0;
}
总结:如果一开始就知道数据量比较大,可以利用reserve预留空间