成员函数 * push_back(), pop_back() * reserve(int n),resize() * size(), capacity(), empty(), clear(), * at(int i)选定特定位置元素的引用, front(), back() * begin(), end(),rbegin(), rend() * assign() * assign(iterator first, iterator last);//重新赋值,和初始化用法一样 * insert(), clear(), erase() * iterator erase(iterator it); * iterator erase(iterator first, iterator second); * iterator insert(itearator it, const T& x = T());//插入一个元素到指定位置 * void insert(iterator it, size_t n, const T& x);//n个相同元素插入指定位置 * void insert(iterator it, const_iterator first, const_iterator last);//指定范围元素插入指定位>置
/* * vector 模板使用 * 成员函数 * push_back(), pop_back() * reserve(int n),resize() * size(), capacity(), empty(), clear(), * at(int i)选定特定位置元素的引用, front(), back() * begin(), end(),rbegin(), rend() * assign() * assign(iterator first, iterator last);//重新赋值,和初始化用法一样 * insert(), clear(), erase() * iterator erase(iterator it); * iterator erase(iterator first, iterator second); * iterator insert(itearator it, const T& x = T());//插入一个元素到指定位置 * void insert(iterator it, size_t n, const T& x);//n个相同元素插入指定位置 * void insert(iterator it, const_iterator first, const_iterator last);//指定范围元素插入指定位置 */ #include <iostream> #include <vector> using namespace std; int main() { vector <int> a; a.reserve(4); cout << "capacity is " << a.capacity() <<endl; a = {1, 2, 5, 0, -2};//赋值,5个元素,会自动扩充 cout << "capacity is " << a.capacity() << endl; //按照迭代器输出 for (vector<int>::iterator it = a.begin(); it != a.end(); it++) { cout << *it << " "; } cout << endl; cout << "front is " << a.front() << " back is " << a.back()<<" 下标2的元素"<<a.at(2) <<endl; a.pop_back(); a.push_back(19); for (int i=0; i<a.size(); ++i) cout<<a[i]<<" "; cout << endl; }/* set和multiset, 无法调用修改泛型算法 * 初始化时自定义排序规则 * set<int, greater<int>> nums; //优先使用这种,包括自己的仿函数 * set<int> nums(greater<int>()); * 成员函数 * size(), empty(), max_size(), count(), begin(), end(),rbegin(), rend() * find(), low_bound(), upper_bound(), equal_range() * iterator find (const T& key) const; * iterator low_bound(const T& n);//大于等于n的第一个元素位置,下届 * pair<iterator, iterator> equal_range(const T& n) const;//第一个迭代器元素 >= n, 第二个 > n * insert(), erase(), clear() * pair<iterator, bool> insert(const T& x);//插入元素 * iterator insert(iterator it, const T& x); * void insert(const T* first, const T* last);//一般用迭代器插入一段数据 * * iterator erase(iterator it);//返回下一个元素位置 * iterator erase(iterator first, iterator last);//左闭右开 * size_t erase(const T& x); * key_comp(), value_comp()//用于确定set的排序形式 * key_compare key_comp() const;//按照key比较,由于set只有key,所以只需要这个 * value_compare value_comp() const;
#include <iostream> #include <set> #include <vector> #include <algorithm> #include <cmath> //use abs() using namespace std; #define display for_each(nums.begin(), nums.end(), print);cout<<endl void print(int item) { cout<<item<<" "; } //仿函数,按照绝对值大小排序 template <class T> struct abs_compare { bool operator() (T n1, T n2) //这里不能用& { return (abs(n1) < abs(n2) );//从小到大 } }; int main() { vector<int> tmp={1,0,-2,5,7,9,-4,5,5,6}; set<int, greater<int>> nums(tmp.begin(),tmp.end());//初始化,默认从小到大,greater从大到小 set<int, greater<int>>::iterator it = nums.begin(); cout << "max_size is "<<nums.max_size()<<endl; cout<<"nums按照迭代器顺序输出: "<<endl; for_each(nums.begin(), nums.end(), print); cout<<endl; { cout<<"按照绝对值排序:"<<endl; vector<int> tmp = {1,-1,0,0,2,-3,4,-5}; set<int,abs_compare<int>> nums(tmp.begin(),tmp.end());//-1和1视为相等元素 nums.insert(10); display; } cout<<"insert 用法:" << endl; for_each(nums.begin(), nums.end(), print); cout<<endl; tmp={100,101,102,101}; nums.insert(tmp.begin(), tmp.end()); display; cout << "erase 用法: "<<endl; display; cout<<"it位置元素:" <<*it<<endl; it = nums.erase(nums.begin(), it); display; cout<< "it位置元素: "<<*it<<endl; cout<<"key_comp 用法:"<<endl; set<int, greater<int>>::value_compare kc = nums.value_comp();//这里原本用key if(kc(0,1)) cout<< "从小到大排序"<<endl; else cout<< "从大到小排序" <<endl; { cout<<"set的循环删除:"<<endl; vector<int> a={1,2,3,4,5,6,7,8,9,0}; set<int> nums(a.begin(), a.end()); display; for(set<int>::iterator it = nums.begin(); it!=nums.end(); ) { if(*it%2 ==0) { nums.erase(it++); } else it++; display; } } }/* list 模板类 * 成员函数 * push_front(T& x), pop_front() * push_back(T& x), pop_back() * clear(), erase(), insert() * iterator erase(iterator it); * iterator erase(iterator first, iterator second); * * iterator insert(itearator it, const T& x = T());//插入一个元素到指定位置 * void insert(iterator it, size_t n, const T& x);//n个相同元素插入指定位置 * void insert(iterator it, const_iterator first, const_iterator last);//指定范围元素插入指定位置 * resize(size_t n), size(), max_size() * begin(), end(), rbegin(), rend(), front(), back() * empty() * assign() * void assign(const_iterator first, const_iterator last); * void assign(size_t n) * merge(), sort(), remove(), remove_if(), splice() * void merge(list& x);//x中元素合并到调用者,并且会自动排序 * void merge(list& x, greater<T> pr); * sort(); * sort(greater<T> pr);//从大到小排序 */
#include <iostream> #include <list> using namespace std; int main() { list<double> nums(5, 0.2); list<double>::iterator it; nums.pop_front(); nums.push_front(0.1); nums.push_back(0.5); for (it = nums.begin(); it != nums.end(); ++it) cout << *it <<" "; cout << endl; nums.assign(3,0.3); it = nums.begin(); cout << "插入2个4" <<endl; nums.insert(++it, 2, 4); for (it = nums.begin(); it != nums.end(); ++it) cout << *it <<" "; cout << endl; cout << "max_size is " << nums.max_size()<< endl; }/* map和multimap使用 * 初始化 * map<K, V> * map<K, V, greater<K> > //也可以自定义排序规则 * 成员函数 * size(), max_size(), empty(), * begin(), end(), rbegin(), rend() * insert(), erase(), clear() * swap() * void swap(map& x);//demo: m1.swap(m2);//这种只有m1的内容变了,不是真正的交换 * count(), find(), * upper_bound(), lower_bound(), equal_range() * pair<iterator, iterator> equal_range(const K& key); //第一个迭代器是lower_bound的返回值,第二个是upper_bound的返回值 * key_comp(), value_comp() * key_compare key_comp() const; * get_allocate()
#include <iostream> #include <map> #include <algorithm> using namespace std; template <class T> void print(T x) { cout<< x.first <<" "<< x.second << endl; } int main() { cout<< "map的使用:"<<endl; map<int, string, greater<int> > myMap;//declartion myMap[5] = "abc";//insert, as array myMap[5] = "bcd";//会覆盖 myMap[2] = "ye"; myMap[10] = "he"; myMap.insert(pair<int,string>(1,"def"));//多用这种 myMap.insert(map<int, string>::value_type(3, "efg"));//第三种 myMap.insert(pair<int, string>(1, "hij"));//有1了,所以不会做任何操作 map<int, string>::iterator it = myMap.begin(); cout<<"按照迭代器顺序输出"<<myMap.size()<<"个元素"<<endl; for_each(myMap.begin(), myMap.end(), print<pair<int, string> >);//批量操作 it = myMap.find(5); if(it != myMap.end()) { cout<<"key 5 的value是"<<it->second<<", 删除"<<endl; } myMap.erase(it); it = myMap.find(5); if (it == myMap.end()) cout<<"未找到key 5"<<endl; for_each(myMap.begin(), myMap.end(), print<pair<int, string> >);cout<<endl; for (map<int, string>::iterator it=myMap.begin(); it!=myMap.end(); ) { if((it->second).size()<3) { myMap.erase(it++); } else it++; for_each(myMap.begin(), myMap.end(),print<pair<int,string> >); cout<<endl; } }/* deque双端队列 * 特点:随机访问,在两端快速删除和插入,和vector几乎一样的接口 * deque比vector多了push_front(), pop_front(),可以在头部操作 * 构造函数(初始化) * deque<typename T> name; * deque<typename T> name(size); * deque<typename T> name(size, value); * deque<typename T> name(elsedeque); * deque<typename T> name(elsedeque.begin(),elsedeque.end());//使用其它deque初始化 * 成员函数 * resize(), max_size(), size() * void resize(size_type n, x);//把deque的大小调整为n, 并把元素初始化为x * 插入和删除: * push_front(), pop_front(), push_back(), pop_back(), insert(), erase(), clear() * void insert(iterator it, T& x);//在it迭代器位置插入x * void insert(iterator it, size_t n, T& x);//插入多个相同元素 * void insert(iterator it, iterator first, iterator last);//插入一段区间的元素 * void erase(iterator it);//删除 * void erase(iterator first, iterator last);//删除指定区间 * 迭代器相关: * begin(), end(), rbegin(), rend(), back(), front() * empty() * 元素访问:[], at(), back(), front() * 元素重置:assign() * void assign(iterator first, iterator last); * void assign(size_type n, x); * 交换元素:swap(),
#include <iostream> #include <deque> using namespace std; int main() { deque<int> nums(5, 0); nums.push_front(1); nums.push_back(2); for (int i = 0; i < nums.size(); ++i) { cout << nums[i] << " "; } cout << endl; cout << "max_size()" << nums.max_size() << endl; }堆,默认的是大顶堆,大的在头部,先出来,大顶堆可以用于维护最小的几个元素。
#include<iostream> #include<queue> #include<algorithm> #include<vector> #include<iterator> using namespace std; int main() { { vector<int> a={1,3,2,4,6,5,8,7,0,9}; priority_queue<int> nums;//从大到小输出 priority_queue<int,vector<int>, greater<int> > nums1; for(int i=0;i<a.size();++i) { nums.push(a[i]); nums1.push(a[i]); } while(nums.size()>0) { int a = nums.top(); cout<<a<<" "; nums.pop(); } cout<<endl; while(nums1.size()>0) { int a = nums1.top(); cout<<a<<" "; nums1.pop(); } cout<<endl; } return 0; }