【C++】vector容器的使用

【C++】vector容器的使用,第1张

文章目录
  • 1、vector的介绍
  • 2、 vector常用的接口
    • 2.1 构造和析构相关
    • 2.2 迭代器相关
    • 2.3 容量相关
    • 2.4 访问元素相关
    • 2.5 修改相关

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
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
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中的一个重难点:迭代器失效问题,我们下篇见!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存