STL的学习(C++primer)

容器部分主要由头文件< 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值