Próbuję użyć biblioteki Ranges-V3 do podzielenia kontenera wartości na zakres zakresów, tak aby sąsiednie zakresy współdzieliły elementy brzegowe.Podziel zakres na zakres nakładających się zakresów
rozważyć następujące:
using namespace ranges;
std::vector<int> v = { 1, 2, 3, 0, 4, 0, 5, 0, 6, 7, 8, 0, 0, 9 };
auto myRanges = v | /* something like adjacent split */
for_each(myRanges, [](auto&& range){ std::cout << range << std::endl;});
ja jak podzielenie zakresu, do nakładających się na siebie podzakresów na podstawie tego, czy obszar pełni spełnić dwa kryteria:
- czy element ma wartość zero
- lub sąsiaduje z jednym lub większą liczbą elementów o wartości zerowej
Pożądany wyjściowa:
[1,2,3]
[3,0,4,0,5,0,6]
[6,7,8]
[8,0,0,9]
moja próba:
auto degenerate =
[](auto&& arg){
return distance(arg) < 2;
};
auto myRanges = v | view::split(0) | view::remove_if(degenerate);
for_each(myRanges, [](auto&& range){ std::cout << range << std::endl;});
wyjściowa:
[1,2,3]
[6,7,8]
Jestem w rozterce, w jaki sposób mogę
- "insert" THE zakres od 3 do 6
- "dołączyć" zakres od 8 do 9
dlaczego przekazujesz referencje? to uszkodzi twoje dane. – Sugar
@Sugar Przypuszczam, że mówisz o używaniu 'auto &&' oraz o wrażeniu, że '&&' oznacza odwołanie do rwartości. W tym przypadku sigil nie implikuje odniesienia do rvalue, ale zamiast tego, co Scott Meyer nazywa odwołaniami uniwersalnymi. Zobacz więcej (tutaj) [https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers] – apmccartney
[tutaj] (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers) jest działającą wersją łącza apmccartney. –