我試圖做這樣的事情:小心矢量::儲備?
#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