我寫了下面的代碼來測試一個矢量從另一個構造時的容量值。這是受到here問題的啓發。矢量的儲備()的怪異
#include <iostream>
#include<vector>
int main()
{
std::vector<int> a;
a.reserve(65536);
a[0]=10;
std::vector<int> b(a); //NOTE: b is constructed from a
std::cout<<a[0]<<" " <<b[0];
}
程序成功地編譯,但是當它運行它扔以下錯誤
Error during execution:
Segmentation Fault(core dumped).
然後檢查值初始化爲矢量,我改變了代碼如下所示:
#include <iostream>
#include<vector>
int main()
{
std::vector<int> a(65536);
a[0]=10;
std::vector<int> b(a); //NOTE: b is constructed from a
std::cout<<a[0];
}
這一次的程序成功運行,沒有錯誤,給了輸出:
Output:
10
然後我試圖把它改成下面的代碼:
#include <iostream>
#include<vector>
int main()
{
std::vector<int> a(65536);
a[0]=10;
std::vector<int> b(a); //NOTE: b is constructed from a
std::cout<<a[0]<<" " <<b[0];
}
讓我吃驚下面的輸出來預期:
Output:
10 10
我不明白爲什麼程序運行當矢量在構造函數中初始化爲大小時成功,但不是在使用reserve()給出容量時成功。
我也知道使用reserve()的向量的預留容量不會初始化向量的大小。下面的代碼也讓我更加困惑。
#include <iostream>
#include<vector>
int main()
{
std::vector<int> a;
a.reserve(1);
for(int i=0;i<5;i++)
a[i]=i;
std::vector<int> b(a); //NOTE: b is constructed from a
for(int i=0;i<5;i++)
std::cout<<a[i]<<" ";
std::cout<<"\n"<<a.size()<<" "<<a.capacity();
}
在執行時它顯示以下怪異輸出:
Output:
0 1 2 3 4
0 1
存儲的5個值的矢量,但矢量的大小保持爲0。
我無法理解此行爲向量。如何處理大小不變的值。
你說得對,我實際上在開始時並不知道**運算符[] **在使用時沒有檢查邊界,所以我不知道它是未定義的行爲。 – kaartic