2010-02-01 2 views
8

Существуют ли стандартные/де-факто стандартные (форсирующие) обертки вокруг стандартных алгоритмов, которые работают с контейнерами, определяющими начало и конец. Позвольте мне показать вам, что я имею в виду с кодом:C++ стандарт/де-факто обертки алгоритма STL

// instead of specifying begin and end 
std::copy(vector.begin(), vector.end(), output); 
// write as 
xxx::copy(vector, output); 

Я знаю, что это может быть написано легко, но я ищу специально для чего-то повсеместного. Спасибо.

+1

Отличный вопрос, действительно. Я всегда находил, что идея генерации алгоритмов на итераторах довольно беспорядочна ... 'std :: copy (input.begin(), input.end(), std :: back_inserter (output));' что действительно больно мне глаза ... К сожалению, всякий раз, когда дело доходит до фактической модификации структуры базового контейнера (добавления/удаления) элементов, тогда 'Boost.Range' не работает:/ –

ответ

8

Существует расширение библиотеки Boost Range под названием RangeEx, которая содержит обертки диапазона для всех алгоритмов stl, а также некоторые новые.

Он был недавно принят в Boost, и поэтому он еще не находится в текущем официальном выпуске (1.41). Пока это не изменится, вы можете download the latest version из Boost Vault.

Не знаю, станет ли это когда-либо частью стандарта C++, но тот факт, что он находится в Boost, означает, что это будет de facto.

+0

спасибо, boost vault для меня достаточно. – Anycorn

+1

fyi, RangeEx был интегрирован в Boost Range начиная с 1.43.0 – sstock

1

Единственный случай, когда я видел что-то вроде этого являются те алгоритмы, основанные на boost::range библиотеки, но даже это не на самом деле изменить стандартные алгоритмы как std::copy или std::remove_if - алгоритм в вопросе должно быть написано, чтобы взять преимущество такой оболочки диапазона.

Для примера см. Библиотеку Boost String Algorithms.

2

Следующий стандарт будет (будем надеяться!) Изменить это. В то же время взгляните на Boost.Range и его различные виды использования, хотя я не знаю интерфейса со стандартными алгоритмами.

+0

Вы имеете в виду TR1? – Anycorn

+0

TR1 не включает установку диапазона. На странице Википедии для C++ 0x перечислены некоторые элементы семантики диапазона, но они относятся к циклу, основанному на диапазоне, который является новым в C++ 0x. AFAIK стандартные алгоритмы не изменяются в новом стандарте - хотя я мог ошибаться .... –

+0

@unknown: Нет, TR1 не является строго новым стандартом, это всего лишь куча рекомендаций. Я говорил о C++ 0x (хотя этого действительно нет в статье в Википедии, но он * был запланирован. Не уверен, попал ли он в окончательный вариант). –

0

Я добавлю свой собственный вывод: Adobe исходных библиотек (rangex из подталкивание вытесняет алгоритмов часть) ASL