Преимущество STL resize () - PullRequest
       31

Преимущество STL resize ()

2 голосов
/ 08 февраля 2010

Функция resize() позволяет вектору содержать необходимое количество элементов. Если нам потребуется меньше элементов, чем в векторном, последние будут удалены. Если мы попросим вектор расти, он увеличит его размер и заполнит вновь созданные элементы нулями.

 vector<int> v(20); 
 for(int i = 0; i < 20; i++) { 
     v[i] = i+1; 
    } 
  v.resize(25); 

 for(int i = 20; i < 25; i++) { 
     v[i] = i*2; 
   } 

Но если мы используем push_back() после resize(), , он добавит элементы ПОСЛЕ вновь выделенного размера, но не INTO. В приведенном выше примере размер результирующего вектора равен 25, тогда как если мы используем push_back () во втором цикле, это будет 30.

 vector<int> v(20); 
 for(int i = 0; i < 20; i++) { 
     v[i] = i+1; 
  } 
 v.resize(25); 
  for(int i = 20; i < 25; i++) { 
  v.push_back(i*2);   // Writes to elements with indices [25..30), not [20..25) ! <
 } 

Тогда в чем же преимущество функции resize()? Разве это не создает путаницу для индексации и доступа к элементам из вектора?

Ответы [ 5 ]

6 голосов
/ 08 февраля 2010

Звучит так, как будто вы должны использовать vector::reserve.

vector::resize используется для инициализации вновь созданного пространства с заданным значением (или только по умолчанию). Второй параметр функции - это значение инициализации, которое следует использовать.

3 голосов
/ 08 февраля 2010

Метод resize() изменяет вектор size, который не совпадает с вектором capacity.

Очень важно понять различие между этими двумя значениями:

  • size - количество фактических элементов, содержащихся в векторе.
  • capacity - это максимальное количество элементов, которое может содержать вектор без перераспределения большего объема памяти.

Вектор capacity всегда больше или равен size. capacity вектора никогда не сжимается, даже если вы уменьшаете его size, за одним исключением: когда вы используете swap() для обмена содержимым с другим вектором. И как уже упоминали другие, вы можете увеличить вектор capacity, позвонив reserve().

Я думаю, что использование правильной терминологии для size и capacity облегчает понимание класса C ++ vector и позволяет четко говорить о его поведении.

3 голосов
/ 08 февраля 2010

Запомните альтернативу - reserve. resize используется, когда вы хотите воздействовать на вектор с помощью оператора [] - следовательно, вам нужна «пустая» таблица элементов. resize не предназначен для использования с push_back. Используйте reserve, если вы хотите подготовить массив для push_back.

Изменение размера в основном полезно, если массив имеет значимый «пустой» конструктор, когда вы можете создать массив пустых элементов и изменить только те, которые имеют смысл.

1 голос
/ 08 февраля 2010

Функция resize () изменяет фактическое содержимое вектора, вставляя или стирая элементы из вектора. Это не только меняет емкость. Чтобы направить изменение только в объеме хранилища, используйте вместо него вектор :: резерв. Посмотрите на векторную визуализацию в ссылке , обратите внимание, куда указывает v.back.

0 голосов
/ 08 февраля 2010

Я не совсем понимаю путаницу. Преимущество resize в том, что он изменяет размер вашего вектора. Необходимость сделать цикл из push_back s утомительна и может потребовать более одного «фактического» изменения размера.

Если вы хотите «изменить размер» вашего вектора без изменения его доступных индексов, используйте std::vector<T>::reserve. Это изменит размер внутреннего выделенного массива, фактически ничего не добавляя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...