算法基础课
第二章数据结构撒花
总结一些C++的stl用法,方便自己查阅;
1.vector
#include <vector>
using namespace std;
int main
{
vector <int> a;//初始化一个大小为0的vector
vector <int> a(n);//初始化一个大小为n的vector
vector <int> a(n,b);//初始化一个大小为n,元素全为b的vector
a.size();//返回vector的元素个数(unsigned int)
a.clear();//清空vector
a.front()/a.back();//返回vector的首元素和尾元素(int)
a.push_back(x)/a.pop.back();//尾部插入新元素x/删掉尾元素
a.begin()/a.end();迭代器
/*迭代器使用
for(vector<int>::iterator i=a.begin();i!=a.end();i++)//从首遍历到尾部(不是连续地址,但是支持++和--)
for(auto x:a);//范围迭代(优点:效率更高)
*/
vector<int> b;
if(a>b)//支持比较运算:按照字典序比较
}
2.pair 对(一种数据类型,和int差不多)
#include <vector>
typedef pair<int,int> PII;
PII a;
int main()
{
a.first/a.second;//a的第一个/第二个元素
P=make_pair(10,“abc”);
P={10,"abc"};//对P赋值
//P.first=10(int)
//P.second="abc"(char[]/string)
}
3.string(用来代替char数组的利器)
#include <string>
#include <iostream>
int main()
{
string a;
cin>>a;
cout<<a;//可以用流输入输出(缺点:效率低)
a.size()/a.length();//返回a的大小(unsigned int)
a.empty();//判断a是否为空(bool)
a.clear();//清空a
a+=“abc”//在a的后面接上“abc”(支持加减操作)
printf("%s\n",a.c_str());//可以用printf进行输出(效率比流输出高)
}
4.queue(队列)
#include <iostream>
#include <queue>
int main()
{
queue<int> a;
a.push(x);//向队尾插入元素x
a.front();//返回队头元素(int)
a.back();//返回队尾元素(int)
a.pop();//弹出队头元素
a.queue<int>();//清空方法:重新构造
}
5.priority_queue(优先队列)堆
#include <queue>
#include <vector>
{
priority_queue<int> a;
a.push(x);//插入元素x
a.top();//返回堆顶元素(int)
a.pop();//弹出堆顶元素
//默认为大根堆
priority_queue<int,vector<int>,greater<int>> heap//转换为小根堆
}
6.stack(栈)先入后出
#include <stack>
int main()
{
stack<int> p;
p.push();//栈顶插入
p.top();//返回栈顶元素(int)
p.pop();//弹出栈顶元素
}
7.deque(双端队列)高级的vector(缺点:速度较慢)
#include <deque>
int main()
{
deque<int> a;
a.size();//返回a元素个数(int)
a.empty();//判断a是否为空(bool)
a.clear();//清空a
a.front()/a.back();//返回a的首元素/尾元素
a.push_back()/a.push_front();//首/尾插入
a.pop_back()/a.pop.back();//首/尾弹出
a.begin()/a.end()//支持迭代器
}
8.set(不能有重复元素)
multiset(支持重复元素)
#include <set>
int main()
{
set<int> a;
a.insert();//插入元素
a.size();
a.empty();
a.clear();
a.find();//找到某元素(如果没有则返回a.end())
a.count();//某元素的个数(在set中只有1/0;在multiset中有多种情况
a.erase()//输入一个数据,删除所有的该数据
//输入一个迭代器(相当于一个指针),删除迭代器所对应的片段
a.lower_bound()//返回大于等于x的最小数的迭代器
upper_bound()//返回大于x的最小数的迭代器
}
9.map(单映射)、multimap(多映射)
#include <map>
int main()
{
map<string,int> a;
a["abc"]=1;
//支持lower_bound()/upper_bound()
}
10.哈希表(速度快,但功能有限)基于满二叉树(红黑树)
unordered_set,unordered_map,unordered_muitiset,unordered_multimap
//支持增删改查,不支持迭代器,不能排序
11.bitset(能够节省bool数组的空间)
原理:将一个字符拆成八个字节,所以一个字节可以存8个bool值
#include<bitset>
int main()
{
bitset<100000> s;
~,&,^,<<,>>//支持位运算
s.count();
any/none();
s.set();//把所有位置改为1
s.set(k,v);//将第k位变成v
s.reset();//将所有位变成0
s.flip();//把所有位取反
s.flip(x);//把第x位取反
}
还有很多其他的库函数,记不下来,边用边查吧。
第一次总结,希望自己能够坚持下去。