Chciałem zastąpić pętli z algorytmu w poniższym kodzieNajlepszy sposób na emulowanie czegoś takiego jak warunkowe_powrót_insetu?
int numbers[] = { ... };
vector<int> output;
for(int* it = numbers+from; it != numbers+to ; ++it)
{
int square = func(*it);
if(predicate(square))
{
output.push_back(square);
}
}
Program ten służy do przekształcania wartości i skopiować je do miejsca przeznaczenia, jeżeli zachodzi warunek.
- Nie mogłem użyć
std::copy_if
, ponieważ nie zastosowałoby to transformacji. - nie mogłem użyć
std::transform
dlatego, że brakuje orzecznik - To nawet nie jest dobry pomysł, aby napisać
transform_copy_if()
, ponieważ pośredniego kopii zmiennej przekształconej.
Wygląda na to, że moją jedyną nadzieją jest utworzenie conditional_back_insert_iterator
. Wtedy mogę mieć całkiem przyzwoity połączenia jak:
int numbers[] = { ... };
vector<int> output;
std::transform(numbers+from, numbers+to,
conditional_back_inserter(predicate, output),
func);
Czy rozwiązanie to najlepszy sposób, aby traktować takie przypadki? Nie mogłem nawet używać google do wstawiania warunkowego, więc obawiam się, że jestem na niewłaściwej ścieżce.
mogłem również wyobrazić, że mogłaby wdrożyć rozwiązanie alternatywne, takie jak
std::copy_if(transform_iterator<func>(numbers+from),
transform_iterator<func>(numbers+to),
back_inserter(output));
(który przypomina mi przykład * filter_iterators * w Boost) ale nie oferuje czytelność.
Jest zbyt wiele (użytecznych) rzeczy, które nie istnieją w Bibliotece standardowej. – Nawaz
BTW, mam [bibliotekę nazywaną potokiem] (http://snawaz.github.io/foam/pipeline.html), za pomocą której możesz napisać: 'auto results = numbers | transform (func) | filter (pred); ' – Nawaz
Użyłbym' copy_if' i napisałoby transformujący iterator. Boost ['function_output_iterator'] (http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/function_output_iterator.html) może być odpowiedni. – BoBTFish