• array、vector、forward-list、list、deque的扩容,栈与队列,基于范围的for循环


    std::array 除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能。而且它还不会退化成指针T *给开发人员造成困惑。

    std::vector 向量容器,尾部单端扩容(容量不够,2倍扩容),所以只有push_back,没有push_front。

    forward-list 单向链表,头部单端扩容(容量不够,扩充1个节点),只有push_front,没有push_back。

    list 双向链表,两端扩容(容量不够,扩充1个节点)。

    deque 双向队列,两端扩容(容量不够,2倍扩充),元素是放在buffer里的(元素个数最多=512字节/元素类型所占字节数,个),deque是下图的map(理解为中心枢纽),buffer在别的地方,map每格指向1个buffer。buffer满了,增加1个新buffer,占用deque 1格,当格占满了,2倍扩充格子。

    以上5个容器,vector对空间浪费比较严重(2倍扩容,2*已满容量),forward-list、list最节省空间(每次扩1个节点)

    【栈与队列】栈与队列本质上是使用了双向队列的部分功能。

    stack栈,先进后出

    queue队列,先进先出

    双向队列,两端进出

     

    for( 元素名变量 : 广义集合) { 循环体 }

    a.“元素名变量”可以是引用类型,以便直接修改集合元素的值;

    b. “元素名变量”也可以是const类型,避免循环体修改元素的值

    c. 其中“广义集合”就是“Range(范围)”,是一些元素组成的一个整体

    基于范围的循环仅限于for语句,do…while(); 和while(){} 不支持基于范围的循环。

    #include<iostream>
    #include<array> //引入
    #include<vector> //引入
    using namespace std;
    
    int main(){
        int a[]{1, 2, 3, 4};//旧的定义方式
        array<int, 4> a2 ={ 1, 2, 3, 4};
        vector<int> v  ={ 1, 2, 3 };
        vector<string> s = { "hello", "world", "!" };
        for (auto i:a2)
        {
            cout << i << endl;
        }
        for (auto &i:a2)//引用,改变每个元素,2倍
        {
            i = i * 2;
        }
        for (auto i : a2)
        {
            cout << i << endl;
        }
    
        return 0;
    }

    【参考】

    https://blog.csdn.net/thinkerleo1997/article/details/80415059 C++11:尽量使用std::array来代替数组

    https://blog.csdn.net/SENLINZM/article/details/38682233 C++11 array使用详解

  • 相关阅读:
    2018-8-10-win10-uwp-商业游戏-1.2.1
    2018-8-10-win10-uwp-商业游戏-1.2.1
    2019-3-1-获取-Nuget-版本号
    2019-3-1-获取-Nuget-版本号
    2019-9-24-dotnet-remoting-抛出异常
    2019-9-24-dotnet-remoting-抛出异常
    2018-2-13-C#-解析-sln-文件
    2018-2-13-C#-解析-sln-文件
    2018-10-19-jekyll-添加-Valine-评论
    2018-10-19-jekyll-添加-Valine-评论
  • 原文地址:https://www.cnblogs.com/xixixing/p/12036254.html
Copyright © 2020-2023  润新知