c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
我偶尔会在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执行意外结果相关推荐
- 【C++】39. std::ofstream把程序中的中的变量值存储到文件中
更详细的介绍请参考C++ ofstream和ifstream详细用法 在c++代码中,我们通常可以使用类似std::cout的方法打印变量值.如果想把这些变量值存储到文件中保存起来,可以使用std:: ...
- android活动中的变量,在不同的活动中保持变量值Android Studio
我的应用程序中有选项卡式活动.在每个标签页中,我都有一个(切换)按钮,可以通过单击切换到打开和关闭.当我移动到另一个标签并回到相同的位置时,它就会熄灭.我想保持它的价值,以便在切换到其他活动时不会改变 ...
- 怎么对jdk核心包进行跟踪调试,并查看调试中的变量值
java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而却存在如下两个问题. a.debug时查看变量十分麻烦 ...
- 【Visual Studio】如何在VS 2012中打印变量值到输出窗口
1.在调试程序时,想要输出某个变量的值到vs的输出窗口,而不是通过添加断点,每次调试时,一步一步的看变量的值,很麻烦,用console.writeline(str);是不行的,这个命令只能用在控制台应 ...
- uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...
理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客blog.csdn.net 全局作用域中,用 const 和 l ...
- pythontk界面显示函数中的变量值_简单易学,西门子触摸屏3种修改变量值的方法!博图Wincc V14组态...
应条友要求,今天分享3种修改触摸屏变量值的最常用方法! 全文约700字,通读4分钟! 看完本章,你将收获以下内容: 一:必会知识点:3种修改变量的方法及适用点 二:实例:3种方法修改触摸屏变量值 三: ...
- python pdb查看变量值_使用Python中PDB模块中的命令来调试Python代码的教程
你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...
- java中label数值_java – 如何在JLabel中显示变量值
我是 Java编程的新手.我想在输出窗口中显示我的变量的值,而不是在控制台视图中. 代码如下: import java.awt.BorderLayout; import javax.swing.JFr ...
- python返回函数值并退出函数_如何在python的阻塞的函数中获取变量值
目前是使用C++嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数,可以获取到收到的消息 所以要怎么样来返回消 ...
最新文章
- 【RocketMQ工作原理】消息堆积与消费延迟
- WCF for .NET CF的一个应用及两个困惑的问题
- Linux CentOS 修改服务器主机名hostname
- 第32讲:实时处理利器 mitmproxy 的使用
- springboot 页面下载文件 网页下载文件功能 文件放resourcce下面
- EM算法最完整易懂讲解
- C++_类和对象_对象特性_构造函数和析构函数---C++语言工作笔记040
- 11月13日上午ajax返回数据类型为JSON数据的处理
- 笔记本显示服务器,如何将笔记本电脑用作无头服务器的键盘,显示器和鼠标
- 操作系统笔记-信号量机制
- 2022年嵌入式系统设计师考试大纲
- 基于二值距离变换的图像细化的代码实现
- 第五部分 linux 按键驱动代码分析
- 构建新型现代化智慧博物馆之物联网环境监控方案
- sql删除数据的3种方法
- 网站TDK的设置方法-怎么合理的设置网站的TDK
- 服务器win系统更新如何设置,Windows服务器更新服务的配置
- 地瓜叶:高纤高铁多 ,全身是宝
- 魅蓝note6的android怎么升级,魅蓝note6怎么把应用安装到sd卡
- 深圳软件测试培训:刚入行的软件测试工程师如何自学软件测试?
热门文章
- 关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法 - 转
- re.findall 两个连续匹配成功的输出后一个
- C++ 与 JAVA的不同点
- oracle创建分区表
- leetcode 54. 螺旋矩阵
- 为什么 Python被Google选为TensorFlow的开发语言呢?使用 Python比C++语言进行机器学习有什么优势?
- 台式机安装系统时区分BIOS与UEFI
- linux操作系统的特点包括什么,什么是Linux操作系统?有哪些主要特点?
- audio 上一首 下一首 自定义样式_总有一首网易云,藏着你忘不掉的人。
- java 按钮文字_java Button中的标签怎样显示汉字?