c ++ vector如何工作

cod*_*ons 3 c++ stl

让我们说如果我有一个向量V,它有10个元素.如果我擦除第一个元素(在索引0处)v.erase(v.begin())然后使用STL向量如何处理它?

它是否会创建另一个新的向量并将元素从旧向量复制到新向量并释放旧向量?或者它是否从索引1开始复制每个元素并将元素复制到index-1?

如果我需要一次使用大小为100,000的向量,之后我不会使用那么多空间,我可以说我只需要一个大小为10的向量然后它会自动减小大小吗?(我不这么认为)

我在网上看了,只有API和教程如何使用STL库.是否有任何好的参考资料,我可以了解STL库的实现或复杂性?

Luc*_*ore 5

实际上,实现vector是可见的,因为它是一个模板,所以你可以查看详细信息:

iterator erase(const_iterator _Where)
    {   // erase element at where
    if (_Where._Mycont != this
        || _Where._Myptr < _Myfirst || _Mylast <= _Where._Myptr)
        _DEBUG_ERROR("vector erase iterator outside range");
    _STDEXT unchecked_copy(_Where._Myptr + 1, _Mylast, _Where._Myptr);
    _Destroy(_Mylast - 1, _Mylast);
    _Orphan_range(_Where._Myptr, _Mylast);
    --_Mylast;
    return (iterator(_Where._Myptr, this));
    }
Run Code Online (Sandbox Code Playgroud)

基本上,这条线

unchecked_copy(_Where._Myptr + 1, _Mylast, _Where._Myptr);
Run Code Online (Sandbox Code Playgroud)

完全按照你的想法 - 将以下元素复制(或在C++ 11中将其移动为bames53指出).

要回答你的第二个问题,不,容量不能自行降低.

算法的复杂性std可以在http://www.cplusplus.com/reference/stl/找到,如前所述,实现是可见的.

  • 要迂腐:*'vector`的实现是可见的.有多个实现. (6认同)
  • @GManNickG并且在你的迂腐中迂腐 - *所有*实现都是可见的,但它们不一定与这个相同.:)我认为这就是你的意思. (2认同)