C++ STL之vector用法总结

  • 1.vector是可变大小数组的序列容器
  • 2.像数组一样,vector也采用连续储存空间来储存元素,就是说可以采用下标
  • 对数组进行访问,大小可变,会被容器自动处理
  • 3.本质讲,vector使用动态分配数组来存储它的元素。
  • 当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。
  • 其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,
  • 这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,
  • vector并不会每次都重新分配大小。
  • 4.与其它动态序列容器相比(deques, lists and forward_lists),
  • vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。
  • 对于其它不在末尾的删除和插入操作,效率更低。
  • 比起lists和forward_lists统一的迭代器和引用更好。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
//vector的声明及初始化

  1. vector<int> vec; //声明一个int型向量
  2. vector<int> vec1(); //声明一个初始大小为5的int向量
  3. vector<int> vec2(, ); //声明一个初始大小为10且值都为1的向量
  4. vector<int> vec3(vec1); //声明并用vec1向量初始化vec3向量
  5. vector<int> tmp(vec2.begin(), vec2.begin() + ); //用向量vec的第0个到第二个初始化tmp
  6. int arr[] = { ,,,, };
  7. vector<int> vec4(arr, arr+); //将arr数组的元素用于初始化vec向量
  8. //说明::::不包括arr[4]元素,末尾指针都是指结束元素的下一个元素
  9. //为了和vec.end()指针统一
  10. vector<int> vec5(arr, &arr[]);

//vector基本操作
//1.容量
/*
向量大小:vec.size()
向量最大容量:vec.max_size()
更改向量大小: vec.resize()
向量真实大小: vec.cappcity()
向量判空: vec.empty()
减少向量大小到满足元素所占储存空间的大小 : vec.shrink_to_fit();
*/

测试代码

  1. void main() {
  2. cout << vec4.size() << ends <<vec4.capacity() <<ends<<vec.max_size()<< endl;
  3. cout << vec4.empty() << endl; //空为1,非空为0
  4. cout << vec.empty() << endl;
  5. vec.push_back();
  6. for (int i = ; i < ; i++)
  7. {
  8. vec.push_back(i);
  9. }
  10. cout << vec.size() << ends << vec.capacity() << endl;
  11. vec.shrink_to_fit();
  12. cout << vec.capacity() << endl;
  13. for(int i=;i<vec4.size();i++)
  14. cout << vec4[i] << endl;
  15. for (int i = ; i<vec5.size(); i++)
  16. cout << vec5[i] << endl;
  17. }

//2.修改
/*
多个元素赋值: vec.assign() //类似与初始化时用数组赋值
末尾添加元素:vec.push_back()
末尾删除元素 vec.pop_back()
任意位置插入元素 vec.insert()
任意位置删除元素: vec.erase()
交换两个向量元素 vec.swap()
清空向量元素 vec.clear()
*/

测试代码

  1. int main() {
  2. int i;
  3. vec2=vec4; //vector可以直接用另一个赋值;
  4. for (i = ; i < vec2.size(); i++) {
  5. cout << vec2[i] << endl;
  6. }
  7. cout << vec2.size() << ends << vec2.capacity() << endl;
  8. //vector assign() 的三种用法
  9. vec2.assign(,); //3个7
  10. vec2.assign(arr, arr + ); //迭代器 数组名 0 1 2 不包括arr+3
  11. vec2.assign({ ,, }); //无名数组的方法进行赋值
  12. //vector insert()函数的三种用法
  13. vector<char> avector;
  14. for (int i = ; i < ; i++) {
  15. avector.push_back(i + );
  16. }
  17. avector.insert(avector.begin(), , 'C');// 1. 在指定loc 前插入val元素,返回指向这个元素的迭代器
  18. avector.insert(avector.begin() + , ); //2. 在指定位置loc前插入num个值为val的元素
  19. avector.insert(avector.begin()+,avector.begin(),avector.end()); //3.在指定位置loc前插入区间(start,end) 的所有元素
  20. vector<char>::iterator it = avector.begin();
  21. for (; it != avector.end(); it++) {
  22. cout << *it << ends;
  23. }
  24. cout << endl;
  25.  
  26. //vector erase()函数的用法
  27. //earse的返回值是返回被删除元素向后的一个元素
  28. //vector中erase的作用是删除掉某个位置position或一段区域
  29. //(begin, end)中的元素,减少其size。
  30. for (it = avector.begin(); it != avector.end();) {
  31. it = avector.erase(it);
  32. }
  33. for (; it != avector.end(); it++) {
  34. cout << *it << ends;
  35. }
  36. cout << endl;
  37. //vector swap()用法
  38. cout << tmp.size() << ends << tmp.capacity() << endl;
  39. tmp.erase(tmp.begin()+);
  40. cout << tmp.size() << ends << tmp.capacity() << endl;
  41. tmp.swap(vec);
  42. cout << tmp.size() << ends << tmp.capacity() << endl;
  43. for (i = ; i < vec2.size(); i++) {
  44. cout << vec2[i] << endl;
  45. }
  46. vec2.shrink_to_fit();
  47. cout << vec2.size() << ends << vec2.capacity() << endl;
  48. return ;
  49. }

