STL
来源:互联网 发布:淘宝促销模板 编辑:程序博客网 时间:2024/06/09 13:44
vector
- TYPE &back() 返回对最后一个元素的引用
- TYPE &front() 返回对第一个元素的引用
- bool empty() 如果为空返回true, 否则返回false
size_type size() 返回list中元素的数量。
定义迭代器 vector ::iterator it;
- iterator begin() 返回指向第一个元素的迭代器
- iterator begin() 返回指向第一个元素的迭代器
//用迭代器遍历vectcorvector<int> v;vector<int>::iterator it;for(it=v.begin();it!=v.end();i++)cout<<*it<<endl;
初始化
- 实例化: vector<类型>VectorName
删除
- void pop_back(); 删除vector的最后一个元素。
- iterator erase(iterator loc);
- iterator erase(iterator start, iterator end); ·删除loc所指元素并返回下一元素迭代器
·删除[start, end)之间的元素,并返回最后一个被删除元素的下个元素的迭代器
删除特定元素
- vt.erase(remove(vt.begin(), vt.end(), Type &value), vt.end());
//删除某个特定元素 v.erase(remove(v.begin(),v.end(),1),v.end()); for(it=v.begin();it!=v.end();it++) cout<<*it<<endl;
插入
- void push_back( const TYPE &val ); 将val放置到vector的最后。
- iterator insert( iterator loc, const TYPE &val );插入一个值为value的元素在loc位置并返回其迭代器,原loc及以后的元素后移。
- void insert( iterator loc, size_type num, const TYPE &val);·插入num个值为value的元素在loc位置,原loc及以后元素后移。
- void insert( iterator loc, input_iterator start, input_iterator end ); 插入[start, end)之间的元素到loc位置,原loc及以后元素后移
去除重复元素
vt.erase(unique(vt.begin(), vt.end()), vt.end());
priority_queue
- 优先队列默认的出队方式是从小到大
- 优先队列不支持遍历
对于改变基本类型的出队方式(从大到小)
//实例化: priority_queue<类型[, 存储容器, 比较谓词]>PriorityQueueName;priority_queue<int,vector<int>,greater<int> > v;
对于结构题的优先队列应用
//对于结构体的一级比较
//对结构体重载运算符//比较符号与出队符号相反//出队顺序从小到大struct node{ int x,y; friend bool operator < (const node a,const node b)//注意这里的friend、const以及重载的'<'运算符不能省,不能改 return a.x>b.x; } //出队顺序从大到小struct node{ int x,y; friend bool operator < (const node a,const node b) return a.x<b.x; } struct node a[5]; priority_queue<node> s; s.push(a[i++]);
对结构体的二级比较
struct node{ int x, y; friend bool operator < (node a, node b)//friend不能少 { if(a.y==b.y) return a.x<b.x; return a.y<b.y; }}//先针对y从大到小出队,次序针对x从大到小出队
set/multiset
set
构造方式
set<int> s1;//从小到大排序set<int,greater<int> >s2//从大到小排序//数据元素是结构体按照priority_queue的方法做
遍历
//顺序遍历for(set<int>::iterator it=s.begin();it!=s.end();it++)//顺序输出 cout<<*it<<endl//逆序遍历for(set<int>::reverse_iterator it=s.rbegin();it!=s.rend();it++)//逆序输出 cout<<*it<<endl
插入
- iterator insert(TYPE &val );(上面的insert对multiset无返回值)
//insert 的返回类型是一个pair //s.insert().first是插入后该元素的迭代器,或者指向已经存在元素的迭代器; cout<<*s.insert(1).first<<endl;//因为1已经存在 故输出1 //s.insert().second返回bool代数,1为插入成功;0为插入失败 if(s.insert(1).second==0) cout<<"插入失败"<<endl;
删除
- void erase(iterator loc);删除loc所指元素
- size_type erase(const key_type &key);删除key值为value的元素并返回被删除元素的个数
强调一下set删除的陷阱
//删除会使原来的迭代器失效for(set<int>::iterator it=s.begin();it!=s.end();it++) { if(*it%3==0) s.erase(it++);//保留 else it++; }
查找
- iterator find(const key_type &key) 返回一个迭代器指向键值为key的元素,如果没找到就返回end();
set<int>::iterator it=s.find(1); if(it!=s.end()) cout<<*it<<endl; else cout<<"error";
- iterator lower_bound( const key_type &key ); 返回一个迭代器,指向键值 >= key的第一个元素。
- iterator upper_bound( const key_type &key ); 返回一个迭代器,指向键值 > key的第一个元素。
//不能这样写,set是关联容器非线性it=s.lower_bound(1); cout<<it-s.begin();
multi_set查找
- pair<iterator start, iterator end> equal_range(**const key**_type &key) 查找multiset中键值等于key的所有元素的范围,返回指示范围的两个迭代器以pair返回
- size_type count(const KeyType &key) 查找容器中值为key的元素的个数
string
支持【】运算
实例化:string StringName;
赋值运算
string s1,s2; cin>>s1; s2=s1;
末尾追加字符串
- string& append( const string& str ); 末尾追加一个string
string s1,s2; cin>>s1;//123 s2="456"; cout<<s1.append(s2)<<endl; //输出123456
- string& append( const char* str );可以添加字符数组
比较函数
- int compare(string a, string b) 比较两个字符串,a < b返回负数,a==b返回零,a>b返回正数, 可以使用字符数组。
判空
- bool empty() const; 返回true如果字符串长为0
长度
- size_type length() 返回string的长度(和size()一样)
查找字符串出现的位置
- size_type find( const string& str, size_type index );·返回从index开始str第一次出现的位置,找不到就返回string::npos(常量)
- size_type find( const char* str, size_type index );返回从index开始str第一次出现的位置,找不到就返回string::npos(常量)
插入
- iterator insert( iterator i, const char& ch ); 在迭代器i指向的位置插入一个字符ch
- string& insert( size_type index, const string& str );在位置index插入一个string
- string& insert( size_type index, const char* str ); 在位置index插入一个C字符串
删除
- iterator erase( iterator loc );
- iterator erase( iterator start, iterator end );
删除排序后的重复字符
str.erase(unique(str.begin(), str.end()), str.end());
常用算法
min_element/max_element最大最小值
- iterator min_element(iterator begin, iterator end);
- iterator min_element(iterator begin, iterator end, Cmpfunc func);
- iterator max_element(iterator begin, iterator end);
- iterator max_element(iterator begin, iterator end, Cmpfunc func);
返回区间[being, end)之间的最小/最大元素,可以提供比较函数/仿函数(二元),返回一个指向该元素的迭代器(对于数组则返回相应的指针)。
fill / fill_n将容器的值初始化为常量
对数组也适用
void fill(iterator first, iterator last, const T& value);将[first,
end)之间的元素赋值为valueiterator fill_n(iterator first, Size n, const T& value);将从first开始的n个元素赋值为value int a[10];
vector<int>s; vector<int>::iterator it; s.resize(5);//注意不能对没有元素的容器操作 fill_n(s.begin(),3,1); for(it=s.begin();it!=s.end();it++) cout<<*it<<' '; //输出结果1 1 1 0 0
unique去除重复元素
- iterator unique (iterator begin, iterator end[, Cmpfunc cmp])
按区间中原有元素的相对次序将多余的重复元素用其后的有效元素覆盖,返回新的结尾。
remove一样unique并不真的移除新的结尾和旧的结尾之间的元素,所以一般也需要结合erase使用。
如果区间是将(二元比较函数cmp)传给sort函数排序的,那么需要将(cmp函数)传给unique才可以得到想要的结果
//对于vector都适用,完全可以用vector代替数组 vector<int> s; for(int i=1;i<=5;i++) { int b; cin>>b; s.push_back(b); } cout<<"****"<<endl; s.erase(unique(s.begin(),s.end()),s.end()); for(vector<int>::iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
sort/stable_sort
- void sort(iterator begin, iterator end, [ Cmpfunc func])
- void stable_sort(iterator begin, iterator end, [, Cmpfunc func])
将[begin, end)之间的元素使用默认的(operator<)或给定的(二元比较函数func)进行排序,sort使用随机化快速排序,不稳定;stable_sort使用归并排序,稳定
bool comp( int a,int b){//参数与数据类型对照 return a>b;}sort(v.begin(),v.end(),comp); vector<int>::iterator it; for(it=v.begin();it!=v.end();it++) cout<<*it<<endl;
lower_bound/upper_bound二分查找看vector中的
- iterator lower_bound(iterator begin, iterator end, Const Type & value , [Cmpfunc func])
- iterator upper_bound(iterator begin, iterator end, Const Type& value[, Cmpfunc func])
函数在有序区间中查找,lower_bound返回指向区间中>=value的第一个元素的迭代器, upper_bound返回区间中>value的第一个元素的迭代器。如果有序区间排序时(比如sort)使用的是func函数进行比较,那么也需要该函数进行判断。
//如果二分查找之前对vector使用了sort(begin,end,comp)函数,则在调用二分查找时,参数必须加上相应的comp函数,否则出现错误数据 sort(v.begin(),v.end(),comp); it=lower_bound(v.begin(),v.end(),3,comp);//区间中没有指定元素,lower_bound和upper_bound的返回值是一样的 if(lower_bound(v.begin(),v.end(),0,comp)==upper_bound(v.begin(),v.end(),0,comp)) cout<<"not found"<<endl;
阅读全文
0 0