算法笔记6.1 vector 常见用法

版权声明:原创文章,转载请注明出处 https://blog.csdn.net/hza419763578/article/details/88236933

vector:向量 
            变长数组
(其实为了实现变长,代价是很大的)  vector本质上就是数据结构里基于数组的线性表
            节省内存
            以邻接表的方式存储图

1.vector的定义

vector<typename> name;
eg:
    vector<int> name;
    vector<node> name;   //node是结构体类型
    vector<vector<int> > name; //注意>>直接要用空格 > > 否则有些编译器会误认为是移位
    vector<int> vi[100];
    最后两个都是vectors数组 但是最后一个二维数组只有其中一维是变长的
    
2.vector容器内元素的访问
(1)通过下标访问
    vector<int> vi;
    访问:vi[index]  vi[0] vi[1]
        index范围:0~vi.size()-1


(2)通过迭代器访问
    迭代器是一个类似指针的东西
    vector<int>::iterator it;

代码1:

#include<iostream>		 
#include <vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);//尾部分别插入1 2 3 4 5
	}
	//下标输出
	cout<<"下标输出:";
	for(int i=0;i<5;i++){
		cout<<vi[i]<<" ";		
	}

	//iterator迭代器输出
	vector<int>::iterator it=vi.begin();//初始化为begin
	cout<<"\n迭代器输出:";
	for(int i=0;i<5;i++){
		cout<<*(it+i)<<" ";		
	}
	cout<<endl;
	return 0;
}

  1.     vi[i]和*(vi.begin()+i)是等价的
  2.     vi.begin()首地址,vi.begin()最后一个元素的下一个地址 (美国人习惯左闭右开)
  3.     迭代器支持自加和自减操作,it++,++it,it--,--it

代码2:

#include<iostream>		 
#include <vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);//尾部分别插入1 2 3 4 5
	}

	//iterator迭代器输出
	//vector的迭代器不支持it<vi.end()的写法,因此循环条件只能用it!=vi.end()
	for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl;
	return 0;
}

注意:常用STL中,只有vector和string中才允许使用vi.begin()+3这种迭代器加上整数的写法

3.vector常用函数实例解析

(1)push_back()

push_back(x)在vector后面添加一个元素x,时间复杂度O(1) 

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	//输出
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

(2)pop_back()

pop_back() 删除vector尾元素,时间复杂度O(1)

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	vi.pop_back();//删除尾元素
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

(3)size()

获得vector中元素个数,时间复杂度O(1) 类型unsigned  %d输出也没问题

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	cout<<vi.size()<<endl;
	vi.pop_back();
	cout<<vi.size()<<endl;
	return 0;
}

(4)clear()

clear()用来清空vector中的所有元素,时间复杂度O(N),N为vector中元素的个数

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	cout<<vi.size()<<endl;
	vi.clear();
	cout<<vi.size()<<endl;
	return 0;
}

(5)insert()

insert(it,x),在vector任意迭代器it处插入一个元素x,后面的元素全部自动向后移一位,可以理解为在it左边插入一个元素,时间复杂度为O(N)   //vector就是数组结构里基于数组的线性表

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	vi.insert(vi.begin()+2,-1);
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

(6)erase()

删除单个元素或者删除一个区间内所有的元素

①删除单个元素 erase(it)

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=5;i<=9;i++){
		vi.push_back(i);//5 6 7 8 9
	}
	vi.erase(vi.begin()+3);//删除8    
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

②删除一个区间内所有元素

erase(first,last) 删除[first,last)内的所有元素   //美国人还是喜欢左闭右开

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=5;i<=9;i++){
		vi.push_back(i);//5 6 7 8 9
	}
	vi.erase(vi.begin()+1,vi.begin()+4);//删除 6 7 8
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

4.vector常见用途

(1)储存数据

①节省空间

②避免一行末尾输出多余空格(暂时不知道如何处理)

(2)用邻接表存储图

vector存储图,避免了复杂的指针操作

............后续不断更新添加。。。。。。

猜你喜欢

转载自blog.csdn.net/hza419763578/article/details/88236933
今日推荐