std :: vector在保留后的运算符[]上的msvc和gcc之间的行为差​​异,这是对的吗?

Zou*_*uch 5 c++

这段代码使用msvc(出界错误)失败,但似乎与gcc和clang一起工作正常.什么是正确的行为?

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    v.reserve(10);
    for (int i = 0; i < 10; ++i)
    {
        v[i] = i * 2;
    }

    for (int i = 0; i < 10; ++i)
    {
        std::cout << v[i] <<  " ";
    }
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

krz*_*zaq 7

行为未定义.reserve仅保留内存,但不影响容器的大小.也许你想用resize

std::vector<int> v;
v.resize(10);
for (int i = 0; i < 10; ++i)
{
    v[i] = i * 2;
}
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下你可以写

std::vector<int> v(10);
for (int i = 0; i < 10; ++i)
{
    v[i] = i * 2;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以reserve与以下一起使用push_back:

std::vector<int> v;
v.reserve(10);
for (int i = 0; i < 10; ++i)
{
    v.push_back(i * 2);
}
Run Code Online (Sandbox Code Playgroud)

  • @StackDanny这是另一个问题;)`reserve`保证你不会有重新分配(更正式地说:引用和迭代器不会失效),直到你达到保留的大小(可能高于你保留的,afaict). (3认同)
  • @StackDanny这意味着已为底层缓冲区分配了足够的空间来容纳至少10个元素.所以push_back(在这种情况下)不会导致重新分配. (3认同)
  • @StackDanny当你知道你将在内部插入1000个元素时,当你调用reserve时,空间将被分配一次.如果不这样做,每次内部容量没有足够的空间时都会重新分配,这需要时间.所以保留之前可以减少分配和复制操作,使代码更快. (3认同)