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

c – 在MSVC中实现std :: vector :: push_back

发布时间:2020-12-16 09:53:13 所属栏目:百科 来源:网络整理
导读:我探索了msvc 2013 STL实现,发现了std :: vector :: push_back的实现: void push_back(const value_type _Val) { // insert element at end if (_Inside(_STD addressof(_Val))) // -- is this check really necessary? { // push back an element size_typ
我探索了msvc 2013 STL实现,发现了std :: vector :: push_back的实现:

void push_back(const value_type& _Val)
    {   // insert element at end
    if (_Inside(_STD addressof(_Val))) // <-- is this check really necessary?
        {   // push back an element
        size_type _Idx = _STD addressof(_Val) - this->_Myfirst;
        if (this->_Mylast == this->_Myend)
            _Reserve(1);
        this->_Getal().construct(this->_Mylast,this->_Myfirst[_Idx]);
        ++this->_Mylast;
        }
    else
        {   // push back a non-element
        if (this->_Mylast == this->_Myend)
            _Reserve(1);
        this->_Getal().construct(this->_Mylast,_Val);
        ++this->_Mylast;
        }
    }

我有一个问题:是检查

if (_Inside(_STD addressof(_Val)))

真的有必要吗?此条件检查是_Val是否属于此向量.例如,在以下情况下,这种情况属实:

std::vector<int> v(1);
v.push_back(v[0]);

相同向量的元素的push_back与其他值有什么区别?

解决方法

我不知道标准是否规定了额外的检查,但它避免了一个微妙的错误,如果你将一个元素推入一个元素本身就会发生.

假设你这样做,如你的例子,

std::vector<int> v(1);
v.push_back(v[0]);

在不执行该检查的实现中.现在,如果向量的容量大于1,一切都很好,v [0]只是在正确的位置复制构造.

但是如果向量必须重新分配会发生什么?在这种情况下,传递给push_back的对v [0]的引用在重新分配之后就会失效,因此push_back将尝试在向量内部复制一个不再存在的对象.

您发布的实现中的代码通过检查引用是否指向向量内的元素来避免问题,在这种情况下,它会记录其索引.重新分配后,即使引用无效,索引仍然正确,因此可以无风险地执行复制.

(编辑:李大同)

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

    推荐文章
      热点阅读