zoukankan      html  css  js  c++  java
  • C++ Primer 笔记——顺序容器

    1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。

    2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素。

    3.常见的一些容器操作

    4.当一个容器初始化另一个容器拷贝时,两个容器的元素类型必须完全匹配,如果用一个容器的迭代器去初始化另一个容器时,只要元素类型可以转换即可。

     5.当定义一个array时除了指定类型之外还要定义它的大小,array可以进行拷贝赋值。

    std::array<int, 3> arr = {1, 2, 3};
    std::array<int, 3>::iterator iter;
    std::array<int, 3> arr1 = arr;

    6.容器的赋值运算。

    7.assign(array不可用)可以为类型不同但是相容的容器赋值。

    std::list<std::string> names;
    std::vector<const char*> oldstyle;
    names = oldstyle;        // 错误,类型不同
    names.assign(oldstyle.cbegin(), oldstyle.cend());

    8.除array外,swap不对任何元素进行拷贝,删除或插入操作,因此可以保证在常数时间完成。

    • 元素不被移动意味着,除string外,指向容器的迭代器,引用和指针在swap操作之后都不会失效,但是已经指向的容器已经随着元素发生变化。
    • 对string调用swap会导致迭代器,引用和指针失效。
    • swap两个array会真正交换它们的元素,因此交换两个array所需的时间与array的元素数目成正比,而且指针,引用和迭代器所绑定的元素保持不变,但元素的值变了。

    9.关系运算符两边的运算对象必须是相同类型的容器,且必须保存相同类型的元素。而且只有当元素类型定义了相应的比较运算符才可以比较,比较方式和string类似。

    10.除array外,所有标准库容器都提供灵活的内存管理。

    11.当我们用一个对象来初始化容器时,或将一个对象插入到容器中时,实际上放入到容器中的是对象值得一个拷贝。

    12.在新标准下,接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器,如果范围为空,不插入任何元素,insert操作会将第一个参数返回。

    std::list<int> ls;
    int i;
    auto iter = ls.begin();
    while (std::cin >> i)
        iter = ls.insert(iter, i);    // 等价于调用push_front

    13.emplace函数在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数相匹配。

    14.在顺序容器中访问元素的操作如下,而且下面操作返回的都是引用,如果容器是const的对象,则返回值是const引用。

    15.顺序容器的删除操作。

    16.在一个forward_list中添加或删除元素的操作是通过改变给定元素之后的元素来完成的,所以forward_list没有insert,emplace和erase,而是定义了一些其他操作。

    17.除了array外,可以用resize来增大或缩小容器。如果当前大小大于所要求大小,则多余的会被删除,反之会增加新元素到尾部。

    18.向容器中添加或删除元素可能会使指向容器元素的指针,引用或迭代器失效。

    向容器添加元素之后 :

    • 如果容器是string或vector,且存储空间被重新分配,则都会失效,如果未重新分配,则指向插入位置之前的仍然有效,插入位置之后的会失效。
    • 对于deque,插入到除首尾位置之外的任何位置都会失效,如果在首尾位置添加元素,迭代器会失效,但指向存在元素的指针和引用不会失效。
    • 对于list和forward_list,仍然有效。

    从容器中删除元素后:

    • 对于vector和string,指向被删除元素之前的仍然有效。注意:尾后迭代器总是会失效。
    • 对于deque,如果在首尾位置之外的任何位置删除元素,指向被删除元素外其他元素的会失效,如果删除的是尾元素,则尾后迭代器会失效,但其他的不受影响。如果删除首元素,也不会受影响
    • 对于list和forward_list,仍然有效。

    19.范围for语句体内不应该改变其所遍历序列的大小,因为一旦添加或删除元素,用来判断结束的end()函数的值可能变得无效了。

    20.vector元素的存储是连续的,当增加元素的时候如果连续的内存空间不够,则会重新分配空间。string和vector通常会预留空间作为预备。定义vector对象的时候设定其大小也就没什么必要了,事实上如果这么做性能可能更差。只有一种例外情况,就是所有元素的值都一样。

    21.管理容量的成员函数。

    reserve至少会分配指定大小的空间,但是可能更大,而且当参数小于当前容量的时候,reserve什么也不做。

    shrink_to_fit只是一个请求,标准库并不保证退还内存。

    只有在insert操作时size()和capacity()相等或调用reserve时才会重新分配内存,会分配多少取决于实现。

    22.修改string的操作。

    23.string的搜索操作。

  • 相关阅读:
    linux系统备份
    VNC轻松连接远程Linux桌面
    Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)
    Linux tar命令高级用法——备份数据
    在linux下使用debugfs恢复rm删除的文件
    Linux系统MySQL开启远程连接
    查看LINUX进程内存占用情况
    JavaScript使用数组
    JavaScript计时器
    大话三层架构
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/7225314.html
Copyright © 2011-2022 走看看