Nei commenti a questa domanda is-there-a-way-to-iterate-over-at-most-n-elements-using-range-based-for-loop c'era una domanda aggiuntiva - è possibile avere "vista indice" su un contenitore, cioè disporre di un subrange con alcuni indici filtrati.Un modo per filtrare il range per indici, per ottenere min_element solo dagli indici filtrati?
Inoltre ho riscontrato un problema per trovare il valore minimo da un intervallo con alcuni indici filtrati.
I.e. è possibile sostituire tale codice come di seguito con std e/o algoritmi Boost, filtri - per renderlo più leggibile e gestibile:
template <typename Range, typename IndexPredicate>
auto findMin(const Range& range, IndexPredicate ipred)
-> boost::optional<typename Range::value_type>
{
bool found = false;
typename Range::value_type minValue{};
for (std::size_t i = 0; i < range.size(); ++i)
{
if (not ipred(i))
continue;
if (not found)
{
minValue = range[i];
found = true;
}
else if (minValue > range[i])
{
minValue = range[i];
}
}
if (found)
{
return minValue;
}
else
{
return boost::none;
}
}
Giusto per essere utilizzato in questo modo:
#include <iostream>
#include <vector>
int main() {
std::vector<float> ff = {1.2,-1.2,2.3,-2.3};
auto onlyEvenIndex = [](auto i){ return (i&1) == 0;};
auto minValue = findMin(ff, onlyEvenIndex);
std::cout << *minValue << std::endl;
}
Questa proposta è C++ 17? Posso usarlo in gcc4.9? – PiotrNycz
Gcc 4.9 funziona in modalità C++ 11, usa clang per la modalità C++ 14 (gcc 5.1 ha alcuni bug che impediscono la modalità C++ 14). La proposta è in linea per C++ 17 o TS, probabilmente insieme a C++ 17. Vedere https://github.com/ericniebler/range-v3 – TemplateRex