Что если аргумент размера для std :: vector :: resize равен текущему размеру? - PullRequest
0 голосов
/ 23 ноября 2018

Чтение руководства по вектору :: resize http://www.cplusplus.com/reference/vector/vector/resize/

Он только говорит, что происходит, если размер больше или меньше, но не говорит, что происходит, если он равен.Гарантируется ли, что при одинаковом размере он не будет перераспределять массив и делать недействительными итераторы?

Я хотел избежать одной ветви и обрабатывать только 2 случая (> = или <) вместо 3 (<или> или =)=), но если изменение размера до того же размера не определено, то мне придется проверить и этот случай.

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018

С [vector]

Эффекты: Если sz < size(), удаляет последние size() - sz элементов из последовательности.В противном случае добавляет к последовательности sz - size() вставленные по умолчанию элементы.

В случае, если size() == sz вставляет в последовательность 0 элементов, это то же самое, что ничего не делать.

0 голосов
/ 23 ноября 2018

Вероятно, это просто ошибка в связанной ссылке.Стандарт гласит: после :

void resize(size_type sz);

Эффекты : Если sz < size(), удаляются последние элементы size() - sz изпоследовательность.В противном случае добавляет в последовательность sz - size() вставленные по умолчанию элементы.

Поскольку sz - size() в вашем случае 0, он ничего не делает.

0 голосов
/ 23 ноября 2018

Теперь, вероятно, большинство реализаций достаточно разумно относятся к случаю, когда ничего не нужно делать, и буквально ничего не делают.

Но я спрашиваю себя, вы собираетесь вызвать resize, почему вы все равно держите итераторы?По сути, вы никогда не должны держать итераторы в течение более длительного времени, особенно когда контейнеры могут быть изменены.Просто напишите свои алгоритмы так, чтобы не нужно было держать итераторы над точкой изменения размера.

Я предполагаю, что здесь дико, но, возможно, вы не используете правильный контейнер, и больше контекста о том, чего вы пытаетесь достичь, может привести к более полезному ответу.

0 голосов
/ 23 ноября 2018

std::vector<> реализация:

void resize(size_type __new_size)
{
    if (__new_size > size())
        _M_default_append(__new_size - size());
    else if (__new_size < size())
        _M_erase_at_end(this->_M_impl._M_start + __new_size);
}

Итак, как и ожидалось: ничего не происходит.

Редактировать:
Взято с моего сервера RHEL, пакета библиотек g ++ и C ++ версии 5.3.

0 голосов
/ 23 ноября 2018

Кажется, вы спрашиваете, будут ли итераторы признаны недействительными при вызове resize(size())Ответ - нет, итераторы не будут признаны недействительными.Вероятно, совсем немного произойдет, но, конечно, это не аннулирование итератора, потому что это происходит только тогда, когда необходимо перераспределить хранилище, что никогда не произойдет, если изменение размера запрещено.

...