C++vector容器的使用

Posted Suk-god

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++vector容器的使用相关的知识,希望对你有一定的参考价值。

文章目录

1、vector的介绍

  1. vector是表示可变大小数组的序列容器
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小;
    为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(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容器的使用的主要内容,如果未能解决你的问题,请参考以下文章

vector你得知道的知识

vector容器经常用法

Vector容器,vector对象的构造,vector的赋值

vector

C++vector容器的使用

C++vector容器的使用