加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在VS2010中的vector :: insert执行意外结果

发布时间:2020-12-16 09:45:24 所属栏目:百科 来源:网络整理
导读:我偶尔会在VS2010中发现一个奇怪的问题,下一个代码: void Test1(){ std::vectorint 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];
我偶尔会在VS2010中发现一个奇怪的问题,下一个代码:

void Test1()
{
    std::vector<int> 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<int> 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中给出了预期的结果和性能.

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

解决方法

insert通过引用获取第二个参数. op []也提供了参考. 调用insert会使引用无效,因此您有未定义的行为,任何事情都可能发生.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读