• vector容器

    vectoor是一个单口容器。

  • vector动态增长的基本原理

    当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请空间。

    vecotr这么做的原因是:vector中的元素是连续存储的,当容器中没有空间容纳新的元素,则由于元素必须连续存储以便索引访问,所以不能在内存中随便找个地方存储这个新元素,必须要开辟新的存储空间。

  • vector的data()

    之前一直没有注意到vector的data()用法,在代码片段中用到了vector的data()

memcpy( m_arrPtData.data(), arrData.data(), iLineNum * iTriggerSize * sizeof( ushort ) );

data()的函数接口如下:

      _Tp*
data() _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); } const _Tp*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); }

data()的返回值有两种,分别对应const和非const类型的指针,如:

int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(100); const int* cp = vec.data();
int* p = vec.data(); cout << *cp << endl;
cout << *p << endl;
return 0;
}

其中对于const int* cp如果有如下代码:

*cp = 100;  //error

编译器会报错:

cp不能给常量赋值

这其实也说明了const修饰的是*cp指向的内容,这个内容是不能被改变的。

一个小的DEMO如下:

int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(100); const int* cp = vec.data();
int* p = vec.data(); cout << *cp << endl;
cout << *p << endl;
*p = 2; cout << vec[1] << endl;
cout << *cp << endl;
cout << *p << endl;
return 0;
}
  • vector的resize()和reserve()用法及区别

出错的代码片段:

void Net_Operator::Net_UDP_GetNaviData( std::vector<Nav1>& arrNavi1, std::vector<Nav2>& arrNavi2 )
{
int iSize = m_arrNavi1_b.size();
arrNavi1.resize( iSize );
memcpy( arrNavi1.data(), m_arrNavi1_b.data(), iSize * sizeof( Nav1 ) ); iSize = m_arrNavi2_b.size();
arrNavi2.reserve( iSize );
memcpy( arrNavi2.data(), m_arrNavi2_b.data(), iSize * sizeof( Nav2 ) );
}

其中arrNavi2.reserve( iSize );的正确写法是arrNavi2.resize( iSize );

出错原因如下:

首先有代码调用上面的Net_UDP_GetNaviData()函数

        std::vector<Nav1> arrNavi1;
std::vector<Nav2> arrNavi2;
m_moudelNet.Net_UDP_GetNaviData( arrNavi1, arrNavi2 );

注意这里的arrNavi1arrNavi2这两个vector类型的变量,其capacity都是0,size也是0,在Net_UDP_GetNaviData()函数中,arrNavi2.reserve( iSize );只是改变了arrNavi2的cacapacity,但是没有改变其size,导致后面的memcpy执行的时候,并没有把m_arrNavi2_b.data()中的内容拷贝过去,所以arrNavi2是capacity为0的vector变量,这样也就导致后序无法读取出arrNavi2中的内容。

1.vector的capacity和size的区别

size指的是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); vector<int> ivec; qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity(); for(vector<int>::size_type ix = 0;ix != 24;++ix)
{
ivec.push_back(ix);
} qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity(); ivec.reserve(50); qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity(); return a.exec(); }

运行结果为:

ivec容器的当前状态如下图:

2.resize()和reserve()的区别

reserve是容器预留空间,但在空间内不真正创建元素对象,所以没有在添加新的对象之前,不能引用容器中的元素。

resize是改变容器的大小,且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了。

vecto容器中一些没有注意到的地方的更多相关文章

  1. 在Linux和Windows的Docker容器中运行ASP.NET Core

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...

  2. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  3. 在docker容器中安装和使用,linux版的powershell

    powershell 传教士 原创文章.始于 2016-09-18 ,2016-10-27修改powershell docker官网.允许转载,但必须保留名字和出处,否则追究法律责任 1 在任意版本的 ...

  4. 丙申年把真假美猴王囚禁在容器中跑 ASP.NET Core 1.0

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  5. spring:如何用代码动态向容器中添加或移除Bean ?

    先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F ...

  6. Spring 在web 容器中的启动过程

    1.对于一个web 应用,其部署在web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主环境 2.在web. ...

  7. 从Spring容器中获取Bean。ApplicationContextAware

    引言:我们从几个方面有逻辑的讲述如何从Spring容器中获取Bean.(新手勿喷) 1.我们的目的是什么? 2.方法是什么(可变的细节)? 3.方法的原理是什么(不变的本质)? 1.我们的目的是什么? ...

  8. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

随机推荐

  1. SQL Server新老版本CE区别

    对比CE7和2014 CE12的区别: 1.表连接中连接列估算方式 老CE对所有参与连接列的统计信息step进行逐个估算.新CE只对于最大和最小step统计信息进行收集估算,在连接列的值分布不均匀的时 ...

  2. 通过同步上下文方式更新winform中的控件信息

    SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...

  3. 服务器端-W3Chool:服务器脚本教程

    ylbtech-服务器端-W3Chool:服务器脚本教程 1.返回顶部 1. 服务器脚本教程 从左侧的菜单选择你需要的教程! SQL SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您 ...

  4. eclipse下 hibernate逆向数据库操作示例!!

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

  5. hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败

    在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @Resp ...

  6. flex 判断对象的类型

    在判断flex对象的类型之前,首先是获取对象类型,获取的方式有: mx.utils.NameUtil.getUnqualifiedClassName(object:Object):String  // ...

  7. 我在DBGridEh增加一栏复选框及对应操作的解决方案

    最近客户有个需求,要求对单据列表里指定的单据进行批量审核,很自然的,我想到了在DBGridEh增加一栏复选框的列,审核时遍历所有单据,将打了勾的单据审核就可以了.查阅了网上很多文章,不外有2个方案,1 ...

  8. 算法初级(scala)

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum 1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为 ...

  9. Vue中使用JSX语法

    一 项目结构 二 App组件 <template> <div id="app"> <fruit/> </div> </temp ...

  10. Web测试常用的链接测试工具

    1.Xenu Link Sleuth 详细解说地址:http://home.snafu.de/tilman/xenulink.htm http://pan.baidu.com/s/1qY3Tp4C(英 ...