I kamen in diesem Codesegment in den zwei Vektoren zusammengefügt werden, in denen Elemente aus einem Vektor für den Fall von Doppel begünstigt werden:Merging-Vektoren ohne zusätzliche Speicher
std::vector<String> fields1 = fieldSource1.get();
std::vector<String> fields2 = fieldSource2.get();
// original
fields1.insert(std::end(fields1), std::begin(fields2), std::end(fields2));
std::stable_sort(std::begin(fields1), std::end(fields1));
fields1.erase(std::unique(std::begin(fields1), std::end(fields1)), std::end(fields1));
return fields1;
Da Strings ist einzigartig in ihrem jeweiligen Vektor, und dass Reihenfolge der Strings im Ausgabevektor ist irrelevent, ich denke, dass ich diesen Algorithmus effizienter machen kann.
Ich möchte zusätzliche Speicherzuweisung von Std :: Set_union() und Std :: Set_diff() vermeiden.
(Direkt ist std :: set_diff zu einem ursprünglichen Vektor Einfügen keine Option aufgrund iterator Entwertung während einer Größenänderung)
ich damit endete, das mit einem Iterator std :: set_diff mit einem Index ersetzt ist:
std::sort(std::begin(fields1), std::end(fields1));
std::sort(std::begin(fields2), std::end(fields2));
// Initialize iterators by index in case of resizing
size_t index = 0;
size_t end = std::size(fields1);
std::remove_copy_if(std::begin(fields2), std::end(fields2), std::back_inserter(fields1),
[&fields1, &index, end](String field)->bool{
auto begin = std::begin(fields1);
found = std::lower_bound(begin+index, begin+end, field);
index = std::distance(begin, found);
return (*found) == field;
});
return fields1;
Meine Frage ist: kann ich diesen Zusammenführungsvorgang effizienter machen? Wenn nicht, kann ich es lesbarer machen?
Ich denke, in dem Lambda-Prädikat, ist es sicher zu 'index ++' wenn '(* gefunden) == field'. Somit wird ein String-Vergleich für jedes Match übersprungen. Es wäre auch interessant, 'remove_copy_if()' früher als 'index == end' zu beenden. –
Vorausgesetzt, dass 'std :: back_inserser' die Größe des Containers ändert, könnte es auch Speicherzuweisungen vornehmen (je nachdem, welche Strategie der Container zum Reservieren von Speicher verwendet, um ihn zu repetieren). Bevor wir also behaupten, dass dies effizienter ist, wäre das Testen angemessen. – Peter