acm_stl

来源:互联网 发布:兵不可偃乎 编辑:程序博客网 时间:2024/05/18 00:47

//转自各个博客
1.队列先进先去

#include<queue>using namespace std;queue<int>qu;//进取删qu.push();qu.front();qu.pop();

2.栈后进先出

#include<stack>using namespace std;stack<int>st;//进取删st.push();st.top();st.pop();

3.vector 动态数组,

/*(1)头文件#include<vector>.(2)创建vector对象,vector<int> vec;(3)尾部插入数字:vec.push_back(a);(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。(5)使用迭代器访问元素.*/vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++)    cout<<*it<<endl;/*(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始(8)向量大小:vec.size();(9)清空:vec.clear();vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码: 3  算法(1) 使用reverse将元素翻转:需要头文件#include<algorithm>reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)(2)使用sort排序:需要头文件#include<algorithm>,sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).可以通过重写排序比较函数按照降序比较,如下:定义排序比较函数:bool Comp(const int &a,const int &b){    return a>b;}调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。(3)去重STL中Unique函数的作用是去除相邻重复元素#include<cstdio>#include<vector>#include<algorithm>using namespace stdint main(){int a[10] = {7,4,1,7,4,1,7,4,1,0};sort(a,a+10);//小到大vector<int>ver(a,a+10);vector<int>::iterator iter = unique(ver.begin(),ver.end());ver.erase(iter,ver.end());for( int *t = ver.begin() ; t != ver.end() ; t ++ )printf("%d ",*t);return 0;}*/

4 string

a)      string s;    //生成一个空字符串sb)      string s(str) //拷贝构造函数 生成str的复制品c)      string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值d)      string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e)      string s(cstr) //将C字符串作为s的初值f)      string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。g)      string s(num,c) //生成一个字符串,包含num个c字符h)      string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值i)      s.~string() //销毁所有字符,释放内存—————————————————————————————————————————————————————————————a) =,assign()     //赋以新值b) swap()     //交换两个字符串的内容c) +=,append(),push_back() //在尾部添加字符d) insert() //插入字符e) erase() //删除字符f) clear() //删除全部字符g) replace() //替换字符h) + //串联字符串i) ==,!=,<,<=,>,>=,compare()    //比较字符串j) size(),length()    //返回字符数量k) max_size() //返回字符的可能最大个数l) empty()    //判断字符串是否为空m) capacity() //返回重新分配之前的字符容量n) reserve() //保留一定量内存以容纳一定数量的字符o) [ ], at() //存取单一字符p) >>,getline() //从stream读取某值q) <<    //将谋值写入streamr) copy() //将某值赋值为一个C_strings) c_str() //将内容以C_string返回t) data() //将内容以字符数组形式返回u) substr() //返回某个子字符串v)查找函数w)begin() end() //提供类似STL的迭代器支持x) rbegin() rend() //逆向迭代器y) get_allocator() //返回配置器s+=str;//加个字符串s+=”my name is jiayp”;//加个C字符串s+='a';//加个字符s.append(str);s.append(str,1,3);//不解释了 同前面的函数参数assign的解释s.append(str,2,string::npos)//不解释了s.append(“my name is jiayp”);s.append(“nico”,5);s.append(5,'x');s.push_back(‘a');//这个函数只能增加单个字符对STL熟悉的理解起来很简单

5 pair 多与map等一起用

#include<utility>using namespace std; pair<int, double> p1;  //使用默认构造函数 pair<int, double> p2(1, 2.4);  //用给定值初始化 pair<int, double> p3(p2);  //拷贝构造函数 pair<int, double> p1;  //使用默认构造函数 p1.first = 1; p1.second = 2.5; cout << p1.first << ' ' << p1.second << endl; pair<int, double> p1; p1 = make_pair(1, 1.2); pair<int, double> p1(1, 1.2); pair<int, double> p2 = p1;

