MSVC中std :: vector :: push_back的实现

马克·尤尔丘克

我探索了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;
        }
    }

我有一个问题:是支票

如果(_Inside(_STD addressof(_Val)))

真的必要吗?此条件检查_Val是否属于此向量。例如,在以下情况下,此条件成立:

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

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

Matteo意大利

我不知道该标准是否要求进行额外的检查,但是它避免了将自身元素推入向量时可能发生的细微错误。

假设您这样做,如您的示例所示,

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MSVC中std :: vector :: push_back的实现

来自分类Dev

使用memcpy的Vector的push_back实现

来自分类Dev

std :: vector函数push_back中的奇怪段错误

来自分类Dev

std :: vector中push_back函数的奇怪语法

来自分类Dev

std :: vector :: push_back的成本是成功还是无效?

来自分类Dev

push_back期间std :: vector分段错误

来自分类Dev

关于`std :: vector :: push_back`的小数的选择

来自分类Dev

线程安全性std :: vector push_back并保留

来自分类Dev

OpenCV点的std :: vector,没有push_back方法

来自分类Dev

std::vector<>::push_back 导致 Arduino 链接错误

来自分类Dev

想要简化我的 std::vector push_back 用法

来自分类Dev

调用std :: vector :: push_back()会更改vector中的先前元素吗?

来自分类Dev

调用std :: vector :: push_back()会更改vector中的先前元素吗?

来自分类Dev

std :: vector <std :: vector <int >> push_back导致堆缓冲区溢出

来自分类Dev

将指针数组推入std :: vector中,避免使用push_back复制对象

来自分类Dev

在std :: vector push_back()和std :: map运算符中使用&&作为参数[]

来自分类Dev

使用push_back时,std :: unique_ptr是否已移入std :: vector?

来自分类Dev

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

来自分类Dev

std vector push_back':2个重载没有针对“ this”指针错误的合法转换

来自分类Dev

当push_back新元素添加到std :: vector时,C ++参考更改

来自分类Dev

为什么std :: vector :: push_back需要赋值运算符

来自分类Dev

C ++ std :: vector可以同时处理来自多线程的push_back吗?

来自分类Dev

AddressSanitizer将std :: vector <T> :: push_back标识为释放后使用堆错误的原因

来自分类Dev

std :: vector的push_back()导致奇怪的编译时错误消息

来自分类Dev

C ++ std :: vector可以同时处理来自多线程的push_back吗?

来自分类Dev

为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

来自分类Dev

OpenMP 并行区域中的 std::vector push_back 会导致错误共享吗?

来自分类Dev

为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

来自分类Dev

将 vector<char> 中的所有内容 push_back 合并为 vector<string> 的第一个元素

Related 相关文章

  1. 1

    MSVC中std :: vector :: push_back的实现

  2. 2

    使用memcpy的Vector的push_back实现

  3. 3

    std :: vector函数push_back中的奇怪段错误

  4. 4

    std :: vector中push_back函数的奇怪语法

  5. 5

    std :: vector :: push_back的成本是成功还是无效?

  6. 6

    push_back期间std :: vector分段错误

  7. 7

    关于`std :: vector :: push_back`的小数的选择

  8. 8

    线程安全性std :: vector push_back并保留

  9. 9

    OpenCV点的std :: vector,没有push_back方法

  10. 10

    std::vector<>::push_back 导致 Arduino 链接错误

  11. 11

    想要简化我的 std::vector push_back 用法

  12. 12

    调用std :: vector :: push_back()会更改vector中的先前元素吗?

  13. 13

    调用std :: vector :: push_back()会更改vector中的先前元素吗?

  14. 14

    std :: vector <std :: vector <int >> push_back导致堆缓冲区溢出

  15. 15

    将指针数组推入std :: vector中,避免使用push_back复制对象

  16. 16

    在std :: vector push_back()和std :: map运算符中使用&&作为参数[]

  17. 17

    使用push_back时,std :: unique_ptr是否已移入std :: vector?

  18. 18

    std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

  19. 19

    std vector push_back':2个重载没有针对“ this”指针错误的合法转换

  20. 20

    当push_back新元素添加到std :: vector时,C ++参考更改

  21. 21

    为什么std :: vector :: push_back需要赋值运算符

  22. 22

    C ++ std :: vector可以同时处理来自多线程的push_back吗?

  23. 23

    AddressSanitizer将std :: vector <T> :: push_back标识为释放后使用堆错误的原因

  24. 24

    std :: vector的push_back()导致奇怪的编译时错误消息

  25. 25

    C ++ std :: vector可以同时处理来自多线程的push_back吗?

  26. 26

    为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

  27. 27

    OpenMP 并行区域中的 std::vector push_back 会导致错误共享吗?

  28. 28

    为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

  29. 29

    将 vector<char> 中的所有内容 push_back 合并为 vector<string> 的第一个元素

热门标签

归档