acm_stl
2016-05-21 19:56
363 查看
//转自各个博客
1.队列先进先去
2.栈后进先出
3.vector 动态数组,
4 string
5 pair 多与map等一起用
6.map 红黑树哈希
7 set红黑树 每个相同个体只能存一个
8 multiset 每个相同个体能存多个
9 Heap 堆
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 std int 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; //生成一个空字符串s b) 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) << //将谋值写入stream r) copy() //将某值赋值为一个C_string s) 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中最简单最常用的插入添加! 3,map中元素的查找: 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中元素的删除: 如果删除112; map<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 请按任意键继续. . . 7, map的基本操作函数: 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了
相关文章推荐
- springMVC中pojo参数绑定
- WebSocket spring示例demo (已使用sockJs库)
- PHP Study- Issue 1 -Redirect Unable to load the module
- 常用的基本DOS命令
- 诚惶诚恐,开始翻译Effective DevOps
- ROHC协议库测试与改造(一)
- 中线,相线,地线
- Unity的图片压缩格式详解
- php中的错误处理机制
- codeforces_672A. Summer Camp(string)
- 隐藏Nginx软件名及版本号
- Geek-Band--性能优化案例
- docker 问题集锦
- Python函数式编程之闭包
- POJ 2392-Space Elevator(多重部分和-多重背包)
- 3G网络结构
- 顺序表应用3:元素位置互换之移位算法
- Eclipse中导入工程后,出现中文注释乱码解决方法
- php中的错误处理机制
- final 发布 领跑衫获奖感想