vector容器基础知识

知识框架
在这里插入图片描述
1.构造函数
基础语法
默认构造:vector<T> v;
拷贝构造:vector(v.begin(), v.end());
拷贝构造:vector(n, elem);
拷贝构造:vector(const vector &vec);

代码实现

#include<iostream>
using namespace std;
#include<string>
#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;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}

	vector<int> v2(v1.begin(),v1.end());

	vector<int> v3(3,10);

	vector<int> v4(v3);

	printvector(v1);
	printvector(v2);
	printvector(v3);
	printvector(v4);

}

int main(){
		test01();
		system("pause");
		return 0;
}

2.赋值操作
基础语法
等号的重载:vector<int> v2 = v1;

assign的调用:
vector<int> v3; v3.assign(v1.begin(),v1.end());

assign的调用:
vector<int> v4; v4.assign(3,10);

代码实现

#include<iostream>
using namespace std;
#include<string>
#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;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}

	vector<int> v2 = v1;

	vector<int> v3;
	v3.assign(v1.begin(),v1.end());

	vector<int> v4;
	v4.assign(3,10);

	printvector(v1);
	printvector(v2);
	printvector(v3);
	printvector(v4);
}

int main(){
		test01();
		system("pause");
		return 0;
}

3.容量&大小
基础语法
empty(); //判断容器是否为空
capacity();//容器的容量
size();/返回容器中元素的个数
resize(int num);
//重新指定容器的长度为num

代码实现

#include<iostream>
using namespace std;
#include<string>
#include<vector>

void printvector(vector<int>& v){
	for(vector<int>::iterator it = v.begin();it != v.end();it++){
	cout<<*it<<" ";
	}
	cout<<endl;
}

void panduan(vector<int>& v1){
	if(v1.empty()){
	cout<<"v1容器为空"<<endl;
	}
	else{
		cout<<"v1容量为:"<<v1.capacity()<<endl;
		cout<<"v1大小为:"<<v1.size()<<endl;
	}
}

void test01(){
	vector<int> v1;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}
	printvector(v1);
	panduan(v1);
	cout<<"--------------------------------------------------"<<endl;

	v1.resize(5);
	printvector(v1);
	panduan(v1);
	cout<<"--------------------------------------------------"<<endl;

	v1.resize(10,10);
	printvector(v1);
	panduan(v1);
	cout<<"--------------------------------------------------"<<endl;

}

int main(){
		test01();
		system("pause");
		return 0;
}

4.插入&删除
基础语法
push_back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
insert(const_iterator pos, ele);
//迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);
//删除迭代器指向的元素
erase(const_iterator start, const_iterator end);
//删除迭代器从start到end之间的元素
clear();//删除容器中所有元素

代码实现

#include<iostream>
using namespace std;
#include<string>
#include<vector>


void printvector(vector<int>& v){
	if(v.empty()){
	cout<<"v1容器为空"<<endl;
	}
	else{
	for(vector<int>::iterator it = v.begin();it != v.end();it++){
	cout<<*it<<" ";
	}
	cout<<endl;
	}
}

void test01(){
	vector<int> v1;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}

	printvector(v1);
	cout<<"------------------------原始数组"<<endl;

	v1.push_back(3);
	printvector(v1);
	cout<<"------------------------push_back后效果"<<endl;

	v1.pop_back();
	printvector(v1);
	cout<<"------------------------pop_back后效果"<<endl;

	v1.insert(v1.begin(),1);
	printvector(v1);
	cout<<"------------------------insert一个数后效果"<<endl;

	v1.insert(v1.begin()+1,2,3);
	printvector(v1);
	cout<<"------------------------insert多个数后效果"<<endl;

	v1.erase(v1.begin());
	printvector(v1);
	cout<<"------------------------erase删除单个元素后效果"<<endl;
	
	v1.erase(v1.begin(),v1.begin()+2);
	printvector(v1);
	cout<<"------------------------erase删除多个元素后效果"<<endl;

	v1.clear();
	printvector(v1);
	cout<<"------------------------clear清除所有元素后效果"<<endl;

}

int main(){
		test01();
		system("pause");
		return 0;
}

5.数据存取
基础语法
at(int idx); //返回索引idx所指的数据
operator[];//返回索引idx所指的数据
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
代码实现

