提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
引言
本章我们一起来学习c++中STL(是c++中的标准模板库),下面是我的学习笔记,分为6个小节来讲解,供大家参考,如果觉得总结的不错的话,可以收藏起来方便今后复习。
本章概括
第一章 STL和基本数据结构
章节 | 内容 |
---|---|
1.1 | 容器 vector |
1.2 | 队列 queue |
1.3 | 栈 stack |
1.4 | 链表 list |
1.5 | set |
1.6 | map |
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进行详解,请大家持续关注