Автор | Сообщение |
|
Отправлено: 15.09.13 14:48. Заголовок: Изменение в стандарте C++ относительно алгоритма std::partition
Следует обратить внимание, что теперь в соответствии со стандартом C++ 2011 алгоритм std::partition допускает применение последовательных итераторов. До введения стандарта C++ 2011 алгоритм std::partition использовал только двунаправленные итераторы. То есть его объявление имело следующий вид: template <class BidirectionalIterator, class Predicate> BidirectionalIterator partition( BidirectionalIterator first, BidirectionalIterator last, Predicate pred ); В новом стандарте C++ объявление этого алгоритма теперь выглядит следующим образом: template <class ForwardlIterator, class Predicate> ForwardIterator partition( ForwardIterator first, ForwardIterator last, Predicate pred ); Вследствие этого алгоритм std::partition можно применять к контейнерам, которые имеют последовательные итераторы, как, например, контейнер std::forward_list. Нужно отметить, что MS VC++ 2010 это изменение в стандарте C++ не реализовал. Поэтому если у вас, например, возникнет потребность разбить контейнер std::forward_list на две партиции, то придется самим писать соответствующую реализацию алгоритма для последовательных итераторов.
|
|
|
Ответов - 4
[только новые]
|
|
|
Отправлено: 28.05.19 14:56. Заголовок: Имейте в виду, что р..
Имейте в виду, что результат применения алгоритма std::partition к контейнеру с последовательными итераторами и к контейнеру с двунаправленными итераторами, которые имеют одинаковое содержимое, будет различным. Ниже приведена демонстрационная программа. #include <iostream> #include <functional> #include <forward_list> #include <list> #include <iterator> #include <algorithm> int main() { std::forward_list<int> lst = { 0, 2, 1, 3 }; for ( const auto &item : lst ) std::cout << item << ' '; std::cout << '\n'; std::cout << '\n'; auto it = std::partition( std::begin( lst ), std::end( lst ), std::bind2nd( std::modulus<int>(), 2 ) ); for ( ; it != std::end( lst ); ++it ) std::cout << *it << ' '; std::cout << '\n'; for ( const auto &item : lst ) std::cout << item << ' '; std::cout << '\n'; std::cout << '\n'; std::list<int> lst1 = { 0, 2, 1, 3 }; for ( const auto &item : lst1 ) std::cout << item << ' '; std::cout << '\n'; std::cout << '\n'; auto it1 = std::partition( std::begin( lst1 ), std::end( lst1 ), std::bind2nd( std::modulus<int>(), 2 ) ); for ( ; it1 != std::end( lst1 ); ++it1 ) std::cout << *it1 << ' '; std::cout << '\n'; for ( const auto &item : lst1 ) std::cout << item << ' '; std::cout << '\n'; } Ее вывод на консоль: 0 2 1 3 0 2 1 3 0 2 0 2 1 3 2 0 3 1 2 0 То есть алгоритм std::partition специализирован для контейнеров с двунаправленными итераторами.
|
|
|
|
Отправлено: 03.07.19 20:28. Заголовок: #include <iostr..
*PRIVAT*
|
|
|
|
Отправлено: 04.07.19 18:28. Заголовок: #include <iostr..
*PRIVAT*
|
|
|
|
Отправлено: 08.08.19 17:21. Заголовок: #include <iostre..
*PRIVAT*
|
|
|
|