我偶尔会在VS2010中发现一个奇怪的问题,下一个代码:

void Test1()

{

std::vector vec;

vec.push_back(10);

vec.push_back(20);

vec.insert(vec.end(),vec[0]);

// GCC: vec == [10,20,10];

// VS2005: vec == [10,10];

// VS2010: vec == [10,-17891602];

}

看起来,vector会在读取新值之前重新分配内存并删除旧内存,从而导致复制损坏的值.此问题出现在VS2010中.在VS2005和GCC中检查 – 确定.

传递给insert()从operator []或front()/ back()方法获取的引用是否有效?

UPD:根据以下评论做了一些调查,我得出结论,因为性能,使用reserve()不是一个好主意.它导致不必要的大量重新分配.

void Test2()

{

std::vector vec,vec2;

const int count = 10000;

int prevCap = 0,reallocCount = 0;

int prevCap2 = 0,reallocCount2 = 0;

for (int i = 0; i < count; ++i)

{

if (vec.size() >= vec.capacity())

{

vec.reserve(vec.size()+1);

}

vec.insert(vec.end(),i);

vec2.insert(vec2.end(),i);

const int cap = vec.capacity();

const int cap2 = vec2.capacity();

if (prevCap != cap) ++reallocCount;

prevCap = cap;

if (prevCap2 != cap2) ++reallocCount2;

prevCap2 = cap2;

}

cout << reallocCount << " " << reallocCount2 << endl;

// reallocCount == 10000,reallocCount2 == 15 GCC

}

所以现在我只有两个选择:

1)使用临时变量

const int tempValue = vec[0];

vec.insert(vec.end(),tempValue);

但是我不确定编译器是否可以通过某些优化来删除tempValue.

2)使用push_back(0)和进一步的pop_back()调用

vec.push_back(0);

vec.pop_back();

vec.insert(vec.end(),vec[0]);

这种方法似乎更好,它在VS2005 / 2010和GCC中给出了预期的结果和性能.

我错过了什么?有更好的解决方案吗?

c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果相关推荐

  1. 【C++】39. std::ofstream把程序中的中的变量值存储到文件中

    更详细的介绍请参考C++ ofstream和ifstream详细用法 在c++代码中,我们通常可以使用类似std::cout的方法打印变量值.如果想把这些变量值存储到文件中保存起来,可以使用std:: ...

  2. android活动中的变量,在不同的活动中保持变量值Android Studio

    我的应用程序中有选项卡式活动.在每个标签页中,我都有一个(切换)按钮,可以通过单击切换到打开和关闭.当我移动到另一个标签并回到相同的位置时,它就会熄灭.我想保持它的价值,以便在切换到其他活动时不会改变 ...

  3. 怎么对jdk核心包进行跟踪调试,并查看调试中的变量值

    java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而却存在如下两个问题. a.debug时查看变量十分麻烦 ...

  4. 【Visual Studio】如何在VS 2012中打印变量值到输出窗口

    1.在调试程序时,想要输出某个变量的值到vs的输出窗口,而不是通过添加断点,每次调试时,一步一步的看变量的值,很麻烦,用console.writeline(str);是不行的,这个命令只能用在控制台应 ...

  5. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  6. pythontk界面显示函数中的变量值_简单易学,西门子触摸屏3种修改变量值的方法!博图Wincc V14组态...

    应条友要求,今天分享3种修改触摸屏变量值的最常用方法! 全文约700字,通读4分钟! 看完本章,你将收获以下内容: 一:必会知识点:3种修改变量的方法及适用点 二:实例:3种方法修改触摸屏变量值 三: ...

  7. python pdb查看变量值_使用Python中PDB模块中的命令来调试Python代码的教程

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...

  8. java中label数值_java – 如何在JLabel中显示变量值

    我是 Java编程的新手.我想在输出窗口中显示我的变量的值,而不是在控制台视图中. 代码如下: import java.awt.BorderLayout; import javax.swing.JFr ...

  9. python返回函数值并退出函数_如何在python的阻塞的函数中获取变量值

    目前是使用C++嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数,可以获取到收到的消息 所以要怎么样来返回消 ...

最新文章

  1. 【RocketMQ工作原理】消息堆积与消费延迟
  2. WCF for .NET CF的一个应用及两个困惑的问题
  3. Linux CentOS 修改服务器主机名hostname
  4. 第32讲:实时处理利器 mitmproxy 的使用
  5. springboot 页面下载文件 网页下载文件功能 文件放resourcce下面
  6. EM算法最完整易懂讲解
  7. C++_类和对象_对象特性_构造函数和析构函数---C++语言工作笔记040
  8. 11月13日上午ajax返回数据类型为JSON数据的处理
  9. 笔记本显示服务器,如何将笔记本电脑用作无头服务器的键盘,显示器和鼠标
  10. 操作系统笔记-信号量机制
  11. 2022年嵌入式系统设计师考试大纲
  12. 基于二值距离变换的图像细化的代码实现
  13. 第五部分 linux 按键驱动代码分析
  14. 构建新型现代化智慧博物馆之物联网环境监控方案
  15. sql删除数据的3种方法
  16. 网站TDK的设置方法-怎么合理的设置网站的TDK
  17. 服务器win系统更新如何设置,Windows服务器更新服务的配置
  18. 地瓜叶:高纤高铁多 ,全身是宝
  19. 魅蓝note6的android怎么升级,魅蓝note6怎么把应用安装到sd卡
  20. 深圳软件测试培训:刚入行的软件测试工程师如何自学软件测试?

热门文章

  1. 关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法 - 转
  2. re.findall 两个连续匹配成功的输出后一个
  3. C++ 与 JAVA的不同点
  4. oracle创建分区表
  5. leetcode 54. 螺旋矩阵
  6. 为什么 Python被Google选为TensorFlow的开发语言呢?使用 Python比C++语言进行机器学习有什么优势?
  7. 台式机安装系统时区分BIOS与UEFI
  8. linux操作系统的特点包括什么,什么是Linux操作系统?有哪些主要特点?
  9. audio 上一首 下一首 自定义样式_总有一首网易云,藏着你忘不掉的人。
  10. java 按钮文字_java Button中的标签怎样显示汉字?