- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
// https://habr.com/ru/post/440388/
// Интервалы: грядущая эволюция C++
// Давайте теперь рассмотрим следующую задачу: имеется вектор, необходимо удалить
// из него все повторяющиеся элементы. В рамках текущего стандарта мы решали бы её так:
std::vector<T> vec=...;
std::sort( vec.begin(), vec.end() );
vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
// При этом мы указываем имя вектора аж 6 раз! Однако, используя концепцию интервалов
// (объединив итераторы на начало и конец вектора в один объект), можно написать в разы проще, указав искомый вектор лишь единожды:
tc::unique_inplace( tc::sort(vec) );
//... Че, серьезно? Я так тоже могу:
// Однако, используя сишный препроцессор™, можно написать в разы проще, указав искомый вектор лишь единожды:
#define DELETE_DUPS(x) do{ std::sort( x.begin(), x.end() ); x.erase( x::unique( x.begin(), x.end() ), x.end() );}while(0)
DELETE_DUPS(vec);
Вообще, херня какая-то. Нахер придумывать столько херни?
Даже особые костыли для не самого свежего GCC, чтобы это шаблоноговно заработало. В лучших традициях, так сказать
Тут не надо ничего возвращать; пердолиться с константными питухами тоже не надо; никаких шаблонов нет (т.е. x - это какой-то обычный тип, нет выражений вида Pitux<int>::pitux = 5, в которых какой-то Pitux имеет kind сложнее, чем "*"). Вроде достаточно самостоятельно написать template<typename T> void unique(T& pitux); и пользоватья.
О, бже, ты открыл мне глаза, теперь я тоже могу писать свой код!
http://govnokod.ru/25335#comment456237
Можно перевести по аналогии.