On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 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 на две партиции, то придется самим писать соответствующую реализацию алгоритма для последовательных итераторов.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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 специализирован для контейнеров с двунаправленными итераторами.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 03.07.19 20:28. Заголовок: ­#include <iostr..


*PRIVAT*

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 04.07.19 18:28. Заголовок: ­#include <iostr..


*PRIVAT*

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 08.08.19 17:21. Заголовок: ­#include <iostre..


*PRIVAT*

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 20
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет