std :: vector <t> :: resize(n)vs reserve(n)with operator []

时间:2015-10-13 04:41:14

标签: c++ c++11 vector language-lawyer

许多问题/答案告诉我std::vector<T>::resize(n)会增加容量和尺寸,而std::vector<T>::reserve(n)只会增加容量。

一个例子是Choice between vector::resize() and vector::reserve()

该问题中的评论表明在使用reserve(n)后,使用

vec[i less than n] = ..

是未定义的行为,并且声称提供的许多示例会导致段错误。

编译运行时

#include <vector>
#include <iostream>

void f(const std::vector<double> &s) {
    std::cout << "s.size() = " << s.size() << std::endl;
    std::cout << "s.capacity() = " << s.capacity() << std::endl;
}

int main() {
    std::size_t n = 20121;

    std::vector<double> a;
    a.reserve(2*n);
    a[n] = 2.5;
    std::cout << "a["<<n<<"] = " << a[n] << std::endl;
    f(a);

    std::vector<double> b;
    b.resize(2*n);
    b[n] = 2.5;
    std::cout << "b["<<n<<"] = " << b[n] << std::endl;
    f(b);
}

我的输出是

  

a [20121] = 2.5

     

s.size()= 0

     

s.capacity()= 40242

     

b [20121] = 2.5

     

s.size()= 40242

     

s.capacity()= 40242

问题:

是否有变化使这个好吗?这只是我的编译器(g++ v5.2.0)给了我未定义但很好的行为吗?

作为第二点好奇心,为什么f(a)告诉我大小为0(猜测答案:没有push_back次调用),即使a[n]返回有效值?

2 个答案:

答案 0 :(得分:0)

与往常一样,未定义的行为,您的编译器可能产生您可能认为合理/好的&#34;行为,但事实上你正在看到&#34;很好&#34;行为并不意味着你正在做的事情是可以的!当你在任何其他机器上编译和/或运行它时,任何新版本的编译器都可能随时改变这种行为或操作系统,或者在不同的月相期间重新运行程序时。

答案 1 :(得分:0)

根据定义&#34;未定义的行为&#34;表示您在执行该行时看到的结果未定义,并且可以/将随着不同的运行而改变。

  

这只是我的编译器(g ++ v5.2.0)给了我undefined,但很好,   行为?

好的行为可以是你正在编译的版本中如何实现std :: vector以及程序执行时的内存状态。编译器在显示&#34;良好行为方面几乎没有任何作用#34;。

一行回答:你注意到的确是未定义的行为。运行时可以自由地提供任何输出/行为,包括在击中UB时从显示器中射出猴子。