STL------map,vector(预习和复习)

请全屏阅读哦~

map,翻译为映射。书上都说的不是很通俗(反正我是没看懂),它的作用如下:

对于两个不同类型的变量之间建立一种联系,(就像搭了一座桥),调用的时候用迭代器实现,下面上代码。
map <string, int> mp;//把一个 string 型的 数据映射成 int 型,在这里说可能不是很清楚,看下面的的例题哦~
// mp 是定义 map 数组的经典用名,没有其他别的意思

迭代器:

map <string, int> :: iterator it; // 定义一个 it 的迭代器用来访问 map 中的值
/* 前面就是把你定义时写的那一堆 copy 下来*/

it 它是不可以写成小于或大于的,它只可以判断等于或者不等于迭代器 it 其实就是一个地址,它也可以进行 it++ 或 it-- 等操作。赋初值一般为 :it = mp.begin(); 就是把 it 的初值赋成 mp 的最开始的值。*it 在这里是不支持的,但是可以用 it->first 或者 it->second 来访问 mp 之中的第一个与第二个,在上面那道题中,
it->first 就是访问的 string 型的,而 it->second 就是访问的 int 型的。
举个栗子:

string a;
cin >> a;
map <string, int> :: iterator it;
for (it = mp.begin(); it != mp.end(); it++) {
	if (it -> first == a) {
		printf("%d", it -> second);
	}
} 

map 它支持以下几种操作:

  1. it = mp.begin() ,这里的 it 就是迭代器,mp.bedin() 就是返回 mp 中最前面一个值的地址
  2. it != mp.end() ,mp.end() 就是返回 mp 中最后一个值的再后面一个值的地址,这句话通常用在循环当中,下面会有代码哦!( 这 里 的 i t 一 定 一 定 一 定 要 先 赋 初 值 , 博 主 已 经 错 怕 了 这里的 it 一定一定一定要先赋初值,博主已经错怕了 it
  3. mp.clear(); 清空 mp 数组
  4. mp.erase(it); 删除 mp 中,mp[it] 这个东东。it 依旧是迭代器;

题目描述:

博主yanglin英语非常不好,为了应对初中英语考试,她手里有一本英语字典,现在有很多单词要查。
请编写程序帮助她快速找到要查的单词所在的页码。

输入描述:

第一行1个整数N,N≤10000,表示字典中一共有多少单词。
接下来每两行1个单词,其中:第一行是长度≤100的字符串,表示这个单词,全是小写字母,
单词不会重复。 第二行是1个整数,表示这个单词在字典中的页码。
接下来是一个整数M,M≤N,表示要查的单词数。 接下来M行,每行一个字符串,表示要查的单词,保证在字典中存在。

输出格式:

M行,每行1个整数,表示第i个单词在字典中的页码。

我就直接在代码上面解释吧~~~ 😄

#include <cstdio>
#include <cmath>
#include <map>//头文件
#include <cstring>
#include <iostream>
#include <algorithm> 
using namespace std; 
map <string, int> dic; // 把一个单词与一个页码建立一座桥
//字典的简写
int n, num;  
int main() { 
	scanf("%d\n", &n); //字词个数
	for (int i = 1; i <= n; i++) { //输入
		string s; 
		cin >> s; //
		scanf("%d\n", &num); 
		dic[s] = num;//把这个单词所对应的页码设成这个数。对的,你没看错,就是用字符串作为下标,
		//这就是 map 的神奇之处
		//可以直接把他赋值,不用先做其他的东东(有些读者可能知道哦~)
	} 
	scanf("%d", &n); 
	for (int i = 1; i <= n; i++) { 
		string s;
		cin >> s; 
		printf("%d\n", dic[s]); //直接输出这个单词的页码
	} 
	return 0; 
} 

学了 map 之后这道题是不是就敲极敲极简单了呢?
上面这份伪代码实现的功能就是:输入一个字符串 a ,然后在 mp 中查找属于 a 的 int 值是多少并输出。mp.end() 的作用是返回mp数组中最后一个值在后面一个(空)的地址,也就是说 it 等与最后一个空地址的时候就结束循环。

map 它只会比较 key 的值(上面的 string 类型就是一个 key),因为 key 一定是不相同的,所以一定能排出顺序来。并且是按字典序小的排在前面。(自动排序)。


vector 😛

vector其实就是一个变长数组,它可以节约一道题中对于空间的浪费,并且避免空间开小而RE的问题,但它的元素是从 0 号位开始存的,所以有一点点不习惯。(通俗一点就是数组的空间能像弹簧一样变长短)

定义:

vectot <int> v;//定义一个数组名为 v 的变长数组

常用的操作 :

  • v.push_back(a); // 在数组中插入变量 a
  • v.pop_back(); // 把最后一个元素删除
  • v.clear(); //把 v 数组清空
  • int len = v.size() - 1; //返回 v 数组的长度,减一是因为从 0 号位开始
    要是定义的是一个二维的,如下:
vector < vector <int> > v;

那么你就不能直接把一个变量加进去,要再定义一个 vector 来实现,具体如下:

vector < vector <int> > v;
vector < int > a;
int n = 10;
for (int i = 1; i <= n; i++) {
	for (int j = 1; j <= n; j++) {
		int x;
		cin >> x;
		a.push_back(x);
	}
	v.push_back(a);
}

就是这样,这个问题其实博主也纠结了很久呢~
注 :vector 也和 map 一样,可以用迭代器访问哦~,(博主就更喜欢迭代器)
关于 vector 的例题,其实也就和数组一样的,没什么好些的啦~


文章就到这里了,有什么不好的地方还请在下面评论区指正哟~,拜拜!
注 : 其他STL请点开我的博客阅读哦QWQ。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页