热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C++vector使用的一些注意事项

这篇文章主要给大家介绍了关于C++vector使用的一些注意事项,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

1. 初始化

       c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如:

         std::vector vecTest1(5);         //初始化5个元素,每个都是0

         std::vector vecTest2{ 5 };       //初始化1个元素,值是5

 

2.  添加元素:push_back

       通过push_back添加新的元素进入vector后,vector的内存有时候会发生变化,这取决于size和capacity大小,当然这些都是系统来处理的,详细可以参考stl源码

        当size

        当size==capacity的时候,会重新申请另外一块内存,然后copy过去加到尾部,这个时候就会有变化了。

        对于stl的容器,都有成员:

                 begin()  //起始位置

                 end() //结束位置

                 size() //当前大小

         capacity() //当前容量,即已申请的内存大小

     vector是一段连续的内存空间,有三个标识内存的位置,start,end,finish, size=end-start, capacity=finish-start

     很多时候在使用vector的时候,会看到size=capacity,这个时候直接添加元素到尾部,内存明显是不够的,此时会重新在别处分配一块大小足够

     有时候也有size

std::cout <<"vecNum push back init" < vecNum(5);
std::cout <<"vecNum addr: " <<&vecNum <

3. 关于earse和remove

     erase返回的是当前删除的元素的一下个位置的迭代器,所以需要注意的是遍历时候的++运算,这个与其它list,map差不多,

    需要注意的earse后内存并未真正的清空,仅仅是删除内容,真正的容量大小capacity并没有改变,需要通过swap来实现capacity的减小

     全部清空可以考虑:vector().swap(vecNum);

auto itor = vecNum.begin();
for( ; itor != vecNum.end(); )
{
 auto num = *itor;
 if(num == 60)
 {
 itor = vecNum.erase(itor);
 break;
 }
 else
 {
 itor++;
 }
}

 std::cout <<"after erase element 60:" <(vecNum).swap(vecNum); //将vecNum的内存空洞清除
 printVector(vecNum);

      //remove只是通过迭代器的指针向前移动来删除,将不需要删除的元素往前移,因此需要删除的就都在尾部了

      //返回新的指向尾部需要删除的元素的迭代器

      因此还是得配合earse来使用,所以一般真要删除,建议直接遍历使用earse

auto itor = remove_if(vecNum.begin(), vecNum.end(),[](int x)->bool{ return x == 20; });
//or
//auto itor = remove(vecNum.begin(), vecNum.end(),20);
 
//通过erase删除
vecNum.erase(itor, vecNum.end());

4. 关于vector  -- 慎用

       出处: https://www.jb51.net/article/167636.htm

       vector 并不是一个STL容器,不是一个STL容器,不是一个STL容器!

       首先vector 并不是一个通常意义上的vector容器,这个源自于历史遗留问题。

早在C++98的时候,就有vector这个类型了,但是因为当时为了考虑到节省空间的想法,所以vector里面不是一个Byte一个Byte储存的,它是一个bit一个bit储存的!

因为C++没有直接去给一个bit来操作,

    所以用operator[]的时候, 正常容器返回的应该是一个对应元素的引用,

   但是对于vector实际上访问的是一个”proxy reference”而不是一个”true reference”,返回的是”std::vector:reference”类型的对象。

   因此,使用auto自动类型推导时会出现问题

//vector慎用
	vector vecBool = { false, true, false };
	bool test1 = vecBool[0]; 
	auto test2 = vecBool[1];
	test1 = true; //test1的初始化它其实暗含了一个隐式的类型转换(直接对vecBool[0]赋值会修改vecBool中的值,但是对test1不会)
	test2 = false; //test2它的类型并不是bool,而是一个vector中的一个内部类,而此时如果修改test2的值,vecBool中的值也会跟着修改
	auto index = 0;
	for (auto i : vecBool)
	{
 cout <<"vecBool[" <

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 通过马老师的视频学习了Java中的容器相关内容,包括Collection、Set、List、Map及其常见实现类,并深入了解了这些容器的基本操作方法。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 解决ASP.NET网站在IIS上无法访问的问题
    探讨常见的ASP.NET网站部署问题及其解决方案,特别是在IIS环境下无法访问网站元数据库的情况。 ... [详细]
  • 本文介绍了如何将两个线性表LA和LB合并为一个线性表LA,并确保LA包含所有唯一元素。此外,还详细讲解了有序线性表的合并方法,确保合并后的线性表LC中的元素按非递减顺序排列。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • 本文介绍了一种通过设置主题(Theme)来实现快速启动的Android引导页,并详细说明了如何避免因不同屏幕分辨率导致的图片拉伸问题。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • WPF MVVM: 动态添加控件与数据绑定的最佳实践
    本文介绍如何在WPF应用程序中使用MVVM模式动态添加控件并进行数据绑定。通过示例展示如何创建一个虚拟键盘,其中包含多个按键。 ... [详细]
  • Encountering frequent mismatches during Terraform apply operations, particularly with resource attributes. ... [详细]
  • Python Matplotlib 绘制折线图示例
    本文提供了一个详细的 Python 代码示例,展示如何使用 Matplotlib 库绘制折线图,包括设置图像尺寸、背景色、分辨率、标题、坐标轴标签、刻度、图例和注释等。 ... [详细]
  • Spring Boot与Graylog集成实现微服务日志聚合与分析
    本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
author-avatar
阿朵爸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有