Wie teilt man einen Vektor in n "fast gleich" teilen
Ich habe ein problem, ich würde gerne Zusammenführen einer großen Anzahl von Bildern mit ImageMagick ' s convert.exe aber unter Windows habe ich einen 8192 byte langer Befehl Zeile beschränkt.
Meine Lösung ist die Aufteilung der Aufgabe in kleinere sub-Aufgabe, die Sie ausführen, und führen Sie eine Letzte Aufgabe, die kombiniert Sie zusammen.
Meine Idee ist das erstellen einer Funktion, die einen Vektor, der die Bilder und ein integer ist, und zerlegt den Vektor in n sub-Vektor alle "fast gleich" teilen.
So zum Beispiel, wenn ich möchte split 11 in 3 Gruppen wäre es 4-4-3.
Können Sie mir sagen, wie kann ich es in C++? Ich meine, um eine Funktion schreiben, die
split_vec( const vector<image> &images, int split )
die nicht der Spaltung?
Auch, können Sie mir sagen, was ist der effizienteste Weg, dies zu tun , wenn ich nicht brauchen, um erstellen Sie neue Vektoren, nur Durchlaufen und die sub-Teile? Wie die std::substr
Funktion mit std::string
?
Anmerkung: ich habe schon die Verwendung von Boost in das Projekt, so dass, wenn es gibt einige nette tool in Boost für dieses, dann ist es für mich perfekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um eine Basis-Zahl für die Größe der einzelnen Teil, einfach teilen Sie die Summe durch die Anzahl der Teile: 11/3 = 3. Offensichtlich einige der Teile müssen größer sein, als, dass, um die richtige Summe, aber das ist nur der Rest: 11 % 3 = 2. So, jetzt wissen Sie, dass 2 der Teile wird in Größe 3+1, und was übrig bleibt wird 3.
number
undparts
sind ganze zahlen, die Sie benötigen, zu konvertieren, zu verdoppeln, bevor Sie die Teilung. Außerdem werden Sie brauchen, um über roundoff error, es gibt Fälle, wo können Sie ein off-by-one-Fehler, wenn Sie wieder zurück konvertieren zu integer.Hier ist meine Lösung:
Haben Sie sich Gedanken über die Verwendung der
xargs
Programm. Vielleicht eine high-level-Lösung für das problem.xargs
ist ein stand-alone-Programm. Verteilen Sie mit seinem Programm.Sie nicht haben, um erstellen Sie neue sub-Vektoren, verwenden Sie so etwas wie die folgenden:
Hoffe, das hilft.
Können Sie
iterators
zu Durchlaufen und die sub-Teile des Problems. Iteratoren Verwendung ist ähnlich wie Zeiger auf Elemente desvector
Was Sie wollen auf den Bildern zu tun, die umgesetzt werden könnten, als eine Funktion
CreateProcess ist eine 32 Kb-limit
Oder, wenn Sie wollen, gehen Sie über die shell,
Könnte man eine Vorlage erstellen, gibt einen std::vector < std::Vektor - >
und erhält den Vektor, den Sie möchten, split, und die Zahl der Divisionen.
mit für und iterator ist sehr einfach.