Just for fun, habe ich den einfachsten Sortieralgorithmus vorstellbar implementiert:Verschieben von Elementen aus einem assoziativen Container
template<typename Iterator>
void treesort(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type element_type;
// copy data into the tree
std::multiset<element_type> tree(begin, end);
// copy data out of the tree
std::copy(tree.begin(), tree.end(), begin);
}
für meine Testdaten Es ist nur etwa 20-mal langsamer als std::sort
:)
Als nächstes ich wollte die Performance mit Bewegung Semantik verbessern:
template<typename Iterator>
void treesort(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type element_type;
// move data into the tree
std::multiset<element_type> tree(std::make_move_iterator(begin),
std::make_move_iterator(end));
// move data out of the tree
std::move(tree.begin(), tree.end(), begin);
}
aber das hat keinen Einfluss auf die Leistung in signifikanter Weise, obwohl ich bin Sortierung std::string
s.
Dann erinnerte ich mich, dass assoziative Container von außen konstant sind, das heißt, std::move
und std::copy
wird hier das gleiche tun :(Gibt es eine andere Möglichkeit, die Daten aus dem Baum zu bewegen?
Können Sie uns mehr Informationen darüber geben, welche Strings Sie sortieren? Könnten Sie vielleicht Ihren Testcode für uns veröffentlichen? – templatetypedef
Es sieht so aus, als ob Sie versuchen, etwas zu optimieren, von dem Sie wissen, dass es viel besser optimiert werden kann, indem Sie 'qsort' verwenden. Was ist der Zweck, das zu tun? Über die Bewegungssemantik lernen? – svick
@svick Ja, meine primäre Frage ist: Wie verschiebe ich Elemente aus einem assoziativen Container, wenn ich sie nicht mehr brauche? Ich bin mir sicher, dass die allgemeine Frage mein dummes Treesort-Beispiel übersteigt :) Ich habe den Titel der Frage geändert und das Zuweisungsbit entfernt, danke. – fredoverflow