一、 常用简单成员函数

vector::push_back(Type val) //将val添加到向量尾部
vector::pop_back()  //将最后一个元素删除
iterator vector::begin() //返回指向第一个元素的迭代器
iterator vector::end() //返回指向最后一个元素之后的迭代器
vector::clear() //删除向量,并没有释放vector,还是占有capacity个空间,如果要释放空间,可使用 swap(vector<_Ty>()).
vector::at(n)  //等效于vector[n] 返回第n个位置的引用
bool vector::empty()  //向量是否为空
Type vector::front() //返回第一个元素的引用
Type vector::back()  //返回最后一个元素的引用
vector::shrink_to_fit()  //将capacity变为和size一样大
allocator_type vector::get_allocator() //得到分配器

二、vector::size() vector::capacity() vector::max_size()

size_type size()返回的是数组的元素的个数,capacity是数组可容纳元素的个数,如果capacity的大小不够容纳插入的新元素时,vector就会从新找一个更大的连续的空间,并将之前的值赋值到新空间,释放原来的空间,所以在内存中的地址会变,这时原来的迭代器也就会失效。

经过测试,未初始化的数组capacity为0,若初始化了vector的大小则capacity一般和size相等。当capacity不够时,会按照一定的算法扩容(实测:至少扩大原来capacity的一半;如size从100→101,则capacity从100→150;但是如果一次性插入的元素超过原来的一半,则capacity会扩充到刚好,如size从100→200,则capacity从100→200)。
size_type max_size() 返回所能设置的最大capacity.

三、vector::erase()

iterator vector::erase(itrator location);
iterator vector::erase(iterator first, iterator last);

erase(itrator location)删除location位置的元素,并将之后的元素向前移动,迭代器location本身所指的内存中的位置并没有改变,但是所指位置的值变为了下一个位置的元素(因为向前移动了)
erase(iterator first, iterator last) 删除迭代器first到last之间(不包括last)的元素,并将之后的元素移动位置,执行后迭代器location指向内存中的位置没有变,指向的值变成了之前的*last。

四、vector::insert() empalce()

1. insert()

iterator vector::insert(iterator loc,const TYPE &val)
//在loc插入val,返回指向val的迭代器(迭代器指向地址不变),loc原本位置的元素及之后的元素向后移
void vector::insert(iterator loc,size_type num,const TYPE &val)
//在loc插入num个val;loc原本位置的元素及之后的元素向后移
void vector::insert(iterator loc,iterator start,iterator end)
//在loc插入区间[start,end)的所有元素,,loc原本位置的元素及之后的元素向后移

iterator vector::insert(iterator loc,const TYPE &val), 迭代器loc会指向val(因为loc本来位置的元素往后移了一次)

C++11:

iterator insert(const_iterator _Where, const _Ty& _Val) { // insert _Val at _Wherereturn emplace(_Where, _Val);}//函数重载,左值、右值引用 const左值进入此函数//这时_Val是一个const引用,传入emplaceiterator insert(const_iterator _Where, _Ty&& _Val) { // insert by moving _Val at _Wherereturn emplace(_Where, _STD move(_Val));}//函数重载,常量、表达式进入此函数//_Val是右值引用,为什么还要move?

2. emplace()

iterator emplace(const_iterator _Where, _Valty&&... _Val)
//无重载, ...表示可变参数模板,
decltype(auto) emplace_back(_Valty&&... _Val)

分别表示在iter或最后的位置插入一个元素val,iter原本位置及之后的元素依次向后移。

C++ 11对大部分容器都新加了这两个函数,其中map的使用方式比较特殊;
它们同insert和push_back的区别:最大的作用是避免产生不必要的临时变量,临时变量要申请和释放内存。如下:
(通过测试,insert会构造临时变量Foo,再将Foo拷贝给vector,再释放Foo; C++11的insert会构造临时变量Foo再调用emplace,用拷贝的方式将Foo给vector,再释放原来的Foo。而直接调用emplace在emplace函数内构造Foo,构造时的地址就在vector内,然后用移动赋值的方式将Foo交给vector);另外,vector的insert将所有类型都传入emplace进行处理,但是list的insert只将常量和表达式传入emplace处理,这种区别的原因是什么呢?)
实测:现在的insert(iterator loc,const TYPE &val) 直接调用 emplace

struct Foo {
int vali;
double vald;Foo(int n, double x):vali(n),vald(x){};
};std::vector<Foo> v;
v.emplace(someIterator, 42, 3.1416);        // 没有临时变量产生
v.insert(someIterator, Foo(42, 3.1416));    // 需要产生一个临时变量
v.insert(someIterator, {42, 3.1416});       // 需要产生一个临时变量

五、 vector::assign(iterator start, iterator end)

清除原有的数据,将迭代器[start,end)的内容赋给vector;
若原vector的capacity大于等于新数据的长度,则capacity不变,不然capacity等于新数据的长度。
可以将其他容器的迭代器的内容赋值给vector,但是数据类型最好相同,否则会相应转换

set<int> myset;
myset.insert(1);
myset.insert(3);
myset.insert(2);vector<int> myvec;
myvec.assign(myset.begin(),myset.end());
从int → float double 则会转换为相应类型
从int → char 则会转换为ASCII码,具体的 33 → '\x33' 表示字符'!'
从char → int ,例:'!' → 33

六、 vector::reserve(int n)

