Почему std :: генерирует возвращаемое состояние, подобное std :: for_each? - PullRequest
2 голосов
/ 15 августа 2011

std::generate возвращает void:

template<typename ForwardIterator, typename Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen);

Пока std::for_each возвращает Function:

template<typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f);

Документация SGI предполагает, что результат for_each полезен для возврата любого состояния, которое могло измениться во время алгоритма. Разве это не так для generate? Это упущение, или есть ли разница в интерфейсе?

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Одно существенное отличие состоит в том, что, хотя for_each работает с содержимым контейнера, generate просто перезаписывает его.Таким образом, объект функции, переданный в generate, не может собирать информацию о содержимом контейнера, поэтому было бы мало оснований возвращать его впоследствии (его конечное состояние не зависит от содержимого контейнера).

0 голосов
/ 15 августа 2011

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

Когда вы обычно это делаете, предикат сохраняет ссылку на внешний объект состояния и затем проверяет, когда генерация завершена.

StateHolder state;
Generator generator(state); // Pass by reference.
std::generate(c.begin(), c.end(), generator);
// Now you can check the state object for whatever you need.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...