- vector
set转化为vector:vec.assign(set.begin(), set.end())
- map
1. map默认从小到达排序,想要从大到小,可以:
map<string, int, greater<string>>
2. map 不可以使用sort排序!不过可以使用在定义map的时候,传入函数指针自定义map排序
- list
比如在第五个位置插入3个88的 错误方法:
auto ite = data.begin();
data.insert(iter + 5, 3, 88);
ite不可以直接+5,不支持这个操作,实际上ite一般支持++,比如++ite比ite++更简单?
正确方法:
auto iter = begin(data);
std::advance(iter, 5);
data.insert(iter, 3, 88);
但是vector的insert就可以直接vec.insert(vec.begin() + 5, 88);
- set
set没有push()和push_back()操作,取代的是:insert() 或 emplace()!
- stack
top(), size(), empty()
push() / emplace(),pop()
swap()
- priority_queue
优先队列,priority_queue<class Type,class Container,class Compare>,即类型,容器和比较器(比较器类型),
默认容器为vector,可以自定义容器类型,并自定义排序函数,我们并不关心优先队列是不是vector实现的!
但是要是出现了自定义类型,一般想要自定义函数,这个时候中间的容器就不可以省略了 —— 建议容器写在最后,根据自定义类型推测默认vector<T>容器!
自定义比较有三种方法:
// 在结构体/类内重载<struct Status{
int val;
ListNode* node;
bool operator < (const Status &tmp) const{
// 函数必须是静态的 使得该函数可以被 const 对象也就是常量所调用
// 形参可以加上const关键字和&,保证安全性,提高效率
return val > tmp.val;
}
};
priority_queue<Status> pq;
// 自定义比较函数模板结构体,或者说重载的是()!!! struct cmp{ bool operator ()(const node &a, const node &b) { return a.value>b.value;// 按照value从小到大排列 } }; priority_queue<node, vector<node>, cmp>q;
第三种方法:友元函数,略
没有见到使lambda表达式实现的,因为它的参数不是一个函数,而是一个结构体,或者不理会参数重载更简单。