c++ 11标准模板(STL) std::vector (一)

定义于头文件 <vector>
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template <class T>
    using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

}
(2)(C++17 起)

1) std::vector 是封装动态数组的顺序容器。

2) std::pmr::vector 是使用多态分配器的模板别名。

元素相继存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。

(C++03 起)

vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 的调用返回给系统。 (C++11 起)

重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。

vector 上的常见操作复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在末尾插入或移除元素——均摊常数 O(1)
  • 插入或移除元素——与到 vector 结尾的距离成线性 O(n)

std::vector (对于 bool 以外的 T )满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、序列容器 (SequenceContainer) 、连续容器 (ContiguousContainer) (C++17 起)及可逆容器 (ReversibleContainer) 的要求。

模板参数

T-元素的类型。
T 必须满足可复制赋值 (CopyAssignable) 和可复制构造 (CopyConstructible) 的要求。(C++11 前)
加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型是完整类型并满足可擦除 (Erasable) 的要求,但许多成员函数附带了更严格的要求。(C++11 起)
(C++17 前)
加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型满足可擦除 (Erasable) 的要求,但许多成员函数附带了更严格的要求。若分配器满足分配器完整性要求,则容器(但非其成员)能以不完整元素类型实例化。(C++17 起)

Allocator-用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 的要求。若 Allocator::value_type 与 T 不同则行为未定义。

特化

标准库提供 std::vector 对类型 bool 的特化,它可能为空间效率优化。

vector<bool>

节省空间的动态 bitset
(类模板)

迭代器非法化

全部迭代器
被修改元素前被修改元素被修改元素后尾后
operator=、 assign失效
移动操作operator=、swap、std::swap有效,但指向移动后的容器失效
元素访问有效
迭代器有效
容量empty、size、max_size有效
容量修改reserve
shrink_to_fit
无重分配有效
重分配失效
修改器插入无重分配有效N/A失效
重分配失效
擦除有效失效

成员类型

成员类型定义
value_typeT
allocator_typeAllocator
size_type无符号整数类型(通常是 std::size_t )
difference_type有符号整数类型(通常是 std::ptrdiff_t )
reference
Allocator::reference(C++11 前)
value_type&(C++11 起)
const_reference
Allocator::const_reference(C++11 前)
const value_type&(C++11 起)
pointer
Allocator::pointer(C++11 前)
std::allocator_traits<Allocator>::pointer(C++11 起)
const_pointer
Allocator::const_pointer(C++11 前)
std::allocator_traits<Allocator>::const_pointer(C++11 起)
iterator遗留随机访问迭代器 (LegacyRandomAccessIterator)
const_iterator常随机访问迭代器
reverse_iteratorstd::reverse_iterator<iterator>
const_reverse_iteratorstd::reverse_iterator<const_iterator>

成员函数

(构造函数)

构造 vector
(公开成员函数)

(析构函数)

析构 vector
(公开成员函数)

operator=

赋值给容器
(公开成员函数)

assign

将值赋给容器
(公开成员函数)

get_allocator

返回相关的分配器
(公开成员函数)

元素访问

at

访问指定的元素,同时进行越界检查
(公开成员函数)

operator[]

访问指定的元素
(公开成员函数)

front

访问第一个元素
(公开成员函数)

back

访问最后一个元素
(公开成员函数)

data

返回指向内存中数组第一个元素的指针
(公开成员函数)

迭代器

begin cbegin

返回指向容器第一个元素的迭代器
(公开成员函数)

end cend

返回指向容器尾端的迭代器
(公开成员函数)

rbegin crbegin

返回指向容器最后元素的逆向迭代器
(公开成员函数)

rend crend

返回指向前端的逆向迭代器
(公开成员函数)

容量

empty

检查容器是否为空
(公开成员函数)

size

返回容纳的元素数
(公开成员函数)

max_size

返回可容纳的最大元素数
(公开成员函数)

reserve

预留存储空间
(公开成员函数)

capacity

返回当前存储空间能够容纳的元素数
(公开成员函数)

shrink_to_fit

(C++11)

通过释放未使用的内存减少内存的使用
(公开成员函数)

修改器

clear

清除内容
(公开成员函数)

insert

插入元素
(公开成员函数)

emplace

(C++11)

原位构造元素
(公开成员函数)

erase

擦除元素
(公开成员函数)

push_back

将元素添加到容器末尾
(公开成员函数)

emplace_back

(C++11)

在容器末尾就地构造元素
(公开成员函数)

pop_back

移除末元素
(公开成员函数)

resize

改变容器中可存储元素的个数
(公开成员函数)

swap

交换内容
(公开成员函数)

非成员函数

operator==operator!=operator<operator<=operator>operator>=

按照字典顺序比较 vector 中的值
(函数模板)

std::swap(std::vector)

特化 std::swap 算法
(函数模板)

erase(std::vector)erase_if(std::vector)

(C++20)

擦除所有满足特定判别标准的元素
(函数模板)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值