[C++]vector的基本的用法

[vector/容器/向量/动态数组]的基本的用法

容器的定义

向量/容器(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。

跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

容器的初始化

为了方便查看容器的内部情况

暂且先用这个函数来输出

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

容器的初始化方式有 4 种

/*define*/
vector<int>v1;
//vector<数据类型>容器名称;

vector<int>v2(10);
//vector<数据类型>容器名称(最大容量);

vector<int>v3(10,2);
//vector<数据类型>容器名称(最大容量,初始所有值);

int i[6]={0,1,2,3,4,5};
vector<int>v4(i+1,i+5);
//vector<数据类型>容器名称(数组名+n,数组名+m);
//将数组 n 到 m 赋值给容器 

vector<int>v5(v4);
//vector<数据类型>容器名称(容器名称)
//将后者完全复制给前者

vector<int>v6(v4.begin(),v4.begin()+3);
//vector<数据类型>容器名称(容器指针1,容器指针2)
//把另一容器从指针1到指针2复制给容器 
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
vector<int>v1;
//vector<数据类型>容器名称;

vector<int>v2(10);
//vector<数据类型>容器名称(最大容量);

vector<int>v3(10,2);
//vector<数据类型>容器名称(最大容量,初始所有值);

int i[6]={0,1,2,3,4,5};
vector<int>v4(i+1,i+5);
//vector<数据类型>容器名称(数组名+n,数组名+m);
//将数组 n 到 m 赋值给容器 

vector<int>v5(v4);
//vector<数据类型>容器名称(容器名称)
//将后者完全复制给前者

vector<int>v6(v4.begin(),v4.begin()+3);
//vector<数据类型>容器名称(容器指针1,容器指针2)
//把另一容器从指针1到指针2复制给容器 

int main(){
	//容器初始化效果
	Out(v1);
	Out(v2); 
	Out(v3); 
	Out(v4);
	Out(v5); 
	Out(v6);
	return 0;
}

对应输出

size:0

size:10
0 0 0 0 0 0 0 0 0 0
size:10
2 2 2 2 2 2 2 2 2 2
size:4
1 2 3 4
size:4
1 2 3 4
size:3
1 2 3

--------------------------------
Process exited after 0.08673 seconds with return value 0
请按任意键继续. . .

容器函数

assign

这个函数时用于更新函数所有的值的

	v.assign(4,2);
	//v.assign(m,n);
	//把 容器v 变为大小为 m 、所有值均为 n 的容器
	
	v.assign(vi.begin(),vi.begin()+6);
	//v.asssign(容器指针1,容器指针2);
	//把 容器v 变成由另一容器 指针1 到 指针2 构成的容器
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
vector<int>v;
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);

int main(){
	
	/*text1*/
	v.assign(4,2);
	Out(v);
	v.assign(5,3);
	Out(v);
	v.assign(2,4);
	Out(v);
	
	/*text2*/
	v.assign(vi.begin(),vi.begin()+6);
	Out(v);
	return 0;
}

对应输出

size:4
2 2 2 2
size:5
3 3 3 3 3
size:2
4 4
size:6
0 1 2 3 4 5

--------------------------------
Process exited after 0.02439 seconds with return value 0
请按任意键继续. . .

back & front

作用是返回容器最头部(front)和尾部(back)的值

	cout << vi.back() << endl;
	//返回头部值 
	cout << vi.front() << endl;
	//返回尾部值 
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);

int main(){
	Out(vi);
	cout << "vi.back() : " << vi.back() << endl;
	//返回头部值 
	cout << "vi.front() : " << vi.front() << endl;
	//返回尾部值 
	return 0;
}

对应输出

size:6
0 1 2 3 4 5
vi.back() : 5
vi.front() : 0

--------------------------------
Process exited after 0.02234 seconds with return value 0
请按任意键继续. . .

clear & empty & erase

  • clear 用于清空容器
  • empty 用于判断容器是否为空
  • erase 用于删除容器的部分数据
	cout << vi.empty();
	//此时 容器vi 不为空 则返回 0(false)

	vi.erase(vi.begin()+1,vi.begin()+4);
	//vi.erase(vi.begin+n,vi.begin+m)
	//把容器从第n+1个到第m个清除
	
	vi.clear();
	//把数组清空 
	
	cout << vi.empty();
	//此时 容器vi 为空 则返回 1(true)
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);

