C++ 如何使用c++;矢量工程

C++ 如何使用c++;矢量工程,c++,stl,C++,Stl,假设我有一个向量V,它有10个元素。 如果我使用v.erase(v.begin())擦除第一个元素(在索引0处),那么STL向量如何处理这个问题 它是否创建另一个新向量,并将元素从旧向量复制到新向量,然后取消分配旧向量?还是从索引1开始复制每个元素,然后将元素复制到索引1 如果我一次需要一个大小为100000的向量,然后我就不用那么多空间,假设我只需要一个大小为10的向量,那么它会自动减小大小吗?(我不这么认为) 我在网上看了看,只有API和如何使用STL库的教程。 关于STL库的实现或复杂性,

假设我有一个向量V,它有10个元素。 如果我使用
v.erase(v.begin())
擦除第一个元素(在索引0处),那么STL向量如何处理这个问题

它是否创建另一个新向量,并将元素从旧向量复制到新向量,然后取消分配旧向量?还是从索引1开始复制每个元素,然后将元素复制到索引1

如果我一次需要一个大小为100000的向量,然后我就不用那么多空间,假设我只需要一个大小为10的向量,那么它会自动减小大小吗?(我不这么认为)

我在网上看了看,只有API和如何使用STL库的教程。
关于STL库的实现或复杂性,我有什么好的参考资料吗?

事实上,
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));
    }
完全按照您的想法执行—复制以下元素(或者像bames53指出的那样在C++11中移动它们)

回答你的第二个问题,不,容量不能自行减少

<>代码>代码> STD 的复杂性可以在上面找到,并且如前所述,实现是可见的。

< P>这是我对C++的许多反对之一。每个人都说“使用标准库”。。。但是,即使您有STL源代码(可以从许多不同的地方免费获得。在本例中,包括头文件本身!)。。。这基本上是一场难以理解的噩梦,要深入去理解它

相比之下,(C-only)Linux内核是简单明了的典范

但我们离题了:)

以下是对你问题的10000英尺答案:

向量容器实现为动态数组;一如往常 数组、向量容器的元素存储在连续的 存储位置,这意味着不能访问它们的元素 仅使用迭代器,还可以在指向 元素

但与常规数组不同,向量中的存储是可以处理的 自动,允许根据需要进行扩展和收缩

向量机擅长:

  • 通过位置索引(恒定时间)访问单个元素
  • 以任意顺序(线性时间)迭代元素
  • 从末尾添加和删除元素(固定摊销时间)
与阵列相比,它们提供了几乎相同的性能 任务,而且它们具有轻松调整大小的能力。虽然他们 处理阵列容量时,通常比阵列占用更多内存 自动(这是为了容纳额外的存储空间 未来增长)

与其他基本标准序列容器(deques和 列表),向量通常是访问时最有效的 元素,以在序列末尾添加或删除元素。 对于涉及在以下位置插入或删除图元的操作: 除了末端以外的位置,它们的表现比deques和deques差 列表,并且具有比列表更少的一致性迭代器和引用

就性能而言,重新分配可能是一项成本高昂的操作,因为 它们通常涉及向量用于存储的整个存储空间 将被复制到新位置。您可以使用成员函数 vector::reserve预先指示向量的容量。这 可以帮助优化存储空间并减少重新分配的次数 当计划进行许多扩建时

它是否从索引1开始复制每个元素,并将元素复制到索引1

是的(尽管它实际上是从C++11开始移动它们的)

它会自动缩小尺寸吗

不,减小大小通常会使现有元素的迭代器无效,这只允许在某些函数调用上使用

我在网上看了看,只有API和如何使用STL库的教程。关于STL库的实现或复杂性,有什么好的参考资料可以让我有所了解吗

<>你可以阅读C++规范,它将告诉你具体的内容和执行中的内容。您还可以查看您的实际实现

我只需要一个大小为10的向量,那么它会自动减小大小吗

不,它不会自动收缩。
传统上,将向量替换为新的空向量:

但是C++x11包含一个std::vector::shrink_to_fit(),它直接执行该操作

vector会将元素复制(在C++11中移动)到开头,这就是为什么如果要从集合的开头插入并擦除元素,就应该使用deque。如果要真正调整向量内部缓冲区的大小,可以执行以下操作:

vector<Type>(v).swap(v);
vector(v).swap(v);
这将有希望生成一个大小正确的临时向量,然后将其内部缓冲区与旧的交换,然后临时向量超出范围,大的缓冲区将被释放


正如其他人所指出的,您可以在C++11中使用
vector::shrink_to_fit()

,作者Scott Meyers,对于STL来说是一个非常好的工具。如图所示,它似乎也有帮助。总的来说。C++标准库,你可能指的是,用C++标准描述的;您可以获得最新草稿的免费副本。好吧,我想它不会用v.erase(v.begin())释放内存。无论如何,您可以使用v.capacity()来测试库是否更改了分配内存的大小。相关问题:有许多STL实现,您可以在线浏览它们的许多源代码。SGI的,GNU的,还有很多其他的。我从没想过我会看到你参考那个网站。好的方法也很复杂。学究式的:可以看到
vector
的实现。有多个实现。@GM
vector<Type>(v).swap(v);