c++STL容器

it2022-05-08  6

1.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);//指定范围元素插入指定位>置

/* * 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; }

2. set

/* 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; } } }

3.list

/* 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; }

4.map

/* 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; } }

5.deque

/* 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; }

6.priority_queue

堆,默认的是大顶堆,大的在头部,先出来,大顶堆可以用于维护最小的几个元素。

#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; }

 


最新回复(0)