C++容器——动态数组(vector)

1. 简介

vector是动态数组,其大小可以实时的进行调整,在调整的时候vector回去申请一块内存,而不是逐个的去申请;内存是连续的;

头文件和结构

#include <vector>   \\头文件

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

2. 初始化

初始化分为直接初始化、拷贝初始化、赋值初始化等

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

template<typename T>
void showInfo(T &t)
{
    for(auto &au : t)
    {
        std::cout<<au<<" ";        
    }
    std::cout<<std::endl;
}


int main(int argc, char *argv[])
{   
    std::vector<int32_t> v1;
    v1 = {11,21,31,41,51,61};
    showInfo(v1);

    std::vector<int32_t> v2{111,222,333};
    showInfo(v2);

    std::vector<int32_t> v3 = v1;    
    showInfo(v3);

    std::vector<int32_t> v4 = {666,7777,888};
    showInfo(v4);

    return 0;
}

输出

11 21 31 41 51 61
111 222 333
11 21 31 41 51 61
666 7777 888

3. 使用

3.1 元素访问

方法说明
[] 或 at()下标访问
front数组头元素
back数组尾元素
data返回元素类型的指针
empty数组判空
size数组大小
max_size最大容量
reserve改变容量
capacity当前容量
resize改变大小
shrink_to_fit改变vector所占内存的大小,减少到size的大小
clear清空size大小,不改变capacity

示例

int main(int argc, char *argv[])
{   
    //元素访问 at operator[] front back data
    std::vector<std::string> v1{"c++","c","java","python"};
    std::cout<<"at()  "<<v1.at(2)<<std::endl;
    std::cout<<"[]  "<<v1[2]<<std::endl;
    std::cout<<"front  "<<v1.front()<<std::endl;
    std::cout<<"back  "<<v1.back()<<std::endl;

    std::string *pStr = v1.data();
    std::cout<<*pStr<<std::endl;

    if(v1.empty())
    {
        std::cout<<"empty"<<std::endl;
    }
    else{
        std::cout<<"not empty"<<std::endl;
    }

    std::cout<<"size  "<<v1.size()<<std::endl;
    std::cout<<"max_size  "<<v1.max_size()<<std::endl;
    std::cout<<"capacity  "<<v1.capacity()<<std::endl<<std::endl;

    v1.reserve(101);  //改变capacity的大小,size不变
    std::cout<<"(reserve)size  "<<v1.size()<<std::endl;
    std::cout<<"(reserve)max_size  "<<v1.max_size()<<std::endl;
    std::cout<<"(reserve)capacity  "<<v1.capacity()<<std::endl<<std::endl;
    

    v1.resize(1000);   //改变size的大小;size和capacity都会改变
    std::cout<<"(resize)size  "<<v1.size()<<std::endl;
    std::cout<<"(resize)max_size  "<<v1.max_size()<<std::endl;
    std::cout<<"(resize)capacity  "<<v1.capacity()<<std::endl<<std::endl;

    v1.clear();   //情况size的大小,但是不改变capacity
    std::cout<<"(clear)size  "<<v1.size()<<std::endl;
    std::cout<<"(clear)max_size  "<<v1.max_size()<<std::endl;
    std::cout<<"(clear)capacity  "<<v1.capacity()<<std::endl<<std::endl;

    v1.shrink_to_fit();   //减少到size的大小,不会小于size
    std::cout<<"(shrink_to_fit)size  "<<v1.size()<<std::endl;
    std::cout<<"(shrink_to_fit)max_size  "<<v1.max_size()<<std::endl;
    std::cout<<"(shrink_to_fit)capacity  "<<v1.capacity()<<std::endl<<std::endl;
    
    return 0;
}

结果

at()  java
[]  java
front  c++
back  python
c++
not empty
size  4
max_size  576460752303423487
capacity  4

(reserve)size  4
(reserve)max_size  576460752303423487
(reserve)capacity  101

(resize)size  1000
(resize)max_size  576460752303423487
(resize)capacity  1000

(clear)size  0
(clear)max_size  576460752303423487
(clear)capacity  1000

(shrink_to_fit)size  0
(shrink_to_fit)max_size  576460752303423487
(shrink_to_fit)capacity  0

3.2 元素修改

方法说明
insert插入元素,可以是任意位置,可以插入多个元素
emplace插入元素,可以是任意位置,只能插入一个元素
erase删除元素,可以是任意位置
push_back数组尾部插入元素,先复制元素,在将元素插入到尾部
emplace_back数组尾部插入元素,直接在数组尾部创建元素
pop_back删除队尾元素
swap交换两个vector的内容
assign重新对vector赋值
get_allocator返回内存分配器

示例

int main(int argc, char *argv[])
{   
    //元素修改 insert  emplace erase push_back emplace_back pop_back swap
    std::vector<std::string> v1{"c++","c","java","python"};

    //1.元素插入,插入完全的对象
    //v1.insert(v1.begin() + 1,"shell");
    //v1.insert(v1.begin(),"shell");  //插入到数组头
    v1.insert(v1.end(),"shell");      //插入到数组尾
    showInfo(v1);

    //2.emplace 插入,先构造,再插入
    v1.emplace(v1.begin(),"PHP");
    showInfo(v1);

    //3.erase  元素删除,删除指定位置的数组
    //v1.erase(v1.begin());
    //v1.erase(v1.end());
    v1.erase(v1.begin() + 1);
    showInfo(v1);

    //4.push_back(先创建元素,在将元素拷贝或复制到容器) 和 emplace_back(直接在容器尾部创建元素,省去了拷贝或移动的过程)
    v1.push_back("SQL");
    v1.emplace_back("PG");
    showInfo(v1);
 
    //5.pop_back   删除数组尾部元素
    v1.pop_back();
    showInfo(v1);

    //6.swap  vector交换
    std::vector<std::string> v2{"R", "matlab"};
    v1.swap(v2);
    showInfo(v1);
    showInfo(v2);  

    //7.插入多个元素
    v1.insert(v1.begin()+1,v2.begin(),v2.end());
    showInfo(v1);
    
	//8.assgin  对vector重新赋值
    v1.assign(2, "a");
    showInfo(v1);

    return 0;
}

结果

c++ c java python shell
PHP c++ c java python shell
PHP c java python shell
PHP c java python shell SQL PG
PHP c java python shell SQL
R matlab
PHP c java python shell SQL
R PHP c java python shell SQL matlab
a a

3.3 迭代器

迭代器最好结合STL中的算法一起使用;迭代器的返回值最好用auto接受;

迭代器的类型包括:iterator、const_iterator、reverse_iterator和const_reverse_iterator

方法说明
begin返回数组的头元素(迭代器),其值可修改
end返回数组的尾元素(迭代器),其值可修改
cbegin返回数组的头元素(迭代器),其值不可修改,const属性
cend返回数组的尾元素(迭代器),其值不可修改,const属性
rbegin反序返回数组的头元素(迭代器),其值可修改,同end()
rend反序返回数组的尾元素(迭代器),其值可修改,同begin()
crbegin反序返回数组的头元素(迭代器),其值不可修改,同cend,const属性
crend反序返回数组的头元素(迭代器),其值不可修改,同cbegin,const属性

迭代器的使用大同小异,和array的使用类似

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值