第一节 c++ 数据结构 vector用法详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


引言

本章我们一起来学习c++中STL(是c++中的标准模板库),下面是我的学习笔记,分为6个小节来讲解,供大家参考,如果觉得总结的不错的话,可以收藏起来方便今后复习。

本章概括

第一章 STL和基本数据结构

章节内容
1.1容器 vector
1.2队列 queue
1.3栈 stack
1.4链表 list
1.5set
1.6map

1.1.1 vector

1.介绍

  • 数组是基本的数据结构,有静态数组动态数组两种类型。如果空间紧张,可以用STL的vector建立动态数组,不仅节约空间,而且也不易出错。vector容器是一个模板类,能存放任何类型的对象。

2.定义

-
功能例子说明
定义int型数组vector< int >a;默认初始化,a为空
vector< int >b(a);用a定义b
vector< int >a(100);a有100个值为0的元素
vector< int >a(100,6);100个值为6的元素
定义string型数组vector< string >a(10,“null”);10个值为null的元素
vector< string >vec(10,“hello”);10个值为hello的元素
vector< string >b(a.begin(),a.end());b是用a 的复制
定义结构型数组struct point{ int x,y;}; vector< point >a;a用来存坐标

————————————————

还可以定义多维数组:
vector< int > a[MAXN];

3.常见操作

功能例子说明
赋值a.push_back(100)在尾部添加元素
元素个数int size = a.size();元素个数
是否为空bool isEmpty = a/empty();判断是否为空
打印cout<<a[0]<<endl;打印第一个元素
中间插入a.insert(a.begin() + i,k);在第i个元素前面插入k
尾部插入a.push_back(i);在尾部插入i
删除尾部a.pop_back();删除尾部元素
删除区间a.erase(a.begin() + i,a.begin() + j);删除区间[i,j+1]的元素
删除元素a.erase(a.begin()+2);删除第三个元素
调整大小a.resize(n);数组大小变为n
清空a.clear();清空
翻转reverse(a.begin(),a.end());用reverse()翻转数组
排序sort(a.begin(),a.end());用函数sort排序

4.代码讲解

定义

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	
	vector<int>a(7,7);//定义具有7个整型元素的向量,且给出的每个元素初值为7
	for(int i = 0;i < 7;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	//7 7 7 7 7 7 7
	
	vector<int>a1(7);//定义具有7个整型元素的向量
	
	vector<int>a2(a);//用向量a给向量a2赋值,a2的值完全等价于a的值
	for(int i = 0;i < 7;i++)
		cout<<a2[i]<<" ";
	cout<<endl;
	//7 7 7 7 7 7 7
	
	int b[7]={1,2,3,4,5,6,7};
	vector<int> a3(b,b+7);//从数组中获得初值
	for(int i = 0;i < 7;i++)
		cout<<a3[i]<<" ";
	cout<<endl;
	//1 2 3 4 5 6 7
	
	
	vector<int>a4(a3.begin(),a3.begin() + 3);//将向量a3中从0-3(共3个)的元素赋值给a,a的类型为int型
	for(int i = 0;i < 3;i++)
		cout<<a4[i]<<" ";
	cout<<endl;
	//1 2 3
	
	vector<string>s(3,"guanzhu777");//定义3是字符串的元素 
	for(int i = 0;i < 3;i++)
		cout<<s[i]<<" ";
	cout<<endl;
	//guanzhu777 guanzhu777 guanzhu777 

	return 0;
}

运用

对于上面说总结的操作进行演示,每一个知识点都有涉及到,每一个过程都有输出结果。

#include<iostream>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int>a;//定义 
	
	for(int i = 0;i < 7;i++)
	{
		a.push_back(i);//在尾部添加元素 
	}
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 1 2 3 4 5 6 
	
	cout<<a.size()<<endl;//元素的个数
	//输出结果为7
	
	a.insert(a.begin()+3,7);//在第3个元素后插入7 
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 1 2 7 3 4 5 6  
	
	a.erase(a.begin()+1,a.begin()+4);//删除区间[1,3] 
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 3 4 5 6  
	
	a.resize(6);//重新定义数组大小;
	cout<<a.size()<<endl; 
	//输出结果为6
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 3 4 5 6 0   后面用0补齐 
 
 	reverse(a.begin(),a.end());
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 6 5 4 3 0
	
	sort(a.begin(),a.end());
	for(int i = 0;i < a.size();i++)cout<<a[i]<<" ";//输出结果 
	cout<<endl; 
	//输出结果为0 0 3 4 5 6
	
	cout<<a.empty()<<endl;//bool类型,a为空则是0,反之则为1 
	//输出结果为0
	while(!a.empty())//不为空则执行循环 
	{
		a.pop_back();//不断弹出尾部元素,直到a为空 
	}
	cout<<a.empty()<<endl;
	//输出结果为1
	
	a.clear();//清空数组 
	return 0;
} 

1.1.2例题

  • problem:
    圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

  • input
    多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);

    2 3
    2 4

  • output
    对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行。

    GBBG

    BGGB

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int>table; //定义
	int n,m;
	while(cin>>n>>m)
	{
		table.clear(); 
		for(int i = 0;i < n*2;i++)table.push_back(i);//初始化
		int pos = 0;//记录当前位置
		for(int j = 0;j < n;j++)//赶走n个人
		{
			pos = (pos + m  - 1)%table.size();//圆桌是环,取余处理
			table.erase(table.begin() + pos);//赶走坏人,table人数减1
		}
		int k = 0;
		for(int j = 0;j < 2*n;j++)
		{
			if(j%50 == 0&&j)cout<<endl;
			if(table[k] == j)
			{
				cout<<"G";
				k++;	
			}
			else cout<<"B";
			
		}
		cout<<endl<<endl;//转行
	}
	
	return 0;
}

1.1.3总结


vector的优点:
(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()

(2) 随机访问方便,即支持[ ]操作符和vector.at()

(3) 节省空间。

vector的缺点:
(1) 在内部进行插入删除操作效率低。

(2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。

(3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放


下一节我们将对栈stack进行详解,请大家持续关注

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C++中的vector是一个动态数组,具有可变大小,可以在运行时向其添加或删除元素。以下是vector用法详解: 1. 头文件 使用vector需要包含头文件vector。 ```c++ #include <vector> ``` 2. 创建vector 可以使用以下方式创建vector: ```c++ // 创建一个空的vector std::vector<int> vec1; // 创建一个有5个元素的vector,每个元素都是0 std::vector<int> vec2(5); // 创建一个有3个元素的vector,每个元素的初始值是1 std::vector<int> vec3(3, 1); // 创建一个vector,初始化为另一个vector std::vector<int> vec4(vec3); ``` 3. 访问vector元素 可以使用以下方式访问vector中的元素: ```c++ std::vector<int> vec{1, 2, 3, 4, 5}; // 使用下标访问元素 int a = vec[0]; // 使用at函数访问元素 int b = vec.at(1); // 使用front函数访问第一个元素 int c = vec.front(); // 使用back函数访问最后一个元素 int d = vec.back(); ``` 4. 添加元素 可以使用以下方式向vector中添加元素: ```c++ std::vector<int> vec{1, 2, 3}; // 在尾部添加一个元素 vec.push_back(4); // 在指定位置插入一个元素 vec.insert(vec.begin() + 2, 5); // 在尾部添加另一个vector中的所有元素 std::vector<int> vec2{6, 7, 8}; vec.insert(vec.end(), vec2.begin(), vec2.end()); ``` 5. 删除元素 可以使用以下方式删除vector中的元素: ```c++ std::vector<int> vec{1, 2, 3, 4, 5}; // 删除尾部元素 vec.pop_back(); // 删除指定位置的元素 vec.erase(vec.begin() + 2); // 删除指定范围的元素 vec.erase(vec.begin() + 1, vec.begin() + 3); // 删除所有元素 vec.clear(); ``` 6. 获取vector信息 可以使用以下方式获取vector的信息: ```c++ std::vector<int> vec{1, 2, 3, 4, 5}; // 获取元素个数 int size = vec.size(); // 获取容量 int capacity = vec.capacity(); // 判断vector是否为空 bool empty = vec.empty(); ``` 以上是vector的基本用法,可以根据实际需要对其进行扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七七_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值