本文包含vector基本概念、vector构造函数、vector赋值操作、vector容量和大小、vector插入和删除、vector数据存取、vector互换容器、vector预留空间。
功能:
vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别:
不同之处在于数组是静态空间(大小固定),而vector可以动态扩展
动态扩展:
(1)、并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间;
功能描述:
创建vector容器
函数原型:
(1)、vector
采用模板实现类实现,默认构造函数
// vector单端数组构造函数
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 默认构造,无参构造
vector<int> v;
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(2)、vector(v.begin(), v.end());
将v(begin(), end())区间中的元素拷贝给本身 (前闭后开)
// vector单端数组构造函数
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 默认构造,无参构造
vector<int> v;
// 将v开始迭代器到结束迭代器之间的元素,赋给v1
vector<int> v1(v.begin(), v.end());
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(3)、vector(n, elem);
构造函数将n个elem拷贝给本身
// vector单端数组构造函数
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 将10个10拷贝给v
vector<int> v(10, 10);
Fun_Print(v); // 调用Fun_Print()函数,遍历v
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(4)、vector(const vector &vec);
拷贝构造函数
// vector单端数组构造函数
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 默认构造,无参构造
vector<int> v;
// 拷贝构造
vector<int> v1(v);
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
给vector容器进行赋值
函数原型:
(1)、vector& operator=(const vector &vec);
重载等号操作符
// vector单端数组赋值
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 默认构造,无参构造
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i); // 向容器中存放数据
}
// 赋值 operator=
vector<int> v1 = v;
Fun_Print(v1);
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(2)、assign(beg, end);
将[beg, end)区间中的数据拷贝赋值给本身
// vector单端数组赋值
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 默认构造,无参构造
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i); // 向容器中存放数据
}
// 使用assign()函数,将容器v起始迭代器到结束迭代器之间的元素赋给v1
vector<int> v1;
v1.assign(v.begin(), v.end());
Fun_Print(v1);
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(3)assign(n, elem);
将n个elem拷贝赋值给本身
// vector单端数组赋值
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 使用assign()函数,将10个'a'赋值给本身
vector<int> v1;
v1.assign(10, 'a'); // a - 97
Fun_Print(v1);
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
对vector容器的容量和大小操作
函数原型:
(1)、empty();
判断容器是否为空
// vector单端数组容量和大小
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 向容器中放数据
v.push_back(1);
// empty()为真,代表容器为空
if (v.empty()) {
cout << "v容器为空" << endl;
}
else {
cout << "v容器不为空" << endl;
}
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
// vector单端数组容量和大小
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 向容器中放数据
v.push_back(1);
// empty()为真,代表容器为空
if (v.empty()) {
cout << "v容器为空" << endl;
}
else {
cout << "v容器不为空" << endl;
// capacity()返回容器的容量
cout << "v容器的容量为:" << v.capacity() << endl;
}
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
// vector单端数组容量和大小
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 向容器中放数据
v.push_back(1);
// empty()为真,代表容器为空
if (v.empty()) {
cout << "v容器为空" << endl;
}
else {
cout << "v容器不为空" << endl;
// size()返回容器的个数
cout << "v容器的个数为:" << v.size() << endl;
}
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
1)、重新指定容器的长度为num,若容器变长,则以默认值填充新位置 (默认填充0)
2)、如果容器变短,则末尾超出容器长度的元素被删除
// vector单端数组容量和大小
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 向容器中放数据
v.push_back(1);
v.push_back(2);
v.push_back(3);
// resize()重新指定大小 ,若指定的更大,默认用0填充新位置
v.resize(10);
Fun_Print(v); // 调用Fun_Print()函数,遍历容器v
// resize()重新指定大小 ,若指定的更小,超出部分元素被删除
v.resize(5);
Fun_Print(v); // 调用Fun_Print()函数,遍历容器v
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
1)、重新指定容器的长度为num,若容器变长,则以elem值填充新位置
2)、如果容器变短,则末尾超出容器长度的元素被删除
// vector单端数组容量和大小
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 向容器中放数据
v.push_back(1);
v.push_back(2);
v.push_back(3);
// resize()重新指定大小 ,若指定的更大,默认用0填充新位置;可以利用重载版本替换默认填充,默认填充10
v.resize(10, 10);
Fun_Print(v); // 调用Fun_Print()函数,遍历容器v
// resize()重新指定大小 ,若指定的更小,超出部分元素被删除
v.resize(5, 50);
Fun_Print(v); // 调用Fun_Print()函数,遍历容器v
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
对vector容器进行插入、删除操作
函数原型:
(1)、push_back(ele);
尾部插入元素ele
(2)、pop_back();
删除最后一个元素
(3)、insert(const_iterator pos, ele);
迭代器指向位置pos插入元素ele (第一个参数为迭代器)
(4)、insert(const_iterator pos, int count,ele);
迭代器指向位置pos插入count个元素ele
(5)、erase(const_iterator pos);
删除迭代器指向的元素
(6)、erase(const_iterator start, const_iterator end);
删除迭代器从start到end之间的元素
(7)、clear();
删除容器中所有元素
// vector单端数组插入和删除
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 1、push_back()向容器尾部插入元素
v.push_back(1);
v.push_back(2);
v.push_back(3);
Fun_Print(v); // 1 2 3
// 2、pop_back()插入容器尾部元素
v.pop_back();
Fun_Print(v); // 1 2
// 3、insert()在容器的结束迭代器处,插入100
v.insert(v.end(), 100);
Fun_Print(v); // 1 2 100
// 4、insert()在容器的结束迭代器处,插入5个1000
v.insert(v.end(), 5, 1000);
Fun_Print(v); // 1 2 100 1000 1000 1000 1000 1000
// 5、erase()删除容器开始迭代器中的元素
v.erase(v.begin());
Fun_Print(v); // 2 100 1000 1000 1000 1000 1000
// 6、erase()删除容器开始迭代器到结束迭代器中的元素
v.erase(v.begin(), v.end());
Fun_Print(v); //
// 7、clear()情况容器中的元素
v.clear();
Fun_Print(v); //
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
对vector中的数据的存取操作
函数原型:
(1)、at(int idx);
返回索引idx所指的数据
(2)、operator[i];
返回索引idx所指的数据
(3)、front();
返回容器中第一个数据元素
(4)、back();
返回容器中最后一个数据元素
// vector单端数组容器数据存取
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
for (int i = 0; i < 10; i++) {
// push_back()向容器尾部插入元素
v.push_back(i);
}
for (int i = 0; i < v.size(); i++) {
// 1、at()返回索引i所指向的数据元素
cout << v.at(i) << " "; // 0 1 2 3 4 5 6 7 8 9
}
cout << endl;
for (int i = 0; i < v.size(); i++) {
// 2、[]返回容器下标i所指向的数据元素
cout << v[i] << " "; // 0 1 2 3 4 5 6 7 8 9
}
cout << endl;
// 3、front()返回容器中的第一个数据元素
cout << "v容器的第一个元素为: " << v.front() << endl; // 0
// 4、back()返回容器中的最后一个数据元素
cout << "v容器的最后一个元素为: " << v.back() << endl; // 9
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
实现两个容器内元素进行互换
函数原型:
swap(vec);
将vec与本身的元素互换
// vector单端数组容器数据存取
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
vector<int> v1;
for (int i = 0; i < 10; i++) {
// push_back()向容器尾部插入元素
v.push_back(i);
v1.push_back(i + 100);
}
cout << "容器互换前----------------------------" << endl;
Fun_Print(v);
Fun_Print(v1);
v.swap(v1); // swap()将v1容器中的数据元素与本身的数据元素进行互换
cout << "容器互换后----------------------------" << endl;
Fun_Print(v);
Fun_Print(v1);
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
// vector单端数组容器数据存取
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
for (int i = 0; i < 100000; i++) {
// push_back()向容器尾部插入元素
v.push_back(i);
}
cout << "v容器的容量为:" << v.capacity() << endl; // 138255
cout << "v容器的个数为:" << v.size() << endl; // 100000
v.resize(3); // 重新指定个数
cout << "指定个数后------------------------------" << endl;
cout << "v容器的容量为:" << v.capacity() << endl; // 138255
cout << "v容器的个数为:" << v.size() << endl; // 3
// 收缩内存;使用swap收缩内存
vector<int>(v).swap(v); //vector(v)匿名对象;相当于利用v来创建了一个新的对象,其实是调用拷贝构造函数创建一个新对象(x);实际无名(x);按照v来做初始化操作,会按v目前所用的元素个数来初始化匿名对象(x)的大小;所以匿名对象最开始大小和容量都为3;使用swap,容器交换后,匿名对象会进行回收
// 互换元素的本质:相当于指针的交换
// 匿名对象特点:当前行代码执行完后,匿名对象立即被回收,系统回收
cout << "收缩内存后------------------------------" << endl;
cout << "v容器的容量为:" << v.capacity() << endl; // 3
cout << "v容器的个数为:" << v.size() << endl; // 3
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
功能描述:
减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len);
容器预留len个元素长度,预留位置不初始化,元素不可访问
// vector单端数组容器数据存取
#include // 包含标准输入输出流头文件
using namespace std; // 使用标准命名空间
#include // 使用vector单端数组容器,需包含头文件vector
void Fun_Print(vector<int>& v) { // 使用引用方式&,传入vector类型的形参v
// vector::iterator 拿到vector这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " "; // it是个迭代器类型,本是是个指针,需使用*解引用
}
cout << endl;
}
void test() {
// 创建vector单端数组容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
// 利用reserve()预留空间
v.reserve(100000); // 如果一开始就预留足够的空间,就不用连续开辟(动态扩展)30次
int num = 0; // 统计开辟次数
int* p = NULL;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
if (p != &v[0]) { // 如果这个指针,不等于v容器第0位位置的地址,首地址;创建v时,会先开辟一块内存空间,当大小超过容量时,会再次开辟一块新的内存空间,首地址会发生改变
p = &v[0]; // 让指针p指向首地址;相当于跟换了一次地址
num++;
}
}
cout << "num:" << num << endl; // num:30;动态扩展,开辟空间,将原有数据存入新空间,释放原空间,做了30次;写了预留v.reserve(100000);则只开辟一次
}
int main() {
test();
system("pause"); // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果
return 0; // 程序正常退出
}
(1)、vector 的多种构造方式没有可比性,灵活使用即可;
(2)、vector 赋值方式比较简单,使用operator=,或者assign都可以;
(3)、vector 判断是否为空 — empty;
(4)、vector 返回元素个数 — size;
(5)、vector 返回容器容量 — capacity;
(6)、vector 重新指定大小 — resize;
(7)、vector 尾插 — push_back;
(8)、vector 尾删 — pop_back;
(9)、vector 插入 — insert (位置迭代器);
(10)、vector 删除 — erase (位置迭代器);
(11)、vector 清空 — clear ;
(12)、除了用迭代器获取vector容器中元素,[ ]和at也可以;
(13)、front() 返回容器第一个元素;
(14)、back() 返回容器最后一个元素;
(15)、swap() 可以使两个容器互换,可以达到实用的收缩内存效果;
(16)、如果数据量较大,可以一开始利用reserve()预留空间。