许多问题/答案告诉我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]
返回有效值?
答案 0 :(得分:0)
与往常一样,未定义的行为,您的编译器可能产生您可能认为合理/好的&#34;行为,但事实上你正在看到&#34;很好&#34;行为并不意味着你正在做的事情是可以的!当你在任何其他机器上编译和/或运行它时,任何新版本的编译器都可能随时改变这种行为或操作系统,或者在不同的月相期间重新运行程序时。
答案 1 :(得分:0)
根据定义&#34;未定义的行为&#34;表示您在执行该行时看到的结果未定义,并且可以/将随着不同的运行而改变。
这只是我的编译器(g ++ v5.2.0)给了我undefined,但很好, 行为?
好的行为可以是你正在编译的版本中如何实现std :: vector以及程序执行时的内存状态。编译器在显示&#34;良好行为方面几乎没有任何作用#34;。
一行回答:你注意到的确是未定义的行为。运行时可以自由地提供任何输出/行为,包括在击中UB时从显示器中射出猴子。