Вот как я бы написал алгоритм для этого:
template <typename I, typename O, typename M>
void mask_copy(I begin, I end, O obegin, M mbegin) {
for (; begin != end; ++begin, ++mbegin)
if (*mbegin)
*obegin++ = *begin;
}
Вызывается так:
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 , 9 };
bool m[] = { true, false, false, false, true, false, false, true, false };
std::vector<int> out;
mask_copy(begin(a), end(a), back_inserter(out), begin(m));
(Требуется C++11 для std::begin
и std::end
.)
Тем не менее, правильная реализация в библиотеке, вероятно, будет использовать enable_if
(или static_assert
), чтобы гарантировать, что используемые типы итераторов совместимы с его использованием, т. е. что I
является входным итератором, O
совместимым выходным итератором. и M
итератор ввода, у которого value_type
равно bool
. К сожалению, отсутствие концепций приводит к настоящему взрыву шаблона.
person
Konrad Rudolph
schedule
19.06.2012
myResult
. - person juanchopanza   schedule 19.06.2012vector
или могли бы вместо этого использоватьvalarray
? Если это так, вы можете использовать перегрузкуoperator[]
, которая возвращаетmasked_array
— это именно то, что вы здесь делаете. - person Björn Pollex   schedule 19.06.2012masked_array
дляval_array
- person Massoud   schedule 19.06.2012markedToBeRead
будет явно содержать индексы? как 2_ ? - person Massoud   schedule 19.06.2012