C++——vector和list简述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/puliao4167/article/details/86571531

vector

vector概述

    vector是STL中序列式容器的一种,可以理解为“可变长的数组”。与array的区别:array是静态空间,大小一旦固定就不能改变,vector是动态空间,随着元素的加入,他会有自己的机制来扩充空间以填充元素。vector的迭代器是random access iterator类型。

vector小例子

#include <vector>
#include <iostream>
#include <typeinfo>
using namespace std;

int main(int argc, char const *argv[])
{
    vector<int>::iterator itr;
    cout<<typeid(itr).name()<<endl;
    //N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE
    vector<int> vec;
    for(int i=0;i<10;i++){
        vec.push_back(i);
    }
    cout<<vec.size()<<"  "<<"  "<<vec.max_size()<<" "<<vec.capacity()<<endl;
    vector<string> vec2(10,"123");
    cout<<vec2.size()<<"  "<<"  "<<vec2.max_size()<<" "<<vec2.capacity()<<endl;
    vec2.resize(20,"1111");//注意这个resize同时改变size和capacity,源码中其实是填充
    cout<<vec2.size()<<"  "<<"  "<<vec2.max_size()<<" "<<vec2.capacity()<<endl;
    
    return 0;
}

    vector中的元素操作较为简单,详见 cppreference

vector内存管理与空间配置策略

    vector中最重要的就是对于其空间容量大小的配置。首先,如果在连续空间中每添加一个元素,都要经历“申请新空间—拷贝—释放旧空间”的过程的话,就会出现很大的消耗,成本很高。

    所以,vector制定的策略就是:当我们push_back一个元素入vector时候,先要判断是否还有备用空间,如果有的话直接在备用空间中构造元素,如果没有的话,则会另寻一处扩充空间,然后经历“申请新空间—拷贝—释放旧空间”的过程。为了减小成本,每次申请的新空间大小就很关键。vector的策略就是寻找的这个新空间的大小旧空间大小的两倍。

    还有一点需要注意的就是,当vector重新移动到新空间时,其指向原来vector的迭代器都会失效。

list

list概述

    相比于vector,list可以理解为“双向链表”,每次插入或者删除一个元素就配置或者释放一个元素空间,由于其是以一个双向链表,就必须要有前移后移的能力,所以迭代器类型是Bidirectional Iterator。除此之外,list的插入和删除操作不会使原有的list迭代器失效。详见cppreference

list例子

#include <list>
#include <iostream>
using namespace std;
template <typename T>
void printlist(const list<T> &ls){
    for(auto a: ls){
        cout<<a<<" ";
    }
    cout<<endl;
}

int main(int argc, char const *argv[])
{
    cout<<"测试构造函数"<<endl;
    list<int> ls{1,2,3,4,5,6};
    printlist(ls);
    list<int> ls2(ls.begin(),ls.end());
    printlist(ls2);
    list<int> ls3(ls);
    printlist(ls3);
    cout<<"测试元素操作"<<endl;
    
    ls.push_front(9);
    printlist(ls);
    
    ls.push_back(9);
    printlist(ls);
    
    list<int>::iterator itr=ls.begin();
    ls.erase(itr);
    printlist(ls);

    ls.pop_front();
    printlist(ls);

    ls.pop_back();
    printlist(ls);

    ls.remove(4);
    printlist(ls);

    ls.reverse();
    printlist(ls);
    
    ls.sort();
    printlist(ls);
    
    ls2.sort();
    ls.merge(ls2);
    printlist(ls);

    ls.splice(ls.begin(),ls3);
    printlist(ls3);
    printlist(ls);
    return 0;

}

猜你喜欢

转载自blog.csdn.net/puliao4167/article/details/86571531