我试图做这样的事情:
#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);
,但问题出现了,即更改后的代码可以编译,但运行时会出现段错误。
根据,段错误发生在函数do_stuff();
中。
为什么会这样?我做的更改有关系吗?我不能在这里使用reserve
吗?
vi.resize(4)
,而不是vi.reserve(4)
。然而,就像你第一段代码中的情况一样,这会不必要地初始化向量为四个0
元素。更好的方法是使用reserve()
并使用std::back_inserter
或立即使用正确的数据进行初始化。 - sbi