STL教程(二): 序列容器--vector

一、vector介绍

vector是定义在命名空间std内的模板,是一种随机迭代器,其内存管理是一个一块连续分配的内存,支持动态扩展,其头文件是< vector>:

/*
T 可以是任意数据类型
Allocator:空间配置器,用于获取/释放内存以及构造/销毁该内存中的元素的分配器,默认为allocator(new/delete),一般不做修改。
*/
template <class T,class Allocator=allocator<T>>
class vector;

 为了加深理解,这里把官方给出的解释也贴了出来:

vector的元素是连续存储的,这意味着不仅可以通过迭代器访问元素,还支持随机访问。这也意味着指向vector元素的指针可以传递给任何需要指向数组元素的指针的函数。

vector的存储是自动处理的,可以根据需要进行扩展和收缩。vector通常比静态数组占用更多的空间,因为分配了更多的内存来处理未来的增长,这样,vector 不需要在每次插入元素时重新分配,而是仅在额外的内存耗尽时才重新分配。可以使用vector的capacity()函数查询分配的内存总量。额外的内存也可以通过调用shrink_to_fit()返回给系统。 

就性能而言,重新分配通常是代价高昂的操作。如果元件的数目是预先已知的,可以使用vector的 reserve() 函数进行预分配,以消除后续使用期间,元素个数不断增大,内存不断重新分配的问题。

vector运算的时间复杂度如下:

  • 随机访问 - 常数𝓞(1)
  • 末尾元素的插入或移除——摊销常量𝓞(1)
  • 元素的插入或移除 - 与向量末端的距离成线性𝓞(n)


二、vector的成员函数:

1、构造函数

(1)构造一个空的vector容器,没有元素,也是默认构造函数 

explicit vector(const allocator_type& alloc = allocator_type()); 

(2)构造一个包含n 个元素的容器,每个元素都是val的副本,若val未指定,则为默认值。

explicit vector(size_type n);
explicit vector(size_type n, const value_type& val,const allocator_type& alloc = allocator_type());

(3)构造一个包含了范围[first,last)元素的vector容器,每个元素都从该范围内的相应元素以相同的顺序就地构造。

template <class InputIterator> 
vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());

 (4) 以vector容器x作为数据源,构造一个新list容器,其中新vector容器中的元素来自于x中元素拷贝的副本。

vector(const vector& x);
vector (const vector& x, const allocator_type& alloc);

(5)构造一个容器,并直接从x中移动元素,之后x中的元素将被移除

vector(vector&& x);
vector(vector&& x, const allocator_type& alloc); 

(6)以与初始化列表相同的顺序构造一个vector容器,其中包含l中每个元素拷贝的副本

vector(initializer_list<value_type> l,const allocator_type& alloc = allocator_type()); 

2、operator=函数

(1)使用vector列表other对其进行复制拷贝

vector& operator=( const vector& other );

(2)使用vector列表other对其进行移动拷贝,之后other的数据将被清空

vector& operator=( vector&& other );

(3)使用初始化列表对vector进行赋值

vector& operator=( std::initializer_list<T> ilist );

3、迭代器

iterator begin();  // 返回vector迭代器到第一个元素
const_iterator cbegin(); // 返回vector迭代器到第一个元素
iterator end();    // 返回vector迭代器到最后一个元素 
const_iterator cend();   // 返回vector迭代器到最后一个元素
reverse_iterator rbegin(); // 返回vector反向迭代器到第一个元素
const_reverse_iterator crbegin();// 返回vector反向迭代器到第一个元素
reverse_iterator rend();   // 返回vector反向迭代器到最后一个元素
const_reverse_iterator crend();  // 返回vector反向迭代器到最后一个元素

4、容量相关

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

size_type size();// 返回容器中当前元素个数

size_type max_size(); //返回容器内可存放的最大元素个数

// 调整容器大小,使其只包含其前n个元素,若n>size,则使用默认值初始化。
void resize (size_type n);
 
// 调整容器大小,使其只包含其前n个元素,若n>size,则使用val初始化。
void resize (size_type n, const value_type& val);

size_type capacity(); // 返回当前为容器分配的存储空间的大小

/* 修改容器容量至少可以包含n个元素,若n>size,则容器会重新分配内容,将容量增加到n(或更大)
在所有其他情况下,函数调用不会导致重新分配并且容器容量不受影响*/
void reserve (size_type n);

5、元素访问

reference operator[] (size_type n);// 返回对vector容器中位置n处元素的引用,若n超出容器的size,该场景是未定义行为
 
reference at (size_type n);// 返回对vector容器中位置n处元素的引用,若n超出容器的size,将抛出out_of_range 异常
 
reference back(); // 返回vector中最后1个元素                       
 
reference front(); // 返回vector中第1个元素 

// 返回指向vector内部用于存储其拥有元素的内存数组的指针,可以使用该指针进行偏移以访问数组中的任何元素
value_type* data();

6、容器更改

// 将vector的元素使用count个value元素进行复制覆盖
void assign( size_type count, const T& value );

// 将vector的元素使用[first,last)的元素进行复制覆盖
template< class InputIt >
void assign( InputIt first, InputIt last );

// 将vector的元素使用初始化列表里的元素进行复制覆盖
void assign( std::initializer_list<T> ilist );

// 复制或移动元素val至容器末尾位置
void push_back(const value_type& val);
void push_back(value_type&& val);

// 从容器末尾位置删除一个元素
void pop_back();
 
// 在position位置插入元素val
iterator insert (const_iterator position, value_type&& val);
iterator insert (const_iterator position, const value_type& val);
 
// 在position位置插入n个元素val
iterator insert (const_iterator position, size_type n, const value_type& val);
 
// 在position位置插入元素[first,last)
iterator insert (const_iterator position, InputIterator first, InputIterator last);
 
// 在position位置插入一个initializer_list对象
iterator insert (const_iterator position, initializer_list<value_type> il);
 
// 从vector容器中删除单个元素position 
iterator erase (const_iterator position);
 
// 从vector容器中删除一系列元素 [first,last)
iterator erase (const_iterator first, const_iterator last);
 
// 与vector容器x互换内容
void swap (vector& x);
 
// 从vector容器中移除所有元素(已销毁),并保留大小为0的容器。
void clear();

​// 使用args作为构造参数就地构造新元素,并将其放入容器末尾位置  
void emplace_back (Args&&... args);
 
// 通过在position插入一个新元素来扩展容器,这个新元素是使用args作为构造参数就地构造的。
iterator emplace (const_iterator position, Args&&... args);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值