zoukankan      html  css  js  c++  java
  • primer5:chap09顺序容器

    chap09、顺序容器 291(317/864)

    • 一个容器就是一些特定类型对象的集合。顺序容器(sequential container)的顺序不依赖于元素的值,而是与元素加入容器时的位置相对应

    9.1、顺序容器概述

    • 所有顺序容器都提供了快速顺序访问元素的能力。但以下方面都有不同的性能折中:
      • 向容器添加或从容器中删除元素的代价
      • 非顺序访问容器中元素的代价
    • 顺序容器类型
      • vector:快速随机访问。尾部之外插入/删除慢
      • deque:快速随机访问。头尾插入/删除快
      • list:双向顺序访问。任何位置插入/删除快
      • forward_list:单向顺序访问。任何位置插入/删除快
      • array:固定大小,快速随机访问,不能添加/删除元素
      • string:与vector相似,专门用于保存字符。随机访问快。尾部插入/删除快。
    • 确定使用哪种顺序容器
      • 除非你有很好的理由选择其他容器,否则应使用vector。
      • 如果程序要求随机访问元素,应使用vector或deque。
      • 中间插入或删除元素:list或forward_list
      • 头尾插入/删除,但不会在中间插入/删除,用deque。

    9.2、容器库概览

    • 0
      • 本节,将介绍对所有容器都适用的操作。
      • 一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。容器均定义为模板类
      • list<Sales_data> // 保存Sales_data对象的list
    • 对容器可以保存的元素类型的限制
      • vector<vector<string>> lines;//vector的vector
      • 某些类没有默认构造函数,但在构造这种容器时不能只传递给它一个元素数目参数:vector<noDefault> v2(10);//错误:必须提供一个元素初始化器 ,比如这样vector<noDefault> v1(10, init);
      • 表9.2:容器操作,295(321/864)

    9.2.1、迭代器

    • 0

      • 迭代器有着公共的接口:
    • 迭代器范围

      • 左闭合区间 [begin,end) 范围自begin开始,于end之前结束即不包含end
    • 对构成范围的迭代器的要求

    • 使用左闭合范围蕴含的编程假定

    while(begin != end){
        *begin = val; //正确:范围非空,因此begin指向一个元素
        ++begin; //移动迭代器,获取下一个元素
    }
    

    9.2.2、容器类型成员

    • 每个容器都定义了多个类型。我们已经使用过其中三种:size_type、iterator、const_iterator
    //iter是通过list<string>定义的一个迭代器类型
    list<string>::iterator iter;
    //count是通过vector<int>定义的一个difference_type类型
    vector<int>::difference_type count;
    

    9.2.3、begin和end成员

    • 当我们对一个非常对象调用这些成员时,得到的是返回iterator的版本。
    • 只有在对一个const对象调用这些函数时,才会得到一个const版本。
    • 当不需要写访问时,应使用cbegin和cend。以c开头的版本是const_iterator的。

    9.2.4、容器定义和初始化

    • 0
      • 每个容器类型都定义了一个默认构造函数。除array之外。
      • 表9.3:容器定义和初始化 299(325/864)
    • 将一个容器初始化为另一个容器的拷贝
      • (1)可以直接拷贝整个容器
      • (2)array除外,拷贝由一个迭代器对指定的元素范围
      • deque<string> authList(authors.begin(),it);//拷贝元素,直到(但不包括)it指向的元素
    //每个容器有三个元素,用给定的初始化器进行初始化
    list<string> authors = {"Milton","Shakespeare","Austen"};
    vector<const char*> articles = {"a","an","the"};
    
    list<string> list2(authors);//正确:类型匹配
    deque<string> authList(authors);//错误:容器类型不匹配
    vector<string> words(articles); //错误:容器类型必须匹配
    
    //正确:可以将const char*元素转换为string
    forward_list<string> words(articles.begin(), articles.end());
    
    • 列表初始化
      • vector<const char*> articles = {"a","an","the"};
    • 与顺序容器大小相同的构造函数
    vector<int> ivec(10,-1);//10个int元素,每个都初始化为-1
    list<string> svec(10,"hi!");//10个strings;每个都初始化为“hi!”
    forward_list<int> ivec(10);//10个元素,每个都初始化为0
    deque<string> svec(10);//10个元素,每个都是空string
    
    • 标准库array具有固定大小

    9.2.5、赋值和swap

    • 0
      • 表9.4:容器赋值运算 302(328/864)
    • 使用assgin(仅顺序容器)
    list<string>names;
    vector<const char*> oldstyle;
    names = oldstyle;  //错误:容器类型不匹配
    //正确:可以将const char*转换为string
    names.assign(oldstyle.cbegin(),oldstyle.cend());
    
    //等价于slist1.clear();
    //后跟slist1.insert(slist1.begin(),10,"Hiya!");
    list<string> slist1(1);//1个元素,为空string
    slist1.assign(10,"Hiya!");//10个元素,每个都是"Hiya!"
    
    • 使用swap

    9.2.6、容器大小操作

    • 0
      • size()返回容器中元素的数目
      • empty当size为0时返回布尔值true,否则返回false
      • max_size返回一个大于或等于该类型容器所能容纳的最大元素数的值

    9.2.7、关系运算符

    9.3、顺序容器操作

    9.3.1、向顺序容器添加元素

    9.3.2、访问元素

    9.3.3、删除元素

    9.3.4、特殊的forward_list

    9.3.5、改变容器大小

    9.3.6、容器操作可能使迭代器

    9.4、vector对象是如何增长的

    9.5、额外的string操作

    9.5.1、构造string的其他方

    9.5.2、改变string的其他方

    9.5.3、string搜索操作

    9.5.4、compare函数

    9.5.5、数值转换

    9.6、容器适配器

    小结 332(358/864)

    履历

    • 2020-06-03整理了初稿。
    • 2021-01-12开始进行重读英文版后再进行整理,主要是9.1节。
  • 相关阅读:
    深度可分离卷积、分组卷积、空洞卷积、转置卷积
    Batch Normalization
    激活函数
    容器————vector
    39XML文档类
    38初识xml
    37QT程序打包
    36可视化操作数据库
    35使用模型操作数据库
    34sqlite
  • 原文地址:https://www.cnblogs.com/fewolflion/p/14269709.html
Copyright © 2011-2022 走看看