Как я могу сделать функцию подкачки быстрее в C ++? - PullRequest
6 голосов
/ 24 ноября 2011

Я пишу алгоритм сортировки пары строк на c ++, и мне интересно, могу ли я ускорить эту операцию подкачки.

void swap(string *items,int a, int b ){
        string temp;
        temp = items[a];
        items[a] = items[b];
        items[b] = temp;
}

Буду признателен, если вы поможете ...

Ответы [ 4 ]

20 голосов
/ 24 ноября 2011

У класса String есть своя собственная функция подкачки.

items[a].swap(items[b]);

Это самый быстрый способ сделать это, поскольку он обращается к внутренним строкам строки и избегает копирования.

См. здесь .

9 голосов
/ 24 ноября 2011

Вы можете использовать std::swap():

void swap(string *items, int a, int b) {
    std::swap(items[a], items[b]);
}

Но нет никакой гарантии, что это будет заметно быстрее, и, вероятно, это не самая медленная часть вашего кода в любом случае. Вы измерили производительность операции подкачки по сравнению с остальным кодом?

6 голосов
/ 24 ноября 2011

Использование std::swap;это сделает лучшую работу, которую он может.Если ваш компилятор поддерживает ссылки Rvalue в C ++ 11, это означает, что он будет использовать преимущества семантики перемещения, чтобы избежать копирования, которое происходит в вашей функции подкачки.

Однако, если ваш компилятор не поддерживает ссылки на rvalue,он, скорее всего, будет работать так же, как ваша функция подкачки.

В большинстве реализаций стандартной библиотеки std::swap будет реализован примерно так:

template<typename T>
void swap(T& a, T& b) {
    T temp(std::move(a));
    a = std::move(b);
    b = std::move(temp);
}

Функция std::move вернетссылка rvalue (T &&) на переданную переменную. Когда вы попытаетесь назначить эту ссылку rvalue, она вызовет оператор перемещения типа, если он доступен.Если оператор перемещения недоступен, он будет вызывать оператор копирования, как обычно.

В случае std::string вышеупомянутая функция подкачки не будет копировать строки с C ++ 11;будут скопированы только внутренние данные, такие как длина строки и указатель строки C.Без C ++ 11 он будет выполнять три копии фактического содержимого строки.

4 голосов
/ 24 ноября 2011

Вы можете изменить свой алгоритм для работы с элементами типа string* вместо string. Тогда все назначения в вашей функции swap будут работать с указателями и будут быстрее, потому что копирование строк не будет задействовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...