#include<iostream>
using namespace std;
#include<string>
#include<vector>


void test01(){
	vector<int> v1;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}

	v1.at(0) = 2;
	for(int it =0;it < v1.size();it++){
		cout<<v1.at(it)<<" ";
	}
	cout<<"--------------------------------at类型存取"<<endl;

	v1[2] = 0;
	for(int it =0;it < v1.size();it++){
		cout<<v1[it]<<" ";
	}
	cout<<"--------------------------------[]类型存取"<<endl;

	cout<<"v1首元素为:"<<v1.front()<<endl;
	cout<<"v1尾元素为:"<<v1.back()<<endl;
}

int main(){
		test01();
		system("pause");
		return 0;
}

6.容器互换
基础语法
swap(vec); // 将vec与本身的元素互换
注:巧用容器互换可实现内存收缩(具体实现见代码test02())

代码实现

#include<iostream>
using namespace std;
#include<string>
#include<vector>

void printvector(vector<int>& v){
	if(v.empty()){
	cout<<"v1容器为空"<<endl;
	}
	else{
	for(vector<int>::iterator it = v.begin();it != v.end();it++){
	cout<<*it<<" ";
	}
	cout<<endl;
	}
}

//基础语法测试
void test01(){
	vector<int> v1;
	for(int i = 0;i<3;i++){
	v1.push_back(i);
	}

	vector<int> v2;
	for(int i = 3;i>0;i--){
	v2.push_back(i);
	}
	cout<<"-------交换前-------"<<endl;
	cout<<"v1中元素为:"<<" ";
	printvector(v1);
	cout<<"v2中元素为:"<<" ";
	printvector(v2);

	cout<<"-------交换后-------"<<endl;
	v1.swap(v2);
	cout<<"v1中元素为:"<<" ";
	printvector(v1);
	cout<<"v2中元素为:"<<" ";
	printvector(v2);
}

//收缩内存测试
void test02(){
	vector<int> v;
	for(int i = 0;i<10000;i++){
	v.push_back(i);
	}
	cout<<"-------原始容量大小-------"<<endl;
	cout<<"v容量为:"<<v.capacity()<<endl;
	cout<<"v大小为:"<<v.size()<<endl;

	cout<<"-------重置后容量大小-------"<<endl;
	v.resize(3);						//此时会出现浪费大量内存的情况
	cout<<"v容量为:"<<v.capacity()<<endl;
	cout<<"v大小为:"<<v.size()<<endl;

	cout<<"-------交换后容量大小-------"<<endl;
	vector<int>(v).swap(v);			//设定匿名对象和v做互换,收缩内存空间
	cout<<"v容量为:"<<v.capacity()<<endl;
	cout<<"v大小为:"<<v.size()<<endl;

	//解释:vector<int>(v)是一个匿名对象,利用拷贝构造大小同v一致。
}

int main(){
		//test01();
	test02();
		system("pause");
		return 0;
}

运行结果
容器互换运行结果

7.预留空间
基础语法
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
注:通过预留空间,可大大减少内存开辟次数,具体实现见代码。

代码实现

#include<iostream>
using namespace std;
#include<string>
#include<vector>

//未预留空间情况测试
void test01(){
	vector<int> v1;
	int num = 0;
	int* p = NULL;
	//插入元素
	for(int i =0;i<10000;i++){
		v1.push_back(i);
		
		//统计开辟空间次数
		if(p!=&v1[0]){
		p = &v1[0];
		num++;
		}
	}
	cout<<"未预留空间情况下空间开辟次数:"<<num<<endl;
}

//预留空间情况测试
void test02(){

	vector<int> v2;
	v2.reserve(10000);
	int num1 = 0;
	int* p = NULL;
	//插入元素
	for(int i =0;i<10000;i++){
		v2.push_back(i);
		
		//统计开辟空间次数
		if(p!=&v2[0]){
		p = &v2[0];
		num1++;
		}
	}
	cout<<"预留空间情况下空间开辟次数:"<<num1<<endl;
}

int main(){
	test01();
	test02();
		system("pause");
		return 0;
}

运行结果
预留空间运行结果

本文是根据B站内容:《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》:https://www.bilibili.com/video/BV1et411b73Z?p=314 学习整理笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值