【C++ Vector】dynamic array

目录

Vector

Vector能力

大小(size)和容量(capacity)

Vector的操作

构建、复制和销毁

非更易型操作

赋值

元素访问

迭代器相关函数

安插和移除

Class vector


Vector

vector本身是“将元素至于dynamic array(动态数组)中加以管理,C++standard并未要求必须以dynamic array 实现vector,仅仅是规定起相应条件和操作复杂度;

使用vector包含头文件#include<vector>,在此头文件内类型vector是一个定义与namespace std 内的template。

namespace std{
    template <typename T, typename Allocator = allocator<T> >
    class vector;
}

    Vector的元素是任意类型T。可有可无的第二个template参数用来定义内存模型(memory modle)。默认内存模型是C++标准提供的allocator。

Vector能力

    Vector将元素复制到内部的dynamic array中。元素之间总是存在一定的顺序。所以vector是一种有序集合(ordered collection)。Vector支持随机访问,Vector提供的随机访问迭代器使用任何STL算法。

    Vector在末端附加或删除元素,效率相当的好,但是在前端或中间插或删除元素效率便不怎么样,因为作用点之后的每一个元素都必须移动另一位置,而一次移动都要调用assignment操作符。

大小(size)和容量(capacity)

Vector高效率原因之一是分配的空间会多余容纳的元素空间。

Vector提供操作大小的函数有:

  • size( ):返回vector元素数量
  • empty( ):判断容器是否为空(相当于size ( ) ==  0,但可能更快)
  • max_size( ):返回元素最大可能数量
  • capacity( ):返回vector实际容纳元素量,如果超过这个量,vector便重新分配内存

Vector的操作

构建、复制和销毁

Vector构造函数和析构函数
操作效果
vector<Elem> cDefault构造函数,产生空vector
vector<Elem> c(c2)Copy函数,建立新vector作为c2的拷贝(所有元素都被复制)
vector<Elem> c = c2Copy函数,建立新vector作为c2的拷贝(所有元素都被复制)
vector<Elem> c (rv)Move构造函数,建立一个新vector,取rvalue rv的内容(C++11)
vector<Elem> c = rvMove构造函数,建立一个新vector,取rvalue rv的内容(C++11)
vector<Elem> c(n)Default构造函数生成一个大小为n的vector
vector<Elem> c(n,elem)建立大小为n的vector,每个元素值都是elem
vector<Elem> c(beg,end)以区间[beg , end)为元素初始值
vector<Elem> c(initlist)以初始列initlist的元素为初始值(C++11)
vector<Elem> c = initlist以初始列initlist的元素为初始值(C++11)
c.~vector()销毁所有元素,释放内存

非更易型操作

Vector的非更易型操作

操作

效果

c.empty()

返回是否容器为空(相当于size()==0但也许较快)

c.size()

返回目前的元素个数

c.max_size()

返回元素个数之最大可能量

c.capacity()

返回“不进行空间重新分配”条件下的元素最大容量

c.reserve(num)

如果容量不足,扩大之

c.shrink_to_fit()

要求降低容量,以符合元素个数(C++11)

c1 == c2

返回c1是否等于c2(对每个元素调用==)

c1 !=  c2

返回c1是否不等于c2(相当于!(c1==c2))

c1 < c2

返回c1是否小于c2

c1 > c2

返回c1是否大于c2(相当于c2<c1

c1 <= c2

返回c1是否小于等于c2(相当于!(c2<c1))

c1 >= c2

返回c1是否大于等于c2(相当于!(c1<c2))

赋值

Vector的赋值操作
操作效果
c = c2将c2的全部元素赋值给c
c = rv将rvalue rv的所有元素以move assign方式给予c(C++11)
c = initlist将初值列initlist的所有元素赋值给c
c.assign(n,elem)复制n个elem,赋值给c
c.assign(beg,end)将区间[beg,end)内的元素赋值给c
c.assign(initlist)将初值列initlist的所有元素赋值给c
c1.swap(c2)置换c1c2的数据
swap(c1,c2)置换c1c2的数据

元素访问

Vector用以直接访问元素的各项操作
操作效果
c[idx]返回索引idx所指的元素(不检查范围)
c.at(idx)返回索引idx所指的元素(如果idx超出范围就抛出range-error异常
c.front()返回第一元素(不检查是否存在第一元素)
c.back()返回最末元素(不检查是否存在最末元素)

调用 front( ) 或 back( ) 时必须确定容器不为空。

迭代器相关函数

Vector随机访问(random-acess)迭代器

操作

效果

c.begin()

返回一个random-access iterator指向第一个元素

c.end()

返回一个random-access iterator指向最末元素的下一位置

c.cbegin()

返回一个const random-access iterator指向第一个元素(C++11)

c.cend()

返回一个const random-access iterator指向最末元素的下一位置(C++11)

c.rbegin()

返回一个反向的(reverse)iterator指向反向迭代的第一元素

c.rend()

返回一个反向的(reverse)iterator指向反向迭代的最末元素的下一位置

c.crbegin()

返回一个const reverse iterator指向反向迭代的第一元素(C++11)

c.crend()

返回一个const reverse iterator指向反向迭代的最末元素的下一位置(C++11)

安插和移除

操作

效果

c.push_back(elem)

附加一个elem的拷贝于末尾

c.pop_back()

移除最后一个元素,但是不返回它

c.insert(pos,elem)

在iterator位置pos之前插入一个elem拷贝,并返回新元素的位置

c.insert(pos,n,elem)

在iterator位置pos之前插入n个elem拷贝,并返回第一个新元素的位置(或返回pos–如果没有新元素的话)

c.insert(pos,beg,end)

在iterator位置pos之前插入区间[beg,end)内所有元素的一份拷贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话,C++11)

c.insert(pos,initlist)

在iterator位置pos之前插入初值列initlist内所有元素的一份拷贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话,C++11)

c.emplace(pos,args…)

在iterator位置pos之前插入一个以args为初值的元素,并返回新元素的位置(C++11)

c.emplace_back(args…)

附加一个以args为初值的元素于末尾,不返回任何东西(C++11)

c.erase(pos)

移除iterator位置pos上的元素,返回下一元素的位置

c.erase(beg,end)

移除[beg,end)区间内的所有元素,返回下一元素的位置

c.resize(num)

将元素数量改为num(如果size()变大,多出来的新元素都需以default构造函数完成初始化)

c.resize(num,elem)

将元素数量改为num(如果size()变大,多出来的新元素都是elem的拷贝)

c.clear()

移除所有元素,将容器清空

Class vector<bool>

vector<bool>的特殊操作

操作

效果

c.flip()

将所有bool元素值反相(negate),亦即对所有bit求补数

c[idx].flipt()

将索引idx所指的bit元素反相(对单一bit求补数)

c[idx] = val

将索引idx所指的bit元素赋值为val(赋值单一bit)

c[idx1] = c[idx2]

将索引idx1所指的bit元素赋值为索引idx2所指的bit元素值

    C++标准库针对bool的vector<>专门设计了一个特化版。一般vector<bool>实现版本会给每个bool元素分配至少1byte空间、而vector<bool>特化版的内部只使用1bit存放一个元素。但是C++最小可定址值是byte为单位,所以对vector特化版dreference和iterator也做特殊处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值