首页 > 其他分享 >STL | vector操作总结

STL | vector操作总结

时间:2024-05-17 09:41:41浏览次数:16  
标签:总结 const iterator STL void 元素 vector size

vector

随机访问 在序列末尾插入和删除元素为常量时间,而在中间插入和删除元素需要线性时间

介绍

  • vector为可变长的数组(动态数组),定义的vector数组可以随时添加和删除元素
  • 当vector容量不足以容纳新增元素时会扩容为两倍(不同编译器有不同的实现,GCC以两倍扩容),需要将元素复制到新开辟的空间

在局部作用域中vector数组是开辟在堆区的,而普通数组是开辟在栈区的
因为栈的大小通常较小,所以如果要开辟很大的数组要用vector

头文件

#include <vector>

初始化

// 默认初始化
vector();

// 初始化指定大小的vector
explict vector(size_type count);
// 初始化指定大小的vector并赋值为指定value
vector(size_type count, const Type& value);

// 用vector初始化vector
vector(const vector& source);
vector(vector&& source);

// 用迭代器指定范围的元素初始化vector
template <class InputIterator>
vector(InputIterator first, InputIterator last);

创建指定大小的二维数组

// 方法一
int m = 2, n = 3;
vector<vector<int> vec(m, vector<int>(n));

// 方法二
vector<vector<int> vec;
vec.resize(m);
for(int i = 0; i < m; ++i) {
    vec[i].resize(n);
}

函数

assign

清空vector并将指定元素复制到vector

// assign
void assign(size_type count, const Type& value);
// 初始化列表
void assign(initializer_list<Type> ini_list);

template <class InputIterator>
void assign(InputerIterator first, InputIterator last);

at

  • 返回指定位置的元素
  • 尝试返回不存在的位置时抛出异常
reference at(size_type position);

const_reference at(size_type position);

back

  • 返回对向量中最后一个元素的引用
  • 如果vector为空,则返回值不确定
reference back();
const_reference back() const; // 第二个const保证了该函数不会改变对象的状态

begin

  • 返回vector指向第一个元素的迭代器
  • 如果vector为空则返回容器开始的位置,这时和end返回的位置相同
const_iterator begin() const;
iterator begin();

capacity

返回在不分配更多的存储的情况下vector可以包含的元素个数

size_type capacity() const;

cbegin

  • 返回第一个元素地址的const迭代器
  • 对于空vector,cbegin == cend
const_iterator cbegin() const;

cend

返回指向最后一个元素后面一个位置

const_interator cend() const;

clear

  • 清除vector中的元素
  • 调用之后size变为0,capacity不变
void clear();

crbegin

返回指向最后一个元素的const迭代器

const_reverse_iterator crbegin() const;

crend

返回指向第一个元素前面一个位置的迭代器

const_reverse_iterator crend() const;

data

返回指向第一个元素的指针,不提供范围检查(使用时要小心)

const_pointer data() const;
pointer data();

empty

vector为空返回true,否则返回false
bool empty() const;

end

返回vector最后一个元素的后一个位置的迭代器

iterator end();
const_iterator end() const;

erase

  • 从指定位置删除元素
  • 返回操作之后的vector的第一个元素的位置
  • 时间复杂度为o(n)
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

front

  • 返回vector中第一个元素的引用
  • 若vector为空,返回值不确定
reference front();
const_reference front() const;

insert

返回的迭代器指向新插入的元素

iterator insert(const_iterator position, const Type& value);
iterator insert(const_iterator position, const Type&& value);
void insert(const_iterator position, size_type count, const Type& value);

template <class InputIterator>
void insert(const_iterator position, InputIterator first, InputIterator last);

max_size

  • 返回vector最大可取长度
  • 取决于系统内存容量
size_type max_size() const;

pop_back

删除末尾元素

void pop_back();

push_back

在尾部添加元素

void push_back(const T& value);
void push_back(T&& value);

rbegin

返回反向第一个元素

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

rend

返回反向最后一个元素的后一个位置

const_reverse_iterator rend() const;
reverse_iterator rend();

reserve

  • 预留长度
  • 不会影响size,如果reserve小于size则什么都不做
  • 如果capacity已经足够大,则什么都不做
void reserve(size_type count);

resize

为vector指定新的大小

void resize(size_type new_size);
// value表示新插入的元素值
void resize(size_type new_size, Type value);

shrink_to_fit

放弃额外容量

void shrink_to_fit();

size

返回vector中的元素数量

