Tak dla zabawy, mam wdrożony algorytm Najprostszym sortowania można sobie wyobrazić:Ruchome elementy spośród asocjacyjną kontenera
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);
}
To tylko około 20 razy wolniej niż std::sort
na przetwarzanie moich danych testu :)
Następny, chciałem poprawić wydajność z semantyki ruch:
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);
}
Ale to nie miało wpływu na wydajność w znaczący sposób, chociaż jestem sortowanie std::string
s.
Wtedy przypomniałem sobie, że kontenery asocjacyjne są stałe z zewnątrz, czyli std::move
i std::copy
zrobi to samo tutaj :(Czy jest jakiś inny sposób, aby przenieść dane z drzewa?
Czy możesz podać nam więcej informacji na temat sortowanych ciągów? Czy mógłbyś opublikować swój kod testowy, abyśmy mogli grać? – templatetypedef
Wygląda na to, że próbujesz zoptymalizować coś, o czym wiesz, że można zoptymalizować znacznie więcej, po prostu używając 'qsort'. Jaki jest cel tego? Nauka o semantyce ruchu? – svick
@svick Tak, moje główne pytanie brzmi: jak przenieść elementy z pojemnika asocjacyjnego, jeśli już ich tam nie potrzebuję? Jestem pewien, że to ogólne pytanie wykracza poza mój głupi przykład Treesorta :) Zmodyfikowałem tytuł pytania i usunąłem nieco fragment przydziału, dziękuję. – fredoverflow