9.3 顺序容器的操作

  1. size_type
    iterator                 const_iterator
    reverse_iterator         const_reverse_iterator
    difference_type value_type
    reference                const_reference
     
    reference是做值类型,是value_type&的同义词;
    逆序迭代器,是前后颠倒的迭代器,第一个迭代器为最后一个位置,最后一个迭代器为第一个位置元素前的位置;++reverse_iterator为向前移动;
    value_type是元素的类型,很方便; 
  2. begin()          end()
    rbegin()         rend()
    逆序操作;
    每个操作都有一个const成员,还有一个非const成员,两个版本; 
  3. push_back()        push_front()
    注意:push_front只使用与list和deque,不能用于vector 
  4. insert(p,t)
    insert(p,n,t)
    insert(p,begin,end)
    注意返回类型,第一个为新插入的迭代器,后两个返回void 
  5. 插入容器的元素是原始元素的副本,与原始元素互不影响
  6. insert、push等操作,会导致整个容器重新加载,原来的迭代器可能失效,需要更新所有之后要用到的迭代器。
    安全起见,假设所有的迭代器都会失效。 
  7. vector<int>::iterator first = ivec.begin(), last = ivec.end();
    while(first != last)
    {
        first = ivec.insert(first,42);
        ++first;           //这句导致first越过了刚刚添加的元素
    }
     
       上述代码行为未定义,通常会导致死循环。因为insert操作导致迭代器失效,之前的last迭代器一样失效了,既不指向ivec的素,也不指向最后一个元素后的位置,first的!=操作也就没有判断为假的理由了。
     
    注意:避免存储end()返回的迭代器,添加或删除deque或vector容器内的元素都会导致存储的迭代器失效!
     
    上述代码可改为:
    while(first != ivec.end() )
    {
        first = ivec.insert(first,42);
        ++first;
  8. 容器 可以使用关系运算符做比较运算,但是:
    (1)容器类型必须一样
    (2)容器内的元素必须支持关系运算符的比较操作,否则容器不能做比较。
    容器的比较,是使用元素的比较操作实现的,元素若不支持比较操作,容器自然不能比较。
    容器的比较类似于string的比较操作,长度不相等,看是否为子序列(子序列是小的),不为子序列,则比较第一个不同的元素大小。
    元素类型为string等时,使用string的比较操作。 
  9. resize()的参数如果短于容器长度,则会删除后面原有的那部分元素,使容器长度等于resize的参数。
    resize也可能使迭代器,注意是怎样使之失效的。 
  10. front、begin、下标引用、at操作,都要注意不要指向不存在的元素,如果容器为空,更不要使用此类操作,否则:front、begin、下标引用结果导致运行时错误(run_time_error),at操作引起(out_of_range)异常。 
  11. 顺序容器的删除操作:
    erase(b,e)会删除从b开始,到e之前的迭代器,和两个迭代器之间的元素,即左闭合区间。
    pop_front()只适用于list和deque容器。
  12. erase的两个迭代器参数,如果指向同一个元素(比如end),则不会删除任何元素。
    如果都指向end,答案书籍上写到会出现运行时错误,但我运行时没有出现错误,VC2010的原因?

  13. find()会从第一个参数开始查找,知道遇到第二个参数为止,不会查找第二个参数所指向的元素。

  14. 注意:erase和pop_back、pop_front同样可能使指向被删除的元素的所有迭代器失效,对于vector,删除点后的所有元素的迭代器都会失效;对于deque容器,如果删除时不包含第一个元素或最后一个元素,则容器中相关的所有迭代器都会失效。
  15. elem1 = find(ivec.begin(),ivec.end(),val1);
    elem2 = find(elem1,ivec.end(),val2);
    ivec.erase(elem1,elem2);
     
    注意:val1和val2是不同的值,如果两个值相同,则elem1和elem2指向相同的位置,erase不会删除任何元素。 
  16. 顺序容器的赋值操作:
    c1 = c2;
    c1.swap(c2);
    c.assign(b,e);
    c.assign(n,t);
     
    如果两个容器类型相同,元素类型也相同,则可以使用"="操作符;
    如果两个容器类型不相同,元素类型兼容,可以使用assign操作。
     
    assign操作,会先删除容器中原来存储的所有元素,然后将参数中的容器中的元素复制过去。
    注意:因为会先删除原有元素,所以参数中的迭代器决不能是操作容器中的迭代器。
  17. c1.swap(c2)
    会交换两个容器中的所有元素,比如c1有10个元素,c2有25个元素,交换后,c1有25个元素,c2有10个元素。
    注意:swap操作不会删除、插入任何元素,保证在常量时间内实现交换,由于不移动任何元素,所以原有迭代器不会失效。即
    来指向c1第一个元素的迭代器,交换后指向c2的第一个元素。同一个元素,存储在不同的容器中而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值