C++vector容器的使用
Posted Suk-god
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++vector容器的使用相关的知识,希望对你有一定的参考价值。
文章目录
1、vector的介绍
- vector是表示可变大小数组的序列容器。
- 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
- 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小;
为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。- vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
- 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
- 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。
2、 vector常用的接口
2.1 构造和析构相关
2.1.1 (constructor)–构造相关
前提说明:const allocator_type& alloc = allocator_type()是一个配置器相关内容,它是用于指定要使用的空间配置器的,STL提供的默认的空间配置器,我们基本不用管这个参数,除非是我们自己实现了一个空间配置器,然后希望使用我们自己写的空间配置器。因此,我们在使用它的时候,暂时忽略即可!
(1)explicit vector(
const allocator_type& alloc = allocator_type())
;
(2)explicit vector(size_type n.const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
(3)template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type())
;
当然,这个范围也可以是数组/数组的一部分
(4)vector(const vector& x);
拷贝构造,用容器x的内容来构造新的容器
2.1.2(destructor)–析构相关
~vector();
释放相关资源
operator=----赋值运算符重载
vector& operator=(const vector& x)
;
2.2 迭代器相关
在vector中,有四组迭代器相关的接口
1、begin() & end()
iterator begin();
| const_iterator begin() const;
获取第一个数据位置的iterator或者const_iterator
iterator end();
|const_iterator end() const;
获取最后一个数据的下一个位置的iterator或者const_iterator
2、rbegin() & rend()
reverse_iterator rbegin();
| const_reverse_iterator rbegin() const;
获取最后一个数据位置的reverse_iterator或者const_reverse_iterator
reverse_iterator rend();
| const_reverse_iterator rend() const;
获取第一个数据的前一个位置的reverse_iterator或者const_reverse_iterator
C++11中
3、cbegin() & cend()
const_iterator cbegin() const noexcept
;
const_iterator cend() const noexcept
;
4、crbegin() & crend()
const_reverse_iterator crbegin() const noexcept
;
const_reverse_iterator crend() const noexcept
;
解释:
const_iterator是一种指向const元素的随机访问迭代器类型,具体功效与begin()、end()、rbegin()、rend()功能一致,但是返回值具有的权限并不相同。带c的返回的迭代器指向的元素不可被修改
验证:
2.3 容量相关
size–获取容器中有效元素的个数
size_type size() const
;
capacity—获取容器的容量
size_type capacity()const
;
empty–判断容器是否为空,若是,返回true
resize—调整容器的有效元素个数
void resize(size_type n,value_type val = value_type())
;
将容器中有效元素的个数更新为n个,如果n大于原来容器的有效元素size,则多出来的元素使用val填充
验证:
(1)n<= size
(2)n > size
①n <= capacity
②n > capacity
reserve–更改容器的容量大小
void reserve(size_type n)
;
假设原来的容器的容量为capacity
(1)n <= capacity
直接忽略,不做处理
(2)n > capacity
2.4 访问元素相关
operator[]—重载[],通过下标的方式访问元素
reference operator[](size_type n)
;
const_reference operator[](size_type n)const
;at—通过下标访问元素
reference at (size_type n)
;
const_reference at (size_type n) const
;
二者的功能一致,都是访问下标n处的元素。
唯一不同的是:处理异常情况(比如访问越界)的方式不同
operator[]—>触发assert断言
at---->抛出异常
front—获取第一个元素
reference front()
;
const_reference front() const
;back–获取最后一个元素
reference back()
;
const_reference back() const
;
C++11
data–获取指向内部元素数组的指针
value_type* data() noexcept;
const value_type* data() const noexcept
;
代码演示:
2.5 修改相关
push_back —>在容器末尾插入一个元素
void push_back (const value_type& val)
;
可能会伴有扩容(当v.size() == v.capacity())pop_back -->将容器的最后一个元素删除
void pop_back();
注意:对一个空的容器使用pop_back会触发assert断言,导致程序崩溃
验证:
insert
①在position位置插入元素val
iterator insert (iterator position, const value_type& val);
②在position位置插入n个元素val
void insert (iterator position, size_type n, const value_type& val);
③在position处插入一段区间内的元素[first,last)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last)
;
演示:
erase
①删除position位置的元素,合法范围 [v.begin(),v.end())
iterator erase(iterator position)
;
②删除一段范围[first,last)内的元素
iterator erase(iterator first,iterator last)
;
验证:
swap
void swap(vector& x);
clear
清空容器的有效元素
void clear()
OK,看到这里,关于vector的基本使用已介绍完毕~,下篇介绍一下vector中的一个重难点:迭代器失效问题,我们下篇见!
与50位技术专家面对面 20年技术见证,附赠技术全景图以上是关于C++vector容器的使用的主要内容,如果未能解决你的问题,请参考以下文章