Ich versuche, die Ranges-V3-Bibliothek zu verwenden, um einen Container mit Werten in einen Bereich von Bereichen aufzuteilen, sodass benachbarte Bereiche Randelemente teilen.Split-Bereich in Bereich von überlappenden Bereichen
sich das folgende:
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;});
Ich möchte den Bereich in überlappende Unterbereiche basierend aufzuteilen, ob die Region erfullt zwei Kriterien:
- , ob das Element einen Wert von Null hat
- oder ist benachbart zu einem oder mehreren Elementen mit einem Wert von Null
Wunsch Ausgabe:
[1,2,3]
[3,0,4,0,5,0,6]
[6,7,8]
[8,0,0,9]
mein Versuch:
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;});
Ausgang:
[1,2,3]
[6,7,8]
ich ratlos bin, wie ich könnte
- "Einfügen" die Bereich von 3 bis 6
- "anhängen", um den Bereich von 8 bis 9
Warum passierst du bewegende Referenz? Es wird Ihre Daten korrumpieren – Sugar
@Sugar Ich nehme an, Sie beziehen sich auf die Verwendung von 'auto &&' und der Eindruck, dass '&&' eine Rvalue-Referenz implizieren. In diesem Fall bedeutet dieses Sigil nicht Rvalue-Referenz, sondern stattdessen, was Scott Meyer universelle Referenzen nennt. Sehen Sie mehr (hier) [https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers] – apmccartney
[Hier] (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers) ist eine funktionierende Version von apmccartneys Link. –