vector常用解法及详解

vector的常见用途:

(1)储存数据

① vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间。

②有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。由于输出数据的个数是不确定的,为了更方便地处理最后一个满足条件的数据后面不输出额外的空格,可以先用 vector记录所有需要输出的数据,然后一次性输出。

(2)用邻接表存储图

 

 

vector是在c++标准模板库中定义的一种“变长数组”,长度可以根据需要自动变化的数组。相对于普通数组会超内存的情况,这种使用vector会让问题解决便捷很多。

使用vector,需要添加#include<vector>和命名空间“using namespace std”。

以下是vector的常用用法:

1.vector的定义:

(1)一维:

vector<typename> name;
vector<int> name;//int整数类型
vector<node> name;//node结构体类型
vector<vector<int> > name;//vector标准容器类型,记得加空格

typename可以是任何的基本类型,也可以是STL标准容器(如果typename也是一个STL容器,定义的时候要记得在>>符号之间加上空格,防止编译器将其视为移位运算符)。

(2)二维:

vector<typename> Arrayname[arraySize];//一维长度是固定的,二维每一个都是vector
vector<vector<int> > name;//一维、二维每一个都是vector

2.vector容器内元素的访问:

(1)通过下标访问:

和访问普通的数组是一样,对一个定义为 vector<typename> vi 的 vector 容器来说,直接访问 vi[index]即可(如vi[0]、vi[1])。当然,这里下标是从0到 vi.size()-1,访问这个范围外的元素可能会运行出错。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	for(int i=0;i<vi.size();i++) {
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

(2)通过迭代器访问:

迭代器(iterator)可以理解为一种类似指针的东西,定义:

vector<typename>::iterator it;

这样就得到了迭代器it,并且可以通过*it来访问vector里面的元素。

下面定义一个vector并且通过迭代器访问:

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);
	}
	//vi.begin()为取首元素地址,而it指向这个地址
	vector<int>::iterator it = vi.begin();
	for(int i=0;i<5;i++) {
		printf("%d ",*(it+i));	//输出vi[i] 
	}
	return 0; 
}

运行结果:

  • vi[i]和*(vi.begin()+i)是等价的
  • begin()函数是取vi的首元素地址;end()函数是取vi的尾元素的下一个地址,即左闭右开

此外,迭代器还实现了两种自加和两种自减的操作:++it,it++和--it,it--。自增操作如下:

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);
	}
	//vector的迭代器不支持it<vi.end()写法,因此循环条件只能使用it!=vi.end() 
	for(vector<int>::iterator it = vi.begin(); it!=vi.end(); it++) {
		printf("%d ",*it);	//输出vi[i] 
	}
	return 0; 
}

运行结果:

在常用的STL容器中,只有vectorstring中,才允许使用vi.begin()+3这种迭代器加上整数的写法。

 

3.vector常用函数实例解析:

(1)push_back()

函数作用:push_back(x)就是在vector后面添加一个元素x,时间复杂度为O(1)。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

(2)pop_back()

函数作用:pop_back()删除vector的尾元素x,时间复杂度为O(1)。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.pop_back(); //删除vector的尾元素
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

(3)size()

函数作用:size()获取vector中元素的个数

程序代码参考(1)push_back()和pop_back()。

(4)clear()

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

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	printf("原个数=%d\n",vi.size());
	vi.clear();	//清空vector的所有元素 
	printf("现个数=%d\n",vi.size());
	return 0; 
}

运行结果:

 

(5)insert()

函数作用:insert(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N),其中N为vector中元素的个数。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.insert(vi.begin()+2,-1); //在第三个元素的位置上插入 -1 
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

 

insert()还可以用来追加vector容器:

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	vector<int> vi1;
	vi1.push_back(9);	
	vi1.push_back(8);
	vi1.push_back(7);
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.insert(vi.end(),vi1.begin(),vi1.end()); //在第三个元素的位置上插入 -1 
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

还可以选择加入的位置:

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	vector<int> vi1;
	vi1.push_back(9);	
	vi1.push_back(8);
	vi1.push_back(7);
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.insert(vi.end()-1,vi1.begin(),vi1.end()); //在第三个元素的位置上插入 -1 
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

 

(6)erase()

函数作用:erase()两种用法:删除单个元素和删除一个区间内的所有元素。时间复杂度均为O(N)。

删除单个元素:

erase(it)即为删除迭代器为it处的元素。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.erase(vi.begin()+2); //vi.begin()对应的是vi[0],所以vi.begin()+2对应3
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

删除一个区间内的所有元素:

erase(first,last)即为删除[first,last)内的所有元素。

程序代码:

#include<cstdio> 
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i=1;i<=5;i++) {
		vi.push_back(i);	//在vector后面添加一个元素i 
	}
	vi.erase(vi.begin()+2,vi.begin()+4); 
	for(int i=0;i<vi.size();i++) {        //size()获取vi中元素的个数 
		printf("%d ",vi[i]);	//通过下标访问 
	}
	return 0; 
}

运行结果:

(6)count

函数作用:记录vector中元素出现的次数;

程序代码:

#include<cstdio>
#include<vector>
#include <algorithm>
using namespace std;
int main(){
	vector<int>vi;
	vi.push_back(200);
	vi.push_back(200);
	vi.push_back(200);
	vi.push_back(400);
	vi.push_back(100);
	int num1 = count(vi.begin(),vi.end(),200);
	int num2 = count(vi.begin(),vi.end(),400);
	int num3 = count(vi.begin(),vi.end(),300);
	printf("%d %d %d\n",num1,num2,num3);
	return 0;
}

运行结果:

(7)复制vector:

  • “=”

直接等号相连:

程序代码:

#include<cstdio> 
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	vector<int> A;
	A.push_back(0);	
	A.push_back(4);
	A.push_back(4);
	A.push_back(2);
	vector<int> B;
	B = A;
	for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
		printf("%d ",*it);
	}
	printf("\n");
    for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
		printf("%d ",*it);
	}
	return 0; 
}

运行结果:

这种不会改变vector的长度,长度控制使用assign()函数

  • assign()函数

程序代码:

#include<cstdio> 
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	vector<int> A;
	A.push_back(0);	
	A.push_back(4);
	A.push_back(4);
	A.push_back(2);
	vector<int> B;
	B.assign(A.begin()+1,A.end()-1);
	for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
		printf("%d ",*it);
	}
	printf("\n");
    for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
		printf("%d ",*it);
	}
	return 0; 
}

运行结果:

(8)swap

函数作用:将两个vector交换。

程序代码:

#include<cstdio> 
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	vector<int> A;
	A.push_back(1);	
	A.push_back(2);
	A.push_back(3);
	A.push_back(4);
	vector<int> B;
	B.push_back(4);	
	B.push_back(3);
	B.push_back(2);
	B.push_back(1);
	A.swap(B); 
	for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
		printf("%d ",*it);
	}
	printf("\n"); 
    for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
		printf("%d ",*it);
	}
	return 0; 
}

运行结果:

发布了303 篇原创文章 · 获赞 550 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_42410605/article/details/100500271