欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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执行意外结果的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。