在C++中常用的string的API都学习完了,这篇开始学习vector容器。vector有点类似数组,但是一个最懂扩容和支持尾部插入和删除的类似数组的容器。vector数据结构和数组非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩容。
数组一旦创建了,就不可以改变,所以叫静态。也就是不可以给数组扩容,只能新建一个更大容量的数组。动态扩容不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
1.vector构造函数
构造函数原型:
vector<T> v; // 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end()); // 将v[begin(), end()]区间中的元素拷贝给本身
vector(n, ele); // 构造函数将n个ele拷贝给本身
vector(const vector &vec); // 拷贝构造函数
先来看看第一个默认的构造函数,然后使用for循环给容器添加元素,最后使用迭代器遍历元素打印输出。以下代码比较基础,后面会经常用到。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
// for循环迭代器遍历容器内元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
// vector 构造函数
vector<int> v1;
// for循环给v1内添加元素
for(int i=0; i < 10; i++)
{
v1.push_back(i);
}
// 遍历容器
printVector(v1);
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
这个printVector(vector<int> &v)是一个工具类函数,后面练习都需要用它来遍历打印输出看看测试效果。下面使用区间的构造方法去创建vector容器对象v2
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
// for循环迭代器遍历容器内元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
// vector 构造函数
vector<int> v1;
// for循环给v1内添加元素
for(int i=0; i < 10; i++)
{
v1.push_back(i);
}
// 遍历容器
printVector(v1);
// 利用区间的方式进行构造
vector<int> v2(v1.begin(), v1.end());
printVector(v2);
}
int main()
{
test01();
system("pause");
return 0;
}
还有两个构造,接着代码举例
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
// for循环迭代器遍历容器内元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
// n 给ele方式构造
vector<int> v1(10, 8);
// 遍历容器
printVector(v1);
// 拷贝构造
vector<int> v2(v1);
printVector(v2);
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
vector容器的构造函数就练习到这里,接下来学习vector容器的赋值操作
2.vector赋值操作
这里说的赋值就是一次性给vector里面元素赋值,不是单一元素操作,构造函数是对象的创建,赋值是对象在初始化之后并赋值。常用几种赋值方式的函数原型
vector& operator=(const vector &vec); // 重载等号操作符
assign(beg, end); // 将[beg, end]区间中的数据拷贝赋值给本身
assign(n, ele); // 将n个ele拷贝赋值给本身
练习代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
// for循环迭代器遍历容器内元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
// vector的赋值操作
vector<int> v1; // 创建一个对象
v1.push_back(3);
v1.push_back(5);
v1.push_back(8);
vector<int> v2;
v2 = v1;
printVector(v2);
// n个ele的方式
vector<int> v3;
v3.assign(5,9);
printVector(v3);
// 区间的方式
vector<int> v4;
v4.assign(v1.begin(), v1.end());
printVector(v4);
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
3.vector的容量大小
函数原型
第一个函数empty()是判断容器是否为空,capacity()是容器容量,size()是元素总个数,剩下两个是调整容器长度,可能会造成数据丢失。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVector(vector<int> &v)
{
// for循环迭代器遍历容器内元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
// vector的容量和大小
vector<int> v1; // 创建一个对象
for(int i=0; i < 10; i++)
{
v1.push_back(i);
}
// 获取容量
int capa = v1.capacity();
cout << "capacity= " << capa << endl;
// 获取元素个数(大小)
if(v1.empty())
{
cout << "size= 0" << endl;
}
elsecls
{
int num = v1.size();
cout << "size= " << num << endl;
}
// 调整容器size大小
v1.resize(20); // 容量默认从16扩容到20
printVector(v1);
// 再次调整size
v1.resize(25, 5);
printVector(v1);
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
验证了几点
1)vecotr容器容量默认是16
2)resize之后,如果比原来要打,默认填充如果数据类型是int,默认填充数字0