小心vector :: reserve?

Alc*_*ott 3 c++ vector

我试图做这样的事情:

#include <vector>
#include <algorithm>

int main()
{
    int l[] = {1,2,3,4};
    vector<int> vi(4);
    copy(l, l+4, vi.begin());

    do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以编译和运行,没有任何错误.然后我改成了这个:

int main()
{
    int l[] = {1,2,3,4};
    vector<int> vi;
    vi.reserve(4);  //different from the above code
    copy(l, l+4, vi.begin());

    do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

根据代码,我改变vector<int> vi(4);vector<int> vi; vi.reserve(4);,问题出现了,也就是说,更改的代码可以编译,但运行时会发生seg-fault.

据此gdb,seg-fault发生在功能上do_stuff();.

这是为什么?我做出的改变是否重要?我不能reserve在这里用吗?

Alo*_*ave 9

reserve()方法仅分配内存,但保留未初始化.它只影响capacity(),但size()不会改变.

如果要创建任意数量的实例,则应使用resize()分配内存的实例,并创建与传递给的参数一样多的实例resize().

  • @Alcott:如果你想`copy`插入到数组中,你可以使用`back_inserter(vi)`作为目标迭代器. (5认同)
  • @Alcott:如果你不相信Als的"大小会保持不变",那就试试吧.`vector <int> vi; vi.reserve(4); std :: cout << vi.size()<<'\n';`.它打印'0`. (3认同)