Может ли функция назначения для контейнеров переполниться - PullRequest
2 голосов
/ 29 марта 2010

Я столкнулся с этим вопросом сегодня и подумал, что должен опубликовать его для справки сообщества и / или мнений.

Стандартные контейнеры C ++ vector, deque, list и string предоставляют функцию-член assign. Есть две версии; Меня в первую очередь интересует тот, кто принимает диапазон итераторов. Книга Josuttis немного двусмысленна с ее описанием. Из с. 237 ...

Назначает все элементы диапазона [beg, end); то есть заменяет все существующие элементы копиями элементов [beg, end).

В нем не говорится, что произойдет, если размер контейнера-адресата отличается от назначаемого диапазона. Это усекает? Это автоматически расширяется? Это неопределенное поведение?

1 Ответ

3 голосов
/ 29 марта 2010

Вот что я нашел. Оказывается, мне не нужно было беспокоиться о том, чтобы сделать что-то не так. Еще раз, у стандарта есть ответ. Из раздела 23.2.6.1:

void assign(Iter first, Iter last);

Эффекты:

erase(begin(), end());

insert(begin(), first, last);

Так что на самом деле это просто сокращение для clear(), за которым следует insert полного диапазона.

...