目录
六.unordered_set和unoredered_map
一.vector
直接解释可以叫做矢量向量,也可以叫动态数组。
头文件
#include <vector>, 必须有名称空间和头文件
#include <iostream>
#include <vector>
using namespace std;
创建的几种方式
vector <int> v1; 创建一个动态数组;他是一个空的数组,长度为0;
vector <int> v2(5); 创建一个动态数组,给它分配了5个空间,初始化为0;
vector <int> v3(5, 7); 创建一个动态数组,给它分配了5个空间,并且初始化为7.
一般元素默认值为0. 即 vector <int> v(6); 等价于 vector <int> v(6, 0);
计算长度 v1.size();
变量名.size(); 可以计算出长度和大小。
之后会遇到很多这样的形式,一般都是 : 变量名.方式()
eg: v1.resize(length); 重新分配数组大小; length是你想要分配的空间大小
v1.push_back(); 末尾添加新的数据;
末尾添加新的数值 v1.push_back();
只需要在括号中写入想要添加的数组就行,会自动添加到末尾。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v1;
cout << v1.size() << endl; //这里输出的长度为0
v1.resize(10); //给它分配了10个空间
cout << v1.size() << endl; //这里输出的长度为10
//初始化,赋值
for (int i = 0; i < 10; i++)
v1[i] = i;
//进行输出
for (int i = 0; i < 10; i++)
cout << v1[i] << " ";
vector <int> v2(5);
v2.push_back(20); //添加数字20到v2的末尾
vector <int> v3(5, 7);
return 0;
}
迭代器
和遍历很相似就是把在这个容器里的所有元素遍历一遍
这个方便在于可以不用像for循环中,要知道循环的次数,去设置相应的条件,不用去找边界
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v(10); //给数组分配10个空间,每个初始化为0
v.push_back(30);
//迭代器,进行遍历
for (auto p = v.begin(); p != v.end(); p++)
cout << *p << " "; //这里p可以看作一个指针
v.push_back(20);
for (int i = 0; i < 12; i++) //使用for循环要改变一个值
{
cout << v[i] << " ";
}
system("pause");
return 0;
}
二.set
set是集合,里面的元素各不相同,就是不能用重复的元素,并且会按从小到大排好序
头文件
#include <set>, 必须有名称空间和头文件
#include <iostream>
#include <set>
using namespace std;
创建
set <int> s; 后面不能带任何参数
插入元素 s.insert(data);
#include <iostream>
#include <set>
using namespace std;
int main()
{
//集合set ,它里面的元素各不相同,并且输出的时候是排好顺序的(从小到大的顺序)
set <int> s;
s.insert(1);
s.insert(2);
s.insert(3);
//迭代器
for (auto p = s.begin(); p != s.end(); p++)
{
cout << *p << " ";
}
cout << endl;
return 0;
}
查找 s.find(data)
比较的是指针,看是否等于s.end() 找到输出1,没找到输出0;
#include <iostream>
#include <set>
using namespace std;
int main()
{
//集合set ,它里面的元素各不相同,并且输出的时候是排好顺序的(从小到大的顺序)
set <int> s;
s.insert(1);
s.insert(2);
s.insert(3);
cout << (s.find(2) != s.end()) << endl; //输出的是一个bool值1 只有0或1
cout << (s.find(4) != s.end()) << endl; //输出的是一个bool值0 只有0或1
s.erase(1);
cout << (s.find(1) != s.end()) << endl; //输出的是一个bool值 只有0或1
system("pause");
return 0;
}
删除 s.erase(data);
erase是橡皮擦的意思,可以理解擦去。
#include <iostream>
#include <set>
using namespace std;
int main()
{
//集合set ,它里面的元素各不相同,并且输出的时候是排好顺序的(从小到大的顺序)
set <int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.erase(1);
cout << (s.find(1) != s.end()) << endl; //输出0,没找到
system("pause");
return 0;
}
三.map(键值对)
map是键值对,它会将所有键值对,按照键从小到大排序。
头文件
#include <map>, 必须有名称空间和头文件
#include <iostream>
#include <map>
using namespace std;
创建
map <string, int> m;
在知道他的具体元素时输出,先输出键,后输出值
不知道具体元素可以用迭代器来进行输出(类似结构体指针)
获取长度用 m.size()
#include <iostream>
#include <map>
using namespace std;
int main()
{
//map键值对,它会自动将所有键值对按从小到大的顺序排好序
map <string, int> m;
m["hello"] = 2;
m["world"] = 3;
cout << "hello : " << m["hello"] << endl; //知道具体元素
//迭代器输出
for (auto p = m.begin(); p != m.end(); p++)
cout << p->first << " : " << p->second << endl;
cout << m.size() << endl;
return 0;
}
键的排序
键排序是通过Ascii码来进行排序的,从第一个字母开始一次进行比较;与后面的值无关。
四.stack(栈)
数据先进后出,栈只能获取栈顶元素,操作也只能操作栈顶元素,所以不能使用迭代器获取所有元素
头文件
#include <stack>, 必须有名称空间和头文件
#include <iostream>
#include <stack>
using namespace std;
创建栈
stack <int> s; stack <栈的元素类型> 栈的变量名;
压栈s.push(i);
将元素添加到栈中
访问栈顶元素 s.top()
访问最后一个入栈的元素
出栈 s.pop();
出栈都是将栈顶元素移除,栈顶元素改变
栈的长度 s.size()
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack <int> s;
s.push(1);
s.push(2);
s.push(3);
s.pop();
cout << s.top() << endl;
cout << "栈的长度 : " << s.size() << endl;
return 0;
}
五.queue队列
先进先出,后进后出,可以访问队尾和队首
头文件
#include <queue>, 必须有名称空间和头文件
#include <iostream>
#include <queue>
using namespace std;
创建队列
queue <int> s; queue <队列的元素类型> 队列的变量名;
入队 s.push(i);
将元素添加到队列中
访问队首 s.front()
访问队列第一个元素
访问队尾 s.back()
访问队列最后一个元素
出队 s.pop()
将队首的元素移除队列
获取长度 s.size()
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue <int> s;
for (int i = 0; i < 10; i++)
s.push(i);
cout << "队首为: " << s.front() << " 队尾为: " << s.back() << endl;
s.pop();
cout << "队首为: " << s.front() << " 队尾为: " << s.back() << endl;
cout << s.size() << endl;
return 0;
}
六.unordered_set和unoredered_map
这两个可以使set和map不用排序,省去排序的时间
头文件
#include <unordered_map>
#include <unordered_set>
必须有名称空间和头文件
#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;
演示代码
#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;
int main()
{
unordered_map <string, int> m;
unordered_set <int> s;
s.insert(5);
s.insert(2);
s.insert(4);
m["hello"] = 2;
m["ha"] = 8;
m["world"] = 5;
m["he"] = 4;
for (auto p = s.begin(); p != s.end(); p++)
cout << *p << endl;
for (auto p = m.begin(); p != m.end(); p++)
cout << p->first << " : " << p->second << endl;
return 0;
}
菜鸟学习,若有错误,希望大佬指正!