1.栈的简单用法
-
top():
返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。并未删除栈顶的元素;
-
push(a):
将a压入栈顶
-
pop():
弹出栈顶元素。即删除栈顶的元素;
-
size():
返回栈中元素的个数。
2.队列的简单用法
- 头文件#include<queue>
- 基本定义方式
queue<string>a; 定义了一个队列a,
或者是queue<int>a;
front():返回 queue 中第一个元素的引用。
back():返回 queue 中最后一个元素的引用。
push(a):在 queue 的最后面添加一个元素
pop():删除 queue 中的第一个元素。
size():返回 queue 中元素的个数。
empty():如果 queue 中没有元素的话,返回 1,否则返回0;
3.容器vector(当成动态数组使用)
- 头文件 #include<vector>
- Vector<int>a; 定义了一个数组a,数组的长度可以自动改变
Vector<int>a[100]; 定义了100个动态数组,相当于100个数组堆放在一起,他们的下标从0开始
a.size() 返回数组元素的长度或者个数,o(1)复杂度
a.empty() 判断数组是否为空,注意注意。。。为空返回1,不为空返回0;
a.begin() 返回第一个元素的值,与a[0]相同
a.end() 越界访问,指向最后一个元素的后面
a.front() 返回第一个元素的值,与a[0]相同
a.back() 返回最后一个元素的值,与a[a.size-1]相同和*--a.end()也相同
因为a的下标是从0开始的,而size是1到n,所以需要减一;
a.push_back(x) 把元素x插入数组的尾部
a.pop_back() 删除vector的最后一个元素
vector的遍历
For(int i=0;i<a.size;i++)
Cout<<a[i]<<endl;
4.map
原理:map就相当于一个映射,假如说,你去超市买菜,售货员在给你打秤时,他需要遍历一下由价格所组成的数组,如果说有一个f(x)的函数,这个函数你输入蔬菜的名称,它就能算出价格数组中的这个蔬菜的位置,那么map就相当于这个f(x)。
补充:散列表
-
散列技术仅仅是一种查找技术吗?
应该说,散列既是一种查找技术,也是一种存储技术。
-
散列是一种完整的存储结构吗?
散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,即通过关键码能推出 Key 值,但是通过关键码对应的值(即位置处的值)不能推出关键码,所以散列存储的关键码和值之间并不对称,因此散列主要是面向查找的存储结构。
把map当成一个数组来看,当你向map这个数组中放东西时,相同的东西,都放在同一个位置,就像函数中y=x+1,让x等于一,得到的总是2.
用途:map最大的优势就是查找,因为用它查找时,不用再遍历数组了
mp的一些常用函数:
首先,定义方式:
map<char, int> mymap1;表示放进去的是字符,生成的是一个整数
map<string, int> mymap2;表示放进去的是字符串,生成的是一个整数
map.size();//查询map中有多少对元素,返回的是map中含有多少的函数值(表示的是有多少个不同的函数值)
empty();// 查询map是否为空
map[key]=value//插入操作,也就是对map中的元素赋值,相当于对数组中的元素赋值,不同的地方在于,第一次输入一个x,然后map[x]=vable,第二次再输x时,还是对之前的map[x]继续进行操作。
count<<map[a]<<endl;表示取当x为a时所对应的函数值,用下面的代码来举例就是
string x="a";
cout<<mp[x]<<endl;
输出的结果为a的个数。
遍历操作:
map<string, string>::iterator it;
for (it = mapSet.begin(); it != mapSet.end(); ++it)
{
cout << "key" << it->first << endl;
cout << "value" << it->second << endl;
}
没啥好解释的,记住就行。
查找操作:
string x="a";
cout<<mp.count(x);
判断a是否存在,如果存在,返回1,否则返回0;
例题:输入一个整数n,然后输入n个单词,计算每个单词输出的个数
代码如下:
#include<iostream>
#include<map>
using namespace std;
map<string,int>mp;
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
string t;
cin>>t;
mp[t]++;
}
map<string, int>::iterator it;//map的遍历
for (it = mp.begin(); it != mp.end(); ++it)
{
cout<<it->first<<endl;
cout<<it->second<<endl;
}
return 0;
}
补充说明:map会对map中的元素自动排序,默认升序,如果出现两个相同的(就本题而言,如果有abs a b b abs ,输出的结果为
a
1
abs
2
b
2
也就是说当两个相同的时候,会先输出先出现的那一个。