2014-02-21 124 views
0
void pre_process(string& pattern, vector<int>& c) 
{ 
    c.reserve(pattern.length()); 
    c[0] = -1; 
    c[1] = 0; 
    for(int i=2; i<pattern.length(); ++i) 
    { 
     if(pattern[c[i-1]] == pattern[i-1]) 
      c[i] = c[i-1]+1; 
     else 
      c[i] = 0; 
    } 
    cout << c.size() << endl; //why the size is zero here? 

} 

在保留向量中的空間之後,我將向值的不同位置賦值。所以不應該增加大小?爲什麼我看到矢量的大小爲零?

將矢量用作固定長度容器的正確方法是什麼?

+1

「我分配值向量的不同位置」的的push_back - 不,你不是;你正在調用UB。 'reserve'不會'調整()'。 –

+1

簡短摘要:由於矢量*的大小*爲零,因此您將矢量的大小視爲零。 –

回答

6

因爲std::vector::reserve不調整矢量大小。它只是爲矢量的數據重新分配一大塊內存(如果需要的話從原始數據複製元素)。

你需要std::vector::resize爲:

c.resize(pattern.length()); 

目前,您正在訪問c出界。

或者,你可以保持通話來調整,而使用operator[]

c.reserve(pattern.length()); 
c.push_back(-1); 
c.push_back(0); 
+0

什麼是std :: vector :: reserve的用例場景?如果它只是重​​新分配更多不可用的內存,那麼擁有這樣的功能有什麼意義呢? –

+0

當分配的內存少於需要時,我是否使用push_back保存重新分配? –

+0

@aj_如果你知道矢量將達到一定的大小,但你想要推入元素,'reserve'是個不錯的選擇。但是,如果您調整的尺寸太小,在某些時候您需要重新分配。如果你不做任何事情,只是推入默認構造向量,你會得到更多的重新分配。 – juanchopanza