1.8 STL、位运算、常用库函数
1.vector
头文件#include <vector>
常见的方法有vector.clear() ; vector.size() ; vector.empty();
遍历输出vector:
#include <iostream> #include <vector> using namespace std; int main(){ vector<int> a({1,2,3,4}); for(int i = 0 ; i < a.size() ; i++) cout<<a[i]<<" "; cout<<endl; for(vector<int>::iterator i = a.begin() ; i!=a.end() ; i++) cout<<*i<<" "; cout<<endl; for(auto i = a.begin() ; i!= a.end() ; i++) cout<<*i<<" "; cout<<endl;
for(int x : a) cout<<x<<" ";
cout<<endl;
}
a.front()调用第一个元素,a.back()调用最后一个元素
vector<int> a({1,2,3,4});
cout<<a.front()<<" "<<a[0]<<endl;
cout<<a.back()<<" "<<a[a.size()-1] <<endl;
a.push_back()在vector后面添加一个元素,a.pop_back()删除最后一个元素
vector<int> a({1,2,3,4});
a.push_back(5);
for(auto i : a) cout<<i<<" ";
cout<<endl;
a.pop_back();
a.pop_back();
for(int x : a) cout<<x<<" ";
cout<<endl;
2.queue
结构体rec如果定义大根堆就要重载小于号,定义小根堆就要重载大于号。
普通队列:a.push() ; a.pop() ; a.front(); a.back() ;
队列没有clear函数,要想清空重新定义就行,a = queue<int>;,重新把他定义一遍。
大根堆:
3.stack栈,#include <stack>。
push 向栈顶插入
pop 弹出栈顶元素
4.双端队列deque; #include <deque>
双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要O(1)的时间;与queue相比,deque像数组一样支持随机访问。
a[0]是随机访问一个元素
5.set #include <set>
头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集合”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一棵红黑树,它们支持的函数基本相同
set定义结构体也要重新定义大于小于号
还有一个unordered_set, #include <unordered_set>
是无序的set , 所以除了upper_bound() 和 lower_bound() 之外,其他set的方法都有。
还有一个bitset;#include <bitset>
6.map #include <map>
map容器是一个键值对key-value的映射,其内部实现是一棵以key为关键码的红黑树。Map的key和value可以是任意类型,其中key必须定义小于号运算符。
size/empty/clear/begin/end均与set类似。
map中元素的类型可以自己定义,感觉是更好用的列表
map.insert() 和 map.find() 用法:
map还有一个unordered_map(), 所有操作都是O(1)的,但是C11才开始支持
#include <unordered_map>