STL的学习(C++primer)
来源:互联网 发布:羊驼毛被 知乎 编辑:程序博客网 时间:2024/05/16 14:42
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。
序列式容器
向量(vector) 连续存储的元素<vector>
列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list>
双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque>
容器适配器
栈(stack) 后进先出的值的排列 <stack>
队列(queue) 先进先出的值的排列 <queue>
优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>
关联式容器
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>
多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>
映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>
多重映射(multimap) 允许键对有相等的次序的映射 <map>(百科)
简单的vector类的使用
#include<iostream>#include<string>#include<vector>using namespace std;const int NUM = 5;int main(){ vector<int> ratings(NUM); vector<string> titles(NUM); cout<<"You will do exactly as told. You will enter\n" <<NUM<<" book titles and your ratings (0-10).\n"; int i; for(i=0;i<NUM;i++) { cout<<"Enter title #"<<i+1<<": "; getline(cin,titles[i]); cout<<"Enter your rating (0-10): "; cin>>ratings[i]; cin.get(); } cout<<"Thank you.You entered te following:\n" <<"Ratings\tBook\n"; for(i=0;i<NUM;i++) cout<<ratings[i]<<"\t"<<titles[i]<<endl; return 0;}
对STL容器的基本操作
empty()堆栈为空则返回真pop()移除栈顶元素push()在栈顶增加元素size()返回栈中元素数目top()返回栈顶元素
ratings.begin();//指向表示容器第一个元素的迭代器 ratings.end();//指向表示超过容器尾的迭代器 ratings.push_back(5);//在末尾添加元素 cout<<ratings.size();//容器中的数目 ratings.erase(ratings.begin(),ratings.begin()+2);//定区间删除 intsert为定点插入 它接受三个迭代器参数,第一个指定了新元素的插入位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个容器对象的一部分。vector<int> old_v;vector<int>new_v;……old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end()); 而且,这样拥有超尾元素是非常方便的,这使得在矢量尾部附加元素非常简单old_v.insert(old_v.end(),new_v.begin()+1,new_v.end());基本操作的使用例子
#include<iostream>#include<string>#include<vector>using namespace std;struct Review{ std::string title; int rating;};bool FillReview(Review & rr);void ShowReview(const Review & rr);int main(){ vector<Review> books; Review temp;//定义结构体类型的变量 while(FillReview(temp)) books.push_back(temp); int num=books.size(); if(num>0) { cout<<"Thank you.You entered the following:\n" <<"Rating\tbook\n"; for(int i=0;i<num;i++) ShowReview(books[i]); cout<<"Reprising:\n" <<"Rating\tbook\n"; vector<Review>::iterator pr;//指针 for(pr=books.begin();pr!=books.end();pr++) ShowReview(*pr); vector<Review> oldlist(books);//被用来拷贝结构体 if(num>3) { //romove 2 items books.erase(books.begin()+1,books.begin()+3); cout<<"After insertion:\n"; for(pr=books.begin();pr!=books.end();pr++) ShowReview(*pr); } books.swap(oldlist); cout<<"Swapping oldlist with books:\n:"; for(pr=books.begin();pr!=books.end();pr++) ShowReview(*pr); } else cout<<"Nothing entered ,nothing gained/\n"; return 0;}bool FillReview(Review & rr){ cout<<"Enter book title (quit to quit):"; getline(cin,rr.title); if(rr.title=="quit") return false; cout<<"Enter book rating: "; cin>>rr.rating; if(!cin) return false; //get rid of rest of input line while(cin.get()!='\n') continue; return true;}void ShowReview(const Review & rr){ cout<<rr.rating<<"\t"<<rr.title<<endl;}
对矢量可实行的其他操作 :搜索、排序、随机排序等
3个代表性的STL函数:for_each()、random_shuffle()和sort().
vector<Review>::iterator pr;for(pr==books.begin();pr!=books.end();pr++) ShowReview(*pr);<span style="font-size:18px;color:#3333FF;">可以替换为</span>for_each(books.begin(),books,end(),ShowReview);
这样可以避免显式的使用迭代器变量
Random_shuffle()函数
---------------------------------------------------
还是写具体用到的一些东西吧
lower_bound
lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值。
调用lower_bound之前必须确定序列为有序序列,可用来查找元素所在的位置
0 0
- STL的学习(C++primer)
- c++primer学习笔记(4.3) C风格的字符串
- 学习笔记(C++primer)
- 【STL】c++primer里面关于iterator的定义
- C++primer第十六章string与STL(1)
- c++primer学习笔记(4.2)指针的引入
- C++Primer学习笔记(类的动态内存)
- C++primer 学习(一)浅谈编译器的作用
- 我的C++primer 学习(1)
- 我的C++primer 学习(2)
- 我的C++primer 学习(3)
- 我的C++primer 学习(4)
- 我的C++primer 学习(5)
- c++primer:IO类的学习
- (学习)C Primer Plus(1)
- (学习)C Primer Plus(2)
- c++primer学习笔记(二)
- c++primer学习笔记(三)
- synchronized run()方法
- Oracle 查看表对应注释
- iOS自定义转场(custom transition)
- 安卓消息处理机制
- 01第一章 Jenkins是什么?
- STL的学习(C++primer)
- C# 使用FileStream文件流对文件进行读取写入
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
- maven导出项目依赖的jar包
- 大数据技能图谱
- 中英文字符大小和文本边界问题
- java synchronized详解
- XP系统下硬盘安装Fedora 14图文教程
- 机器学习常见算法个人总结