头文件<functional><algorithm>
近容器:
char buffer[1024]; string str; bitset位容器<-->vector<bool>
顺序容器: resize()
vector(内存可自增长的数组) reserve(100)预留空间 push_back(val) insert(iterator, val) erase(val) clear() size() empty() erase(it1, it2)//删除it1到it2的值
deque(双端队列) 动态开辟的二维数组 push_back push_front pop_back pop_front insert(iterator, val)
list(双向链表) push_back push_front pop_back pop_front insert(iterator, val) splice元素分割,直接将一个链连到另一条链上
迭代器
反向迭代器通过迭代器来实现
容器适配器:底层没有数据结构,用的是标准容器,只是把容器方法封装一下
1.stack底层实现deque,成员方法push,pop,top等
2.queue底层实现deque,成员方法push,pop,front等
3.priority_queue底层实现vector,成员方法push(先c.push_back(),后push_heap(c.begin(),c.end(),小根/大根)),pop(先pop_heap后pop_back),top(调的是vector的front)等
优先级队列,默认less,底层调用了make_heap形成大根堆;greater<int>数越小优先级越高,处于对头
算法(以vector为例)
find(vec.begin(), vec.end(), val)查找某个值()
find_if(vec.begin(), vec.end(), bind1st(greater<int>(), 50))查找第一个比50小的值,bind1st:绑定第一个值,采用greater函数对象
find_if(vec.begin(), vec.end(), not1(bind2nd(greater<int>(), 50))和上面结果相同
not1:给一元函数对象取反 not2:给二元函数对象取反
copy(vec.begin(), vec.end(), back_inserter(vec2))//后插入型迭代器,调用push_back//不能为front_inserter,因为vector没有push_front
copy(vec.begin(), vec.end(), inserter(vec2,vec2.begin()))//调用insert(iterator,val)
不能使用copy(vec.begin(), vec.end(), vec2.begin())因为vec2没有内存
//输出
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "))
copy(istream_iterator<int>(cin),(istream_iterator<int>(), back_inserter(vec))
sort(vec.begin(), vec.end())//从小到大
sort(vec.begin(), vec.end(), greater<int>())//从大到小
堆
make_heap(vec.begin(),vec.end(),greater<int>())//创建小根堆
push_heap(vec.begin(),vec.end(),greater<int>())//push_back后,重新调整堆
pop_heap(vec.begin(),vec.end(),greater<int>())//顶端元素换到最后,重新调整堆,之后pop_back删除最后一个元素
map/multimap(映射表) Key_Value键值对 multimap允许key相同
map简直不允许重复,底层红黑树
map<int,string> mymap;定义对象
mymap.insert(make_pair(10,"hello")) || mymap[20] = "hahaha"插入数据pair是一个类,makepair是对应的函数模板,推演实参
mymap<int,string>::iterator it = mymap.begin()/.find(key);
key:it->first,val:it->second//map对应的两个值
mymap.erase(iterator)/mymap.erase(it1,it2)/mymap.erase(key)删除值
multimap<int,string,greater<int>> mymultimap//改变排序方式
set/multiset(集合key)底层红黑树(二叉排序树),默认从小到大,less
set<int> set1;//定义对象
set1.insert(val);//插入数据
multiset<int,greater<int>> myset;//改变排序方式
myset.count(20)//求20的个数
myset.find(20)//只能找到第一个值,相同的后面的值找不到
myset.erase(20)//所有20均被删
Hash
Hash是一种映射查找算法,例如判断str1中出现在str2中字符的个数
算法性能提升
用位运算来实现上面的 除法和取模运算,*str1 / 8 等价于 *str1 >> 3,另外,一个数N除以 2^m 的余数 实际上是N的低 m bit位所表示的十进制数,即*str1%(2^3)等价于 *str1 & 7
专门有一个类为Hash,里有求哈希值方法,根据Key求得哈希值index,然后在_hashmap[index]里找是否存在key,若存在则覆盖value,若不存在则插入node(key,value)
vector<list<node>> _hashmap;