6.map 红黑树哈希

   Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本的构造函数;   map<string , int >mapstring;         map<int ,string >mapint;   map<sring, char>mapstring;         map< char ,string>mapchar;   map<char ,int>mapchar;            map<int ,char >mapint;2. map添加数据;   map<int ,string> maplive;     1.maplive.insert(pair<int,string>(102,"aclive"));   2.maplive.insert(map<int,string>::value_type(321,"hai"));   3, maplive[112]="April";//map中最简单最常用的插入添加!3map中元素的查找:   find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。           map<int ,string >::iterator l_it;;    l_it=maplive.find(112);   if(l_it==maplive.end())                cout<<"we do not find 112"<<endl;   else cout<<"wo find 112"<<endl;4,map中元素的删除:   如果删除112map<int ,string >::iterator l_it;;   l_it=maplive.find(112);   if(l_it==maplive.end())        cout<<"we do not find 112"<<endl;   else  maplive.erase(l_it);  //delete 112;5,map中 swap的用法:  Map中的swap不是一个容器中的元素交换,而是两个容器交换;  For example:  #include <map>  #include <iostream>  using namespace std;  int main( )  {      map <int, int> m1, m2, m3;      map <int, int>::iterator m1_Iter;      m1.insert ( pair <int, int>  ( 1, 10 ) );      m1.insert ( pair <int, int>  ( 2, 20 ) );      m1.insert ( pair <int, int>  ( 3, 30 ) );      m2.insert ( pair <int, int>  ( 10, 100 ) );      m2.insert ( pair <int, int>  ( 20, 200 ) );      m3.insert ( pair <int, int>  ( 30, 300 ) );   cout << "The original map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter->second;      cout   << "." << endl;   // This is the member function version of swap   //m2 is said to be the argument map; m1 the target map   m1.swap( m2 );   cout << "After swapping with m2, map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout  << "." << endl;   cout << "After swapping with m2, map m2 is:";   for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout  << "." << endl;   // This is the specialized template version of swap   swap( m1, m3 );   cout << "After swapping with m3, map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout   << "." << endl;}6.map的sort问题:  Map中的元素是自动按key升序排序,所以不能对map用sort函数:  For example:  #include <map>  #include <iostream>  using namespace std; int main( ) {   map <int, int> m1;   map <int, int>::iterator m1_Iter;   m1.insert ( pair <int, int>  ( 1, 20 ) );   m1.insert ( pair <int, int>  ( 4, 40 ) );   m1.insert ( pair <int, int>  ( 3, 60 ) );   m1.insert ( pair <int, int>  ( 2, 50 ) );   m1.insert ( pair <int, int>  ( 6, 40 ) );   m1.insert ( pair <int, int>  ( 7, 30 ) );   cout << "The original map m1 is:"<<endl;   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;}  The original map m1 is:  1 20  2 50  3 60  4 40  6 40  7 30  请按任意键继续. . .7map的基本操作函数:      C++ Maps是一种关联式容器,包含“关键字/值”对      begin()          返回指向map头部的迭代器      clear()         删除所有元素      count()          返回指定元素出现的次数      empty()          如果map为空则返回true      end()            返回指向map末尾的迭代器      equal_range()    返回特殊条目的迭代器对      erase()          删除一个元素      find()           查找一个元素      get_allocator()  返回map的配置器      insert()         插入元素      key_comp()       返回比较元素key的函数      lower_bound()    返回键值>=给定元素的第一个位置      max_size()       返回可以容纳的最大元素个数      rbegin()         返回一个指向map尾部的逆向迭代器      rend()           返回一个指向map头部的逆向迭代器      size()           返回map中元素的个数      swap()            交换两个map      upper_bound()     返回键值>给定元素的第一个位置      value_comp()      返回比较元素value的函数

7 set红黑树 每个相同个体只能存一个

begin()      ,返回set容器的第一个元素end()      ,返回set容器的最后一个元素clear()     ,删除set容器中的所有的元素empty()    ,判断set容器是否为空max_size()  ,返回set容器可能包含的元素最大个数size()     ,返回当前set容器中的元素个数rbegin    ,返回的值和end()相同rend()    ,返回的值和rbegin()相同equal_range() ,返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。具体这个有什么用途我还没遇到过~~~#include <iostream>#include <set>using namespace std;int main(){    set<int> s;    set<int>::iterator iter;    for(int i = 1 ; i <= 5; ++i)    {        s.insert(i);    }    for(iter = s.begin() ; iter != s.end() ; ++iter)    {        cout<<*iter<<" ";    }    cout<<endl;    pair<set<int>::const_iterator,set<int>::const_iterator> pr;    pr = s.equal_range(3);    cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl;    cout<<"第一个大于 3的数是 : "<<*pr.second<<endl;    return 0;}erase(iterator)  ,删除定位器iterator指向的值erase(first,second),删除定位器first和second之间的值erase(key_value),删除键值key_value的值find()  ,返回给定值值得定位器,如果没找到则返回end()。insert(key_value); 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.lower_bound(key_value) ,返回第一个大于等于key_value的定位器upper_bound(key_value),返回最后一个大于等于key_value的定位器

8 multiset 每个相同个体能存多个

set类似多了一个统计数量的函数 count(i);

9 Heap 堆

建立堆make_heap(_First, _Last, _Comp)默认是建立最大堆的。对int类型,可以在第三个参数传入greater<int>()得到最小堆。在堆中添加数据push_heap (_First, _Last)要先在容器中加入数据,再调用push_heap ()在堆中删除数据pop_heap(_First, _Last)要先调用pop_heap()再在容器中删除数据堆排序sort_heap(_First, _Last)排序之后就不再是一个合法的heap
0 0