美文网首页
顺序容器

顺序容器

作者: 看风景的人_21744 | 来源:发表于2018-07-24 15:37 被阅读0次
    • 所有容器类都有共享公共的接口,不同容器按照不同方式对其进行扩展。每种容器都提供了不同性能和功能的权衡

    • 顺序容器:在添加和删除元素、随机访问元素之间做出折中。关键是连续储存还是非连续储存

    vecotr  // 可变大小数组,支持随机访问,尾部操作
    deque   // 双端队列, 支持随机访问,头部、尾部操作
    list    // 双向链表,只有双向顺序访问,可在任何位置操作
    forward_list  //单向链表,只有单向顺序访问, 可在任何位置操作
    array       //同数组,不过更安全
    string      // 字符串
    
    • deque定义在头文件<deque>,其他容器,同

    • 有对所有容器都适用的操作,但是这些操作可能对数据类型有要求

    vector<noDefault> v1(10, init)  //正确:        提供了元素初始值
    vector<noDefault> v1(10)  //error : 没有默认构造函数
    

    所有容器都有的操作

    • 迭代器
    //每个容器都定义了多个类型,如
    vector<int>::iterator it;
    vector<int>::reverse_iterator r_it;
    vector<int>::const_iterator c_it;
    vector<int>::size_type s;
    vector<int>::differance_type d;  //还有 value reference const_reference
    
    //获得迭代器
    auto it1 = a.begin();
    auto it2 = a.rbegin();  //反向迭代器
    auto it3 = a.cbegin();
    auto it4 = a.crbegin();
    
    • 容器定义和初始化
    C c;  //默认构造函数
    
    C c1(c2);
    C c1 = c2;  //c1初始化为c2的拷贝, 元素类型相同
    
    C c{a, b, c}
    C c = {a, b, c}  //c初始化为初始化列表中元素的拷贝, 元素类型相容即可
    
    C c(b, e);   //c初始化为迭代器b和c之间元素的拷贝,左闭右开。  元素类型相容即可(array不适用)
                // list<int>的迭代器可以初始化vector<double>等
    //只有顺序容器(不包括array)的构造函数才能接受大小参数
    C seq(n)  //包含n个元素, string不适用
    C seq(n, t); //seq包含n个初始化为值t的元素
    
    • array<int, 10> a = {1, 2};同时指定元素类型和大小。运行拷贝和赋值,数组则不行

    • 可以通过迭代器初始化vector<double>,用list<int>

    • 赋值操作:会使得左边容器内部的迭代器、引用和指针失效。swap不会(string和array除外)

    c1 = c2;
    
    c = {a, b, c}  //array不适用
    swap(c1, c2)   //比拷贝快
    c1.swap(c2)
    
    //assign操作不适用于关联容器和array。  很像初始化
    seq.assign(b, e)  //迭代器
    seq.assign(il)  //初始化为列表il中的元素
    seq.assign(n, t)  //n个值为t的元素
    
    • forward_list是单链表,操作有所不同
    fl.before_begin()
    fl.insert_after()
    fl.erase_after()
    emplace_after(p, args)
    
    • 改变容器大小
    list<int> a(10, 42);  //10个int,每个值都是42
    a.resize(15);    //后面5个是0
    a.resize(25, -1);   //加上10个-1
    a.resize(5);   //删除后面的20个元素
    
    • 容器操作可能使迭代器失效。使用失效的迭代器、引用或指针是严重的运行时错误。添加元素一般保证插入位置之前的元素及其地址不变(顺序存储的情况),后面的则要平移,地址改变。(把迭代器当作指针来看)后面的迭代器对应的对象变化了。如果添加元素后,需要重新分配,则前后的迭代器都失效了。链式存储的情况也可以这么分析

    • vector的容量关联

    // 初始化之后,一个一个元素添加。当个数大于容量时,重新分配内存,一般*2
    c.reserve(n)  //明确告诉分配至少n个元素的空间
    c.capacity()  //容量,一般大于实际的元素数量
    c.shrink_to_fit()  //把容量减少为元素
    
    的个数
    
    • string增加了许多可以用下标代替迭代器的操作,及string和C风格字符数组之间的相互转换

    • 容器适配器:stackququepriority_queue

    stack默认基于deque,可以基于listvectors.pop()删除栈顶元素,但不返回
    queue默认基于deque,可以基于listvectorq.pop()返回但不删除
    priority_queue默认基于vector,可以基于listp_q.pop()返回但不删除

    stack<int>  s(deq);  //从deq拷贝元素
    stack<string, vector<string>> s_v;  //基于vector
    stack<string, vector<string>> s_v(v);  //基于vector,从v中拷贝元素
    

    相关文章

      网友评论

          本文标题:顺序容器

          本文链接:https://www.haomeiwen.com/subject/gtxymftx.html