2014-02-21 3 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

«Я задаю значение в различные положения вектора» - не вы не; вы вызываете UB. 'reserve' does't' resize() '. –

+1

Краткое описание: Вы видите размер вектора как ноль, потому что размер вектора * равен * нулю. –

ответ

6

Потому что std::vector::reserve не изменяет размер. Он просто переназначает большую часть памяти для данных вектора (и при необходимости копирует элементы из оригинала).

Вам нужно std::vector::resize для этого:

c.resize(pattern.length()); 

В настоящее время, вы обращаетесь к c вне границ.

В качестве альтернативы, вы можете держать вызов, чтобы изменить размер и использовать push_back вместо operator[]

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

Какой будет сценарий использования сценария для std :: vector :: reserve? Если он просто перераспределяет больше памяти, которая непригодна для использования, то в чем смысл такой функции? –

+0

Сохранять ли при перераспределении при использовании push_back, когда выделенная память меньше необходимой? –

+0

@aj_ Если вы знаете, что вектор будет иметь определенный размер, но вы хотите вставить в него элементы, «резерв» - хороший вариант. Но если вы измените размер до слишком маленького размера, в какой-то момент вам потребуется перераспределение. Если вы ничего не делаете и просто вдавите в построенный по умолчанию вектор, вы получите больше перераспределений. – juanchopanza

Смежные вопросы