设置vector的capacity的大小(向系统申请连续的内存空间),如果n超过max_size(),则抛出异常。
如果n小于当前的capacity则不起作用。

七、 vector::resize()

void vector::resize(int n)
void vector::resize(int n, Type val)
重新设置vector的大小;
若n小于vector.size(),则删除[vector.begin()+n,vector.end)之间的元素;
若n大于vector.size(),则添加元素,第一个添加T(),第二个添加val。

八、vector::empalce(const iterator iter, Type val)

九、vector::data()

C++11 新加

_Ty* data()
返回指向vector首地址的指针(_Mypair._Myval2._Myfirst),使得可以直接操控vector的底层数据

十、vector::swap(vector &x)

该成员函数会在*this和x之间互相交换被控序列。如果get_allocator()==x.get_allocator(),它将在常数时间内完成交换并且不会抛出任何异常,另外,他还不会导致任何指向这两个被控序列中元素的引用、指针和迭代器无效。否则,它将以与这两个被控序列的元素个数成比例的次数调用元素的构造函数以及为元素赋值。

swap只能同类型之间进行交换。

经测试,当长度、元素类型、维度都不同时,get_allocator()==x.get_allocator()都成立,暂时没有测试出不成立的情况。

swap将所有内容都交换,包括capacity;交换后,原有的迭代器指向的内存地址没有变

十一、迭代器相关

iterator vector::rbegin()  //返回逆迭代器,指向最后一个元素 ,用++则指向倒数第二个元素
iterator vector::rend()  //返回逆迭代器,指向第一个元素的前一个位置//c++11 新加函数,将指向元素视为const,不可用获得的迭代器修改
iterator vector::cbegin()
iterator vector::cend()
iterator vector::crbegin()
iterator vector::crend();

十二、 _Unchecked_begin()

pointer _Unchecked_begin() noexcept {return _Mypair._Myval2._Myfirst;}
//返回指向首部的指针pointer _Unchecked_end() noexcept {return _Mypair._Myval2._Mylast;}
//返回指向尾部的指针(最后一个元素的后面)

十三、 分配器allocator

_Myval2_Myfirst  //指向首地址 vector.begin()返回迭代器所指向的地址_Mylast  //指向最后一个元素之后 vector.end()返回迭代器指向的地址_Myend  //指向最后分配的内存首地址(capacity的大小)。

STL vector成员函数详解相关推荐

  1. 【OpenCV3】cv::Mat类成员函数详解

    cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...

  2. CString类所有成员函数详解

    VC里CString是我们最常用的类之一,我们觉得对它很熟悉了,可是你知道它的所有用法吗? 还是系统的学习一下吧,认真看完本文就OK了. 下面开始: CString::Compare int Comp ...

  3. C++常对象,常变量,常成员函数详解(含添加内容)

    既要使数据能在一定范围内共享,又要保证它不被任意修改,可使用const. ·        用const修饰的声明数据成员称为常数据成员 ·        用const修饰的声明成员函数称为常成员函数 ...

  4. 【C++】类的6个默认成员函数详解

  5. [学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1

    一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a ...

  6. STL 之 deque容器详解

    Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...

  7. STL 之 list 容器详解

    STL之list容器详解 List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入 ...

  8. C++ STL容器 —— array 用法详解

    C++ STL容器 -- array 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别人的博客终究是 ...

  9. STL区间成员函数及区间算法总结

    STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...

最新文章

  1. 6 redhat 查看rtc时间_甜甜老师的DB Fun圈第2讲:GaussDB 100 OLTP 单机在RHEL7.6上的安装...
  2. 跨站请求伪造(CSRF)-简述
  3. 解决Extjs中Combobox显示值和真实值赋值问题
  4. wordspress-作品展示主题Muiteer2.3.7开心版主题模板
  5. SharePoint 2010认证模式
  6. Xcode 真机测试破解方法(转加修改)xcode 4.3 通过
  7. W3School 教程整理
  8. 腾讯广告X中科院计算所WWW2021论文:在线广告中的探索与优化
  9. echarts 柱状图如何不顶格_echarts柱状图如何中间对齐而不是底部对齐?
  10. Flex布局实现筛子3
  11. python练习册 每天一个小程序 第0010题
  12. 消息系统——极光推送http://docs.jiguang.cn/
  13. python自动化,微信发送信息
  14. 【11-13】A股主要指数的市盈率(PE)估值高度
  15. PS 制作 图片放大镜效果 和 鼠标点击效果
  16. html单页模板wap,单页模板html
  17. 深度学习狗图片_狗品种分类的深度学习
  18. System Extract 步骤
  19. android手机助手源代码,IOS Android 手机助手原理以及源码(cmake 构建)
  20. 可玩性低的区块链游戏存在的意义

热门文章

  1. stylus预处理入门(一)——选择器
  2. sudo mvn package后提示找不到mvn命令
  3. 无刷新跳转—关于history中pushState和replaceState方法详解
  4. 设计AHB2APB同步桥
  5. 基于MeshCNN和PyTorch的三维对象分类和分割
  6. 2022电工(初级)练习题及答案
  7. [转]战地3寒霜2引擎详解:物件光照效果技术特性
  8. Python-UnixTimeStamp
  9. 燕雀焉知鸿鹄之志?云雀也有鸿鹄志——HyperX云雀无线蓝牙耳机
  10. C++ Operator=的一些小细节