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的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

  • 相关阅读:
    【leetcode】1295. Find Numbers with Even Number of Digits
    【leetcode】427. Construct Quad Tree
    【leetcode】1240. Tiling a Rectangle with the Fewest Squares
    【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
    【leetcode】1291. Sequential Digits
    【leetcode】1290. Convert Binary Number in a Linked List to Integer
    【leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
    【leetcode】1289. Minimum Falling Path Sum II
    【leetcode】1288. Remove Covered Intervals
    【leetcode】1287. Element Appearing More Than 25% In Sorted Array
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6173017.html
Copyright © 2011-2022 走看看