Форум » C/C++ » Изменение в стандарте C++ относительно алгоритма std::partition » Ответить

Изменение в стандарте C++ относительно алгоритма std::partition

Сыроежка: Следует обратить внимание, что теперь в соответствии со стандартом C++ 2011 алгоритм std::partition допускает применение последовательных итераторов. До введения стандарта C++ 2011 алгоритм std::partition использовал только двунаправленные итераторы. То есть его объявление имело следующий вид: [pre2] template <class BidirectionalIterator, class Predicate> BidirectionalIterator partition( BidirectionalIterator first, BidirectionalIterator last, Predicate pred ); [/pre2] В новом стандарте C++ объявление этого алгоритма теперь выглядит следующим образом: [pre2] template <class ForwardlIterator, class Predicate> ForwardIterator partition( ForwardIterator first, ForwardIterator last, Predicate pred ); [/pre2] Вследствие этого алгоритм std::partition можно применять к контейнерам, которые имеют последовательные итераторы, как, например, контейнер std::forward_list. Нужно отметить, что MS VC++ 2010 это изменение в стандарте C++ не реализовал. Поэтому если у вас, например, возникнет потребность разбить контейнер std::forward_list на две партиции, то придется самим писать соответствующую реализацию алгоритма для последовательных итераторов.

Ответов - 4

Сыроежка: Имейте в виду, что результат применения алгоритма std::partition к контейнеру с последовательными итераторами и к контейнеру с двунаправленными итераторами, которые имеют одинаковое содержимое, будет различным. Ниже приведена демонстрационная программа. [pre2] #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'; } [/pre2] Ее вывод на консоль: [pre2] 0 2 1 3 0 2 1 3 0 2 0 2 1 3 2 0 3 1 2 0 [/pre2] То есть алгоритм std::partition специализирован для контейнеров с двунаправленными итераторами.

Сыроежка: *PRIVAT*

Сыроежка: *PRIVAT*


Сыроежка: *PRIVAT*



полная версия страницы