size_type size() const;

swap

交换两个vector中的元素

// 不需要显示指定分配器
void swap(vector<Type, Allocator>& right);
friend void swap(vector<Type, Allocator>& left, Allocator>& right);

运算符

operator[]

  • 返回指定位置元素的引用,
  • 如果访问越界发生错误,没有at安全
reference operator[](size_type position);
const_reference operator[](size_type position) const;

operator=

vector& operator=(const vector& right);
vector& operator=(vector&& right);

operator==

时间复杂度为o(n)

bool operator==(const vector<Type, Allocator>& left, const vector<Type, Allocator>& right);

标签:总结,const,iterator,STL,void,元素,vector,size
From: https://www.cnblogs.com/cscpp/p/18197235

相关文章

  • 「比赛总结」CF Round 834 Div.3 比赛总结
    比赛链接最后AC了\(6\)题。首先开局拼手速过了前三题。然后一眼没有瞪出来D,就写了个随机化,然后交上去发现TLEontest#3,发现随机化的时候阙值取太大了,然后就把阙值改小了,然后交上去发现WAontest#3,这也太不牛了吧!于是赶紧跳了。然后看到E,这不是个傻逼题吗?严格小于......
  • 借一道流量取证题总结一下空白密文的解码姿势
    引言公司内部培训的一道题目,比较有意思,主要是复习一下空白密文的解码思路,算是脑洞的一种;流量取证的常规做法,还有AES的一段往事......题目┌───────────────────────────────────────────────────┐│......
  • 最近参加面试的一个总结
    多线程的理解thread和task的区别委托和事件的区别IOC的概念以及优劣势反射的基本概念以及优劣势aop的概念以及使用场景装箱拆箱的基本概念?如何优化装箱拆箱DI依赖注入的生命周期概念以及使用场景一个系统如果不能写入cookie,然后要通过其他怎么授权?微信扫描登录是如何授权的什么时......
  • Redis总结
    【一】redis基础【二】python连接redis【三】Redis连接池【四】redis之字符串【五】redis之哈希类型【六】redis之list类型【七】redis通用操作【八】django中使用redis......
  • 学习imx6dl遇到的困难总结 持续更新 很痛也很傻
    最近进了新公司开始鼓捣imx6,虽然说之前弄过imx8的应用层,但是底层移植完全不一样简直太无助了。首先介绍下故事背景,拿到一个imx6dl的板子,是基于飞凌的板子改的。网上资料又少,一无所知的我开始了踩坑之路。拿到板子和一套飞凌板子送的源码,本以为是简单的uboot移植,还是厂家给的代码......
  • 视觉定位引导算法相关总结
    1#region===========================两个相机=============================================2publicstaticdouble[]TwoPointLine(doublePoint1X,doublePoint1Y,doublePoint2X,doublePoint2Y)3{4double[]TwoPointPars=newdouble[3];......
  • 敏捷冲刺-总结
    敏捷冲刺-Day-08-阶段总结所属课程软件工程2024作业要求团队作业4—项目冲刺作业目标完成Scrum冲刺总结冲刺日志集合贴https://www.cnblogs.com/YXCS-cya/p/181788031.项目燃尽图1.1第八日-5月13日进度项目收尾2.会议记录2.1会议主题第8天......
  • RediSearch的简单使用与总结
    前言之前就有考虑过想要研究下RediSearch,号称高性能全文索引的功能,这几天闲来无事调研了一番。RediSearch介绍RediSearch是RedisLabs提供的一款强大且高效的搜索和全文索引引擎。它是一个基于Redis的模块,允许用户在Redis数据库中进行复杂的搜索和全文检索操作,而无需将......
  • 反思与总结
    贡献值低的反思与总结贡献值低我觉得首要原因是我的拖延症,在冲刺阶段并没有全身心的投入到开发app的过程中,总想着能拖一天拖一天,逃避问题而不去面对它——而不去面对就永远没有解决问题的机会,不是吗?道理都懂,却缺乏行动,只有每到快要逾期时才能使我开始仓皇行动起来——拖延,......
  • 第一阶段自我总结
    在第一阶段冲刺过程中,我对自己在团队中的表现进行了深入的反思和总结。我发现了一些导致我贡献值较低的原因,并确定了下次冲刺中需要改进的目标和计划。首先,我意识到自己在新学期学习新内容的速度较慢。这导致了我在实际项目中的应用能力不足,影响了我在团队中的贡献。我发现自己在......