MSVC和GCC之间的矢量行为不同

时间:2018-01-31 19:52:24

标签: c++ gcc

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> v;
    auto vsize = v.capacity();
    for (int tmp = 0; tmp < 1000;tmp++)
    {
        v.push_back(tmp);
        if(vsize!=v.capacity())
        {
            vsize = v.capacity();
            cout << "capacity changed : " << vsize << endl;
        }
    }
    return 0;
}

compiled by MSVC

compiled by GCC

vector的容量应该是之前的两倍,为什么MSVC不能用于此?

3 个答案:

答案 0 :(得分:6)

  

vector的容量应该是之前的两倍,为什么MSVC不能在此工作?

你从哪里得到的?

这是特定于实现的行为。标准中没有任何内容在调用capacity()之后push_back()应该如何更改,除此之外必须保证std::vector (不是 double >比之前分配的空间。

答案 1 :(得分:1)

  

vector的容量应该是之前的双倍

那是错的。唯一的要求是vector::push_back执行摊销的O(1)副本。这可以通过每次需要重新分配时将容量乘以常数因子来实现 - 但该常数不必是2(它必须大于1)。 GCC使用2,MSVC使用3/2。 (后者的优点是它占用的空间更少,代价更多)

答案 2 :(得分:0)

&#34;向量的容量应该是之前的双倍&#34;。不,不应该。 std::vector增加容量的方式和数量是实现定义的

这意味着每个实现都可以自由地执行。它可以使尺寸加倍,增加2倍,增加10倍或者其他。从您的角度来看,作为容器的用户,您无法知道,也不应该关心。