//3.迭代器
/*
开始指针vec.begin()
末尾指针: vec.end()
指向常量的开始指针: vec.cbegin()
指向常量的末尾指针: vec.cend()
*/

//4.元素的访问
/*
下标访问: vec[1] //并不会检查是否越界
at方法访问: vec.at[1] //两者的区别就是at会检查是否越界,
是就会抛出out of range异常
访问第一个元素: vec.front()
访问最后一个元素: vec.back()
******* C++11的特性
返回一个指针: int*p=vec.data() // vector在内存中是一个数组,
可以返回一个指针指向这个数组
*/

测试代码

  1. int main() {
  2. vector<char> ave,ml;
  3. for (int i = ; i < ; i++) {
  4. ave.push_back(i + );
  5. }
  6. vector<char>::iterator it = ave.begin();
  7. for (; it != ave.end(); it++) {
  8. cout << *it << ends;
  9. }cout << endl;
  10. //元素翻转
  11. reverse(ave.begin(), ave.end());
  12. for (it = ave.begin(); it != ave.end(); it++) {
  13. cout << *it << ends;
  14. }cout << endl;
  15. //reverse_copy() reverse_copy(sourceBeg,sourceEnd,destBeg)
  16. //将源区间soureBeg sourceEnd 内的元素复制到以destBeg起始的目标区间
  17. //并颠倒安置次序
  18. reverse_copy(ave.begin(), ave.end(),ml.begin());
  19. //元素排序
  20. //sort(vec.begin(), vec.end());
  21. for (it = ml.begin(); it != ml.end(); it++) {
  22. cout << *it << ends;
  23. }cout << endl;
  24. return ;
  25. }

本人水平有限如有问题欢迎指出

C++STL之Vector向量详解,用法和例子 一起学习 一起加油的更多相关文章

  1. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  2. STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  3. [转]STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  4. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  5. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  6. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  7. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  8. C++ vector类详解

    转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...

  9. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

随机推荐

  1. 1.2 lambda 表达式的语法

    1.2 lambda 表达式的语法 还以上一节中的排序为例.我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示: Integer.compare(first.length(), s ...

  2. ISCC 2018 (Please give me username and password)

    做过iscc 2018之后有了很多的感触,也有更多的了解自己的不足之处,整理了一下web的wp, 为了保证各位小伙伴的阅读质量,我将会把wp以每一道题一个博文的形式写出来,希望能够帮助到你们 其中的步 ...

  3. RPC基于http协议通过netty支持文件上传下载

    本人在中间件研发组(主要开发RPC),近期遇到一个需求:RPC基于http协议通过netty支持文件上传下载 经过一系列的资料查找学习,终于实现了该功能 通过netty实现文件上传下载,主要在编解码时 ...

  4. Django web框架开发基础-django实现留言板功能

    1.创建项目 cmd  django-admin startpoject cloudms 2.创建APP cmd django-admin startapp msgapp 3.修改settings,T ...

  5. STM32学习笔记(二):GPIO口工作原理

    STM32每个IO口具有7个寄存器来控制,每个IO口都可以自由进行编程控制,我们编程实际上控制的是通过控制那7个寄存器来控制我们的IO口,我们可以通过编程控制IO口,把IO口配置成如下八种模式: 1. ...

  6. UML用法及状态图,活动图介绍

    统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制 ...

  7. DBA_OBJECTS

    类型:View Owner:SYS 内容:记录了数据库中所有的对象 字段: OWNER:对象的Owner OBJECT_NAME:对象名称 SUBOBJECT_NAME:对象的子对象名字,例如分区 O ...

  8. ConstraintLayoutDemo【约束性布局知识梳理】【基于1.1.3】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在较新版本的Android Studio中新建项目默认使用 ConstraintLayout进行布局的. ConstraintLay ...

  9. android 请求接口报错 org.apache.http.conn.HttpHostConnectException: Connection to http://192.168.1.90:9090 refused

    No Network Security Config specified, using platform defaultI/System.out: org.apache.http.conn.HttpH ...

  10. RFID和QRCODE对比

    1.技术介绍 1.1 RFID 射频识别,RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而 ...