Was ist der idiomatische Weg, um eine Menge von ganzen Zahlen in eine Reihe von Bereichen zu konvertieren?Konvertieren Sätze von ganzen Zahlen in Bereiche
z. Bei der Menge {0, 1, 2, 3, 4, 7, 8, 9, 11} möchte ich {{0,4}, {7,9}, {11,11}} erhalten.
Nehmen wir an, wir konvertieren von std::set<int>
in std::vector<std::pair<int, int>>
. Ich behandle Ranges als inklusiv auf beiden Seiten, da es in meinem Fall bequemer ist, aber ich kann auch mit offenen Bereichen arbeiten, wenn nötig.
Ich habe die folgende Funktion geschrieben, aber ich fühle mich wie das Rad neu zu erfinden. Bitte sagen Sie, vielleicht gibt es etwas in STL oder Boost dafür.
typedef std::pair<int, int> Range;
void setToRanges(const std::set<int>& indices, std::vector<Range>& ranges)
{
Range r = std::make_pair(-INT_MAX, -INT_MAX);
BOOST_FOREACH(int i, indices)
{
if (i != r.second + 1)
{
if (r.second >= 0) ranges.push_back(r);
r.first = i;
}
r.second = i;
}
ranges.push_back(r);
}
I kann keine Technik sieht größer als O (n) für diese Art der Sache. Die einzige Erhöhung der Geschwindigkeit wäre, dies in Ihre Art zu integrieren (wenn Sie eine tun) – dangerstat
@dangerstat: Nun, das bringt eine andere Frage: Wenn es eine Datenstruktur gibt, die effizient die Liste der Bereiche (eine Art von a Baum, denke ich?). Zur Zeit verwende ich plain std :: set, um Informationen darüber zu speichern, welche Elemente der nummerierten Liste ausgewählt sind. –
ein Satz ist intern ein Baum – Manuel