Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Применение decltype или…

Anna | 25.06.2014 | нет комментариев

Читал я на выходных о STL и нахлынуло несколько мыслей.

Возможен, вы пишите класс для сортировки с цельной одноименной функцией. Возможен также, что хотите сделать что-то аналогичное с STL. Глядим на изложение sort в STL.

template <class RandomAccessIterator>
  void sort (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

1. Как заведено, по умолчанию объекты сравниваются оператором <.
2. Но к тому же, вы хотите, Дабы функция не легко сортировала по-умолчанию, но еще и принимала функциональный объект для сопоставления (будь то указатель на функцию, функтор либо лямбда-выражение).

Но хочется сделать так, Дабы сама функция сортировки была одна. Т.е. не различные реализации с сортировкой по умолчанию и кастомным компаратором с дублированием кода. Одна цельная функция для сортировки.

На ум приходит сделать так. По сути, код сортировки находится только в той функции, которая с компаратором. А та, что без компаратора вызывает функцию с компаратором со стандартным функтором less.

Но взглянем на изложение less:

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

Это конструкция, для инициализации объекта которого необходимо знать тип.
Т.е. необходимо написать:

std::less<тип> comp;

И вызвать:

sort (first, last, comp);

Но в этом месте тип мы не знаем.

Дозволено воспользоваться новым эталоном С 11 и вызвать:

sort( first, last, std::less< decltype(*first) >() );

Но на сколько это верно (немного того, что разыменовывается непостижимо какой указатель, так еще и как быть со ветхими компиляторами)? Как записать отменнее (суперкомпактнее, прекраснее) по-иному? Легко интереса ради.

Абсолютно рабочая сортировка пузырьком вышеописанным методом, Дабы иметь лучшее представление

#include <algorithm>    // std::swap

class BubbleSort
{
public:

	template< class RandomAccessIterator >
	static void sort( RandomAccessIterator first, RandomAccessIterator last )
	{
		sort( first, last, std::less< decltype(*first) >() );
	}

	template< class RandomAccessIterator, class Compare >
	static void sort( RandomAccessIterator first, RandomAccessIterator last, Compare comp )
	{
		for( auto i = first; i != last; i   )
		{
			for( auto j = i   1; j != last; j   )
			{
				if( comp( *j, *i ) )
					std::swap( *i, *j );
			}
		}
	}

private:
	BubbleSort(void);
	~BubbleSort(void);
};

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB