zoukankan      html  css  js  c++  java
  • C++ Primer 有感(顺序容器)

    1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定


    2.

    顺序容器

      vector                               支持快速随机访问

      list                                    支持快速插入/删除

      deque                              双端队列


    顺序容器适配器

      stack                                        后进先出(栈)

      queue                                      先进先出(队列)

      priority_queue                        有优先级管理的队列


    3.容器元素的初始化

    (1)将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同:

    vector<int> ivec;
    vector<int> ivec2(ivec);    //OK
    list<int> ilist(ivec);    //error
    vector<double> dvec(ivec);     //error

    (2)尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递一对迭代器间接实现该功能。使用迭代器时,不要求容器类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。


    4.C++语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足以下两个约束:

    (1)元素类型必须支持赋值运算

    (2)元素类型的对象必须可以复制

       由于引用不支持一般意义的赋值运算,因此没有元素是引用类型的容器。IO标准库不支持复制或赋值,因此不能创建存放IO类型对象的容器。


    5.在指定容器元素为容器类型时,必须如下使用空格:

    vector< vector<string> > lines;

       必须用空格隔开两个相连的>符号,以示这是两个分开的符号,否则,系统会认为>>是单个符号,为右移操作符,并结果导致编译时错误。


    6.容器定义的类型别名

    size_type                                                       无符号整型,足以存储此容器类型的最大可能容器长度

    iterator                                                           此容器类型的迭代器类型

    const_iterator                                               元素的只读迭代器类型

    reverse_iterator                                           按逆序寻址元素的迭代器

    const_reverse_iterator                               元素的只读(不能写)逆序迭代器

    difference_type                                            足够存储两个迭代器差值的有符号整型,可为负数

    value_type                                                    元素类型

    reference                                                      元素的左值类型,是value_type &的同义词

    const_reference                                         元素的常量左值类型,等效于 const value_type &

        在逆序迭代器上做++运算将指向容器中的前一个元素,最后三种类型使程序员无须直接知道容器元素的真正类型,就能使用它。需要使用元素类型时,只要用value_type即可。如果要引用该类型,则通过reference和const_reference实现。


    7.容器的begin和end操作

    c.begin()                   返回一个迭代器,它指向容器C的第一个元素

    c.end()                       返回一个迭代器,它指向容器C的最后一个元素的下一个位置

    c.rbegin()                  返回一个逆序迭代器,它指向容器C的最后一个元素

    c.rend()                     返回一个逆序迭代器,它指向容器C的第一个元素前面的位置 


    8.任何insert或push操作都可能袋子迭代器失效。当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。


    9.

    c.back()      返回容器c的最后一个元素的引用。如果c为空,则该操作未定义

    c.front()      返回容器c的第一个元素的引用。如果c为空,这该操作未定义

    例如:

     if (!ilist.empty()) {
        list<int>::reference val = *ilist.begin();
        list<init>::reference  val2 = ilist.front();
     // last and last2 refer to the same element
        list<int>::reference last = *--ilist.end();
        list<int>::reference last2 = ilist.back();


    10.顺序容器的赋值操作

    c1 = c2                    删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型(包括容器类型和元素类型)必须相同。

    c1.swap(c2)          交换内容:调用完该函数后,c1中存放的是c2原来的元素,c2中存放的则是c1原来的元素。c1和c2的类型必须相同。该函数的执行速度通常要比将c2的元素复制到c1的操作快

    c.assign(b,e)        重新设置c的元素:将迭代器b和e标记的范围内所有的元素复制到c中。b和e必须不是指向c中元素的迭代器

    c.assign(n,t)         将容器c重新设置为存储n个值为t的元素。

    注意:

    assign操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中。如果在不同(或相同)类型的容器内,元素类型相互兼容,则其赋值运算必须使用assign函数。

    swap操作要求交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。关于swap的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

  • 相关阅读:
    tomcat配置调优记录
    block,inline和inline-block概念和区别
    清除内外边距
    iddler抓包过程以及fiddler抓包手机添加代理后连不上网解决办法
    ator自动生成mybatis配置和类信息
    纯净版win7旗舰版
    Hibernate缓存机制
    JavaScript初学者应注意的七个细节(转)
    Oracle和Tomcat端口(8080)冲突的解决方法
    关系数据库设计基础--ER图(转)
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332729.html
Copyright © 2011-2022 走看看