zoukankan      html  css  js  c++  java
  • STL vector容器 和deque容器

    前言

    STL是C++的框架,然后vector容器和deque容器又是STL的一部分...

    这块的内容都是理解、概念为主,没什么捷径,希望读者能静下来记

    先来讲vector容器(单端动态数组)

    1、vector大小操作

    size();返回容器中元素的个数。

    empty();//判断容器是否为空

    resize(int num);//重新制定容器的长度为num,若容器变长,则以默认值填充新位置(0),如果容器变短,则末尾超出容器长度的元素被删除。

    resize(int num,elem);//重新制定容器的长度num,若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器长>度的元素被删除。

    capacity();//容器的容量。

    reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

     1 void test02()
     2 {
     3     vector<int> v;
     4     v.push_back(10);
     5     v.push_back(20);
     6     v.push_back(30);
     7     v.push_back(40);
     8 
     9     if(v.empty())
    10     {
    11         cout<<"v容器为空"<<endl;
    12     }
    13     else
    14     {
    15         cout<<"容器非空"<<endl;
    16         cout<<"size = "<<v.size()<<endl;
    17         cout<<"capacity = "<<v.capacity()<<endl;
    18         //容量 >= size
    19     }
    20 
    21     printVectorInt(v);//10 20 30 40
    22     //resize(int num);//重新指定容器的长度为num
    23     //多出的部分 自动补0
    24     v.resize(8);
    25     printVectorInt(v);//10 20 30 40 0 0 0 0
    26 
    27     //resize(int num, elem);//重新指定容器的长度为num,
    28     //若容器变长,则以elem值填充
    29     v.resize(10,5);
    30     printVectorInt(v);//10 20 30 40 0 0 0 0 5 5
    31     
    32     v.resize(2);
    33     printVectorInt(v);//10 20
    34 }

    注意:resize 是作用于容器大小,不会更改容器容量。

    2、使用resize、swap收缩容器的容量

     1 void test04()
     2 {
     3     vector<int> v;
     4     for(int i=0;i<1000;i++)
     5     {
     6         v.push_back(i);
     7     }
     8     cout<<"size = "<<v.size()<<endl;//1000
     9     cout<<"capactiy = "<<v.capacity()<<endl;//1024
    10 
    11     //使用reszie将空间 置成10个元素(可以吗?)
    12     v.resize(10);//不能修改容量 只能修改size
    13     cout<<"size = "<<v.size()<<endl;//10
    14     cout<<"capactiy = "<<v.capacity()<<endl;//1024
    15 
    16     //使用swap收缩容器的容量
    17     vector<int>(v).swap(v);
    18 
    19     cout<<"size = "<<v.size()<<endl;//10
    20     cout<<"capactiy = "<<v.capacity()<<endl;//10
    21 }

     3、reserve预留空间大小

     4、数据的存取

    at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
    operator[];//返回索引idx所指的数据,越界时,运行直接报错
    front();//返回容器中第一个数据元素
    back();//返回容器中最后一个数据元素

     1 void test06()
     2 {
     3     vector<int> v;
     4     v.push_back(10);
     5     v.push_back(20);
     6     v.push_back(30);
     7     v.push_back(40);
     8 
     9     printVectorInt(v);//10 20 30 40
    10     cout<<v[2]<<endl;//30
    11     cout<<v.at(2)<<endl;//30
    12     //[] 越界 不抛出异常
    13     //at 越界 抛出异常
    14 
    15     cout<<"front = "<<v.front()<<endl;//10
    16     cout<<"back = "<<v.back()<<endl;//40
    17 }

    6、vector容器的插入和删除

    insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
    push_back(ele); //尾部插入元素ele
    pop_back();//删除最后一个元素
    erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
    erase(const_iterator pos);//删除迭代器指向的元素
    clear();//删除容器中所有元素

     1 void test07()
     2 {
     3     vector<int> v;
     4     v.push_back(10);
     5     v.push_back(20);
     6     v.push_back(30);
     7     v.push_back(40);
     8     printVectorInt(v);//10 20 30 40
     9 
    10     //insert(const_iterator pos, int count,ele);
    11     //迭代器指向位置pos插入count个元素ele.
    12     v.insert(v.begin()+2,3,100);
    13     printVectorInt(v);//10 20 100 100 100 30 40
    14 
    15     //尾部删除:pop_back();//删除最后一个元素
    16     v.pop_back();//将40删除了
    17     printVectorInt(v);//10 20 100 100 100 30
    18 
    19     //erase(const_iterator start, const_iterator end);
    20     //删除迭代器从start到end之间的元素
    21     v.erase(v.begin()+2, v.end()-1);
    22     printVectorInt(v);//10 20 30
    23 
    24     //erase(const_iterator pos);//删除迭代器指向的元素
    25     v.erase(v.begin()+1);//删除20的位置
    26     printVectorInt(v);//10 30
    27 
    28     cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl;
    29 
    30     //clear();//删除容器中所有元素
    31     v.clear();
    32     printVectorInt(v);//啥也没有
    33     cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl;
    34 }

     好了vector事例就是以上几点..现在来讲deque容器(双端动态数组)

     1、deque容器的构造 和赋值

    deque<T> deqT;//默认构造形式
    deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
    deque(n, elem);//构造函数将n个elem拷贝给本身。
    deque(const deque &deq);//拷贝构造函数。
    3.3.3.2 deque赋值操作
    assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
    assign(n, elem);//将n个elem拷贝赋值给本身。
    deque& operator=(const deque &deq); //重载等号操作符
    swap(deq);// 将deq与本身的元素互换

     1 void printDequeInt(deque<int> &d)
     2 {
     3     for(deque<int>::iterator it=d.begin();it!=d.end();it++)
     4     {
     5         cout<<*it<<" ";
     6     }
     7     cout<<endl;
     8 }
     9 void test01()
    10 {
    11     deque<int> d(5,10);
    12     printDequeInt(d);//10 10 10 10 10
    13 
    14     //assign(n, elem);//将n个elem拷贝赋值给本身。
    15     deque<int>  d1;
    16     d1.assign(5,100);
    17     printDequeInt(d1);//100 100 100 100 100
    18 
    19     //deque& operator=(const deque &deq); //重载等号操作符
    20     deque<int>  d2;
    21     d2 = d1;
    22     printDequeInt(d2);//100 100 100 100 100
    23 
    24     //swap(deq);// 将deq与本身的元素互换
    25     deque<int> d3(5,1);
    26     deque<int> d4(5,2);
    27     printDequeInt(d3);//1 1 1 1 1
    28     printDequeInt(d4);//2 2 2 2 2
    29     d3.swap(d4);
    30     printDequeInt(d3);//2 2 2 2 2
    31     printDequeInt(d4);//1 1 1 1 1
    32 }

    2、deque容器的大小操作、双端插入删除操作、元素访问操作

    3.3.3.3 deque大小操作
    deque.size();//返回容器中元素的个数
    deque.empty();//判断容器是否为空
    deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
    deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
    3.3.3.4 deque双端插入和删除操作
    push_back(elem);//在容器尾部添加一个数据
    push_front(elem);//在容器头部插入一个数据
    pop_back();//删除容器最后一个数据
    pop_front();//删除容器第一个数据
    3.3.3.5 deque数据存取
    at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
    operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
    front();//返回第一个数据。
    back();//返回最后一个数据
     1 void test02()
     2 {
     3     deque<int> d;
     4     //尾部插入
     5     d.push_back(10);
     6     d.push_back(20);
     7     d.push_back(30);//10 20 30
     8 
     9     //头部插入
    10     d.push_front(40);
    11     d.push_front(50);
    12     d.push_front(60);
    13     printDequeInt(d);//60 50 40 10 20 30
    14 
    15     //头部删除
    16     d.pop_front();//50 40 10 20 30
    17     //尾部删除
    18     d.pop_back();//50 40 10 20
    19     printDequeInt(d);//50 40 10 20
    20 
    21     if(d.empty())
    22     {
    23         cout<<"d容器为空"<<endl;
    24     }
    25     else
    26     {
    27         cout<<"d容器非空"<<endl;
    28         cout<<"size = "<<d.size()<<endl;//4
    29     }
    30 
    31     //[]访问第二个元素
    32     cout<<"d[2] = "<<d[2]<<endl;//10
    33     cout<<"d.at(2) = "<<d.at(2)<<endl;//10
    34     cout<<"头元素 = "<<d.front()<<endl;//50
    35     cout<<"尾元素 = "<<d.back()<<endl;//20
    36 }

     3、容器的插入删除

    3.3.3.6 deque插入操作
    insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
    insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
    insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
    3.3.3.7 deque删除操作
    clear();//移除容器的所有数据
    erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
    erase(pos);//删除pos位置的数据,返回下一个数据的位置
    1 void test03()
    2 {
    3     deque<int> d;
    4     d.insert(d.begin(),5, 100);
    5     printDequeInt(d);//100 100 100 100 100
    6 
    7     d.clear();
    8     cout<<"size = "<<d.size()<<endl;//0
    9 }

     5、srand设置随机种子 rand 产生随机数

     1 #include <iostream>
     2 #include<time.h>
     3 using namespace std;
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     //设置随机数种子time(NULL)获取当前时间
     8     srand(time(NULL));
     9 
    10     for(int i=0;i<10; i++)
    11     {
    12         //rand()函数的返回值就是随机数
    13         int num = rand();
    14         cout<<num<<" ";
    15     }
    16     cout<<endl;
    17     return 0;
    18 }

    deque容器和vector容器最大的差异:

    a、deque插入和删除 常数项时间(不会因为数据量的大小 改变操作所耗时)
    b、deque容器没有容量的概念 以分段连续空间组成。
    c、Deque是由一段一段的定量的连续空间构成。
  • 相关阅读:
    mysql基础知识
    django知识
    gitlab的CICD搭建记录
    nginx的基础知识
    JAVA基础知识总结——part1
    【Python】python基础练习题_1
    【Docker】——Linux下搭建docker环境
    day3
    python_day2
    python_day1
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12600813.html
Copyright © 2011-2022 走看看