我试图做这样的事情:小心矢量::储备?
#include <vector>
#include <algorithm>
int main()
{
int l[] = {1,2,3,4};
vector<int> vi(4);
copy(l, l+4, vi.begin());
do_stuff();
}
上面的代码可以编译,没有任何错误运行。然后,我把它改为这个:
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();
}
根据代码,我改变vector<int> vi(4);
为vector<int> vi; vi.reserve(4);
,但问题就来了,那就是改变的代码可以编译,但在运行时出现赛格故障。
根据gdb
,seg-fault发生在函数do_stuff();
中。
这是为什么?我做出的改变是否重要?我不能在这里使用reserve
吗?
你可能打算叫'vi.resize(4)',而不是'vi.reserve(4) '。但是,就像在你的第一段代码中一样,这将不必要地用四个'0'元素初始化矢量。最好'保留()'并使用'std :: back_inserter'或者立即用正确的数据初始化它。 – sbi 2012-01-31 20:11:16