9.3顺序容器操作

笔记

  1. c.begin();c.end();c.rbegin();c.rend(); 都是函数方法,返回一个iterator。
    2.c.push_back();c.push_front();其中c.push_front只是用于list和deque容器类型
    3.insert三种用法:
    c++
    c.insert(p,t);//iterator p前面插入值为t的元素,返回t所在的iteratior
    c.insert(p,n,t)//插入n个t,但是返回void
    C.insert(p,beg,end);//插入iteratior beg到end这个范围内的元素

    由于方法一中insert函数返回指向新插入元素的迭代器。可以使用该返回值在容器中的指定位置重复插入元素
    c++
    list<string> lst;
    list<string>::iterator iter=lst.begin();
    while(cin>>word)
    iter=lst.insert(iter,word);

    4.在vector容器中添加元素可能导致整个容器的重新加载,这样的话,该容器涉及的所有迭代器都会失效。即使不需要重新加载整个容器,指向新插入元素后面的元素的迭代器也会失效。
    任何insert或push操作都有可能导致迭代器失效。所以当循环将元素插入到vector或deque容器中时,不虚确保迭代器在每次循环后得到更新。
    要避免存储end操作返回的迭代器
vector<int>::iterator first=v.begin(),last=v.end();
while(first!=last){
    first=v.insert(++first,42);
    ++first;//advance *first* just past the element we add
}

程序将end返回的迭代器值存储在last中,但是添加元素可能会是的容器更新,存储在last中的迭代器失效,从而造成死循环。
while循环应该改为while(first!=v.end())

5.关系操作符。比较的容器必须有相同的容器类型,而且要有相同的元素类型。
容器的比较是基于元素内元素的比较。容器的比较实用了元素类型定义的同一个操作关系符。
如容器是 vector,那么两个容器的比较方法就用的string的比较方法,规则相同。
当元素类型是类类型的话,如 vector<Sales_item>,若Sales_item没有定义<或者>这样的关系运算符的话,就不能进行比较。

6.容器的大小操作:
c.size() 返回c中的元素个数。返回类型为c::size_type
c.max_size() 返回最多能容纳多少元素。 返回类型为c::size_type
c.empty() 返回bool值,空就返回1
c.resize(n) 调整容器大小,使其能够容纳n个元素。若n

习题

9.19

vector<int>::iterator iter=iv.begin();
while(iter!=iv.begin()+iv.size()/2){
    if(*iter==some_val){
        iter=iv.insert(iter,2*some_val);
        iter+=2;
    }
    else ++iter;
}

注意:
1)循环的判定条件是容器的中点,但是由于每一次循环都可能要插入元素,会导致容器的迭代器失效,所以每次循环都要计算,而不是将iv的中点迭代器存储下来
2)iter+=2;是因为insert(iter,2*some_val);是将元素插在iter这个迭代器之前,返回新元素的迭代器。+1就指向了原来的iter,再+1才会指向原来iter之后的元素,故+2。

9.20 cin.clear()用法

9.26使用eraser删除vector容器中的欧数值

int ia[]={0,1,1,2,3,5,8,13,21,55,89};
    vector<int> odd_vector(ia,ia+11);
    vector<int>::iterator odd=odd_vector.begin();
    while(odd!=odd_vector.end()){
        if(*odd%2==0)
            odd=odd_vector.erase(odd);//eraser函数返回指向被删除元素后面的元素的迭代器,所以不用odd++;一定别忘记用它来更新odd迭代器
        else odd++;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值