int main(){
	Out(vi);
	cout << "empty : " << vi.empty() << endl << endl;
	//此时 容器vi 不为空 则返回 0(false)
	
	cout << "After erase : " << endl;
	vi.erase(vi.begin()+1,vi.begin()+4);
	Out(vi);
	//vi.erase(vi.begin+n,vi.begin+m)
	//把容器从第n+1个到第m个清除 
	cout << endl;
	
	vi.clear();
	cout << "After clear : " << endl;
	Out(vi);
	//把数组清空 
	
	cout << "empty : " << vi.empty() << endl;
	//此时 容器vi 为空 则返回 1(true)
	return 0;
}

对应输出

size:6
0 1 2 3 4 5
empty : 0

After erase :
size:3
0 4 5

After clear :
size:0

empty : 1

--------------------------------
Process exited after 0.03977 seconds with return value 0
请按任意键继续. . .

pop_back & push_back & size

  • pop_back 删除最后一个元素
  • push_back 往最后面添加一个元素
  • size 返回容器的元素个数
  • capacity 返回容器所占内存

注意:

capacity 返回的是历史所扩充到最大的内存

(详细情况见效果展示)

	cout << vi.size();
	//返回容器元素个数
	
	vi.pop_back();
	//删除尾部元素 
	
	vi.push_back(5);
	//vi.push_back(n); 
	//添加尾部元素 n 
	
	cout << vi.capacity();
	//返回容器所占内存
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);

int main(){
	Out(vi);
	cout << "size : " << vi.size() << endl;
	//返回容器元素个数
	
	cout << "capacity : " << vi.capacity() << endl;
	//返回所占内存 
	
	vi.pop_back();
	Out(vi);
	//删除尾部元素 
	
	cout << "capacity : " << vi.capacity() << endl;
	//即使删去的末尾的元素 所占内存依然不变 
	
	vi.push_back(5);
	Out(vi);
	//vi.push_back(n); 
	//添加尾部元素 n 
	return 0;
}

对应输出

size:6
0 1 2 3 4 5
size : 6
capacity : 6
size:5
0 1 2 3 4
capacity : 6
size:6
0 1 2 3 4 5

--------------------------------
Process exited after 0.1097 seconds with return value 0
请按任意键继续. . .

insert

用来把另一段数据插入容器

	vi.insert(vi.begin()+1,6);
	//vi.insert(vi.begin+m,n);
	//在第 m 号元素后面添加 n 
	
	vi.insert(vi.begin()+1,3,7);
	//vi.insert(vi.begin()+n,m,k);
	//在第 m 号元素后面添加 n 个 m
	
	vi.insert(vi.begin()+9,j+1,j+4);
	//vi.insert(vi.begin()+m,数组名+n,数组名+k);
	//在第 m 号元素后面添加数组的从 n+1号元素 到 k号元素 
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
int i[6]={0,1,2,3,4,5};
int j[5]={6,7,8,9,10};
vector<int>vi(i,i+6);

int main(){
	Out(vi);
	vi.insert(vi.begin()+1,6);
	Out(vi);
	//vi.insert(vi.begin+m,n);
	//在第 m 号元素后面添加 n 
	
	vi.insert(vi.begin()+1,3,7);
	Out(vi);
	//vi.insert(vi.begin()+n,m,k);
	//在第 m 号元素后面添加 n 个 m
	
	vi.insert(vi.begin()+9,j+1,j+4);
	Out(vi);
	//vi.insert(vi.begin()+m,数组名+n,数组名+k);
	//在第 m 号元素后面添加数组的从 n+1号元素 到 k号元素 
	return 0;
}

对应输出

size:6
0 1 2 3 4 5
size:7
0 6 1 2 3 4 5
size:10
0 7 7 7 6 1 2 3 4 5
size:13
0 7 7 7 6 1 2 3 4 7 8 9 5

--------------------------------
Process exited after 0.01651 seconds with return value 0
请按任意键继续. . .

resize & reserve

  • resize 控制元素个数
  • reserve 调整内存大小
  • 用法见效果展示
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size: " << k.size() << endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
int i[10]={0,1,2,3,4,5,6,7,8,9};
vector<int>vi(i,i+10);

int main(){
	Out(vi);
	vi.reserve(1);
	cout << "Reserve as 1 : " << vi.capacity() << endl;
	vi.reserve(100);
	cout << "Reserve as 100 : " << vi.capacity() << endl;
	cout << endl;
	
	Out(vi);
	vi.resize(5);
	Out(vi);
	//将容器元素取前五个 
	vi.resize(10);
	Out(vi);
	//若多,则补全
	vi.resize(15,111);
	Out(vi);
	//还可以自定义补全值 
	return 0;
}

对应输出

size: 10
0 1 2 3 4 5 6 7 8 9
Reserve as 1 : 10
Reserve as 100 : 100

size: 10
0 1 2 3 4 5 6 7 8 9
size: 5
0 1 2 3 4
size: 10
0 1 2 3 4 0 0 0 0 0
size: 15
0 1 2 3 4 0 0 0 0 0 111 111 111 111 111

--------------------------------
Process exited after 0.02639 seconds with return value 0
请按任意键继续. . .

swap & 逻辑运算符

  • vector 支持 swap(交换两个容器) 和 ==/!=/>/</...(判断两个容器是否完全相同时不计capacity)
  • 这比较简单就不详细说明了
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

/*out*/
void Out(vector<int> k){
	cout << "size:" << k.size() <<endl;
	cout << "capacity:" << k.capacity() <<endl;
	for(int i = 0;i < k.size();i++){
		cout << k[i] << " ";
	}
	cout << endl;
}

/*define*/
vector<int>v1(20,2);
vector<int>v2(10,2); 

int main(){
	
	v1.resize(10);
	v1.reserve(100);
	cout << v1.capacity() << " " << v2.capacity() <<endl;
	
	if(v1 == v2)
		cout << "Y";
	else
		cout << "N";
	return 0;
}

对应输出

100 10
Y
--------------------------------
Process exited after 0.02306 seconds with return value 0
请按任意键继续. . .

Vector 与 iterator迭代器

基本概念

1.类模板 template

所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表。
使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。
————CSDN博主「水无垠」

2.迭代器

迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式
可在容器对象(container,例如链表或数组)上遍访的接口
设计人员无需关心容器对象的内存分配的实现细节。
————百度百科

标准库为每一种标准容器(包括vector)定义了一种迭代器类型。
迭代器类型提供了比下标操作更一般化的方法:
所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。
因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector类型也这样。
————CSDN博主「seadplus」

使用方法

  1. 定义
vector<int>::iterator it_v;
//vector<容器类型>::iterator 迭代器名称;
  1. 赋值
it_v = v.begin();
//常有的就是begin函数
//其余的后再赋值讲
  1. 读取
cout << *it_v << endl;
//迭代器用法和指针类似
//用 * 来读取迭代器所指的值(可直接更改里面的值)
  1. 运算
vector<int>::iterator it_mid = v.begin() + v.size()/2;
/*
begin指向的是开始的地址
size是容器的长度
加上size的一半
就正好指向容器的中间位置
*/
cout << *(it_mid + 3) << endl;
/*
迭代器同样可以和数字相加
代表指向 往前(+) 或者 往后(-) 走这么多个元素
*/
效果展示

效果代码

#include<bits/stdc++.h>
using namespace std;

//define
int i[9] = {1,2,3,4,5,6,7,8,9};
vector<int> v(i,i+9);


int main(){
	//输出容器 
	for(vector<int>::iterator it_v = v.begin();it_v != v.end();it_v++){
		cout << *it_v << "  ";
	}
	cout << endl;
	
	//mid
	vector<int>::iterator it_mid = v.begin() + v.size()/2;
	cout << *it_mid << endl;
	
	//add 
	cout << *(it_mid + 3) << endl;
	return 0;
} 

对应输出

1  2  3  4  5  6  7  8  9
5
8

--------------------------------
Process exited after 0.01405 seconds with return value 0
请按任意键继续. . .
posted @ 2021-04-29 19:32  Rosyr  阅读(226)  评论(0编辑  收藏  举报