CPP_GEEK Telegram 302
🔧 Что делать, если std::sort тормозит?

Привет! Сегодня хочу поделиться с вами одной типичной ситуацией, с которой сталкивался не раз — сортировка больших контейнеров через std::sort, которая неожиданно начинает тормозить. Вызываешь вроде обычную сортировку, а работает медленно. Почему так?

🔍 Проблема — не std::sort, а компаратор!

В 90% случаев проблема не в std::sort, а в лямбде или компараторе, который вы передаёте. Особенно если он:

1. Вызывает копирование: вы сравниваете по значениям, а не по ссылке.
2. Делает что-то тяжёлое внутри: например, вызывает метод, делает std::string копию, обращается к БД (да, и такое видел!).
3. Некеширует результат: например, каждый раз считает длину строки.

Как ускорить сортировку:
- Передавайте данные по ссылке, особенно если у вас вектор структур:

std::sort(vec.begin(), vec.end(), [](const MyStruct& a, const MyStruct& b) {
return a.key < b.key;
});

- Если у вас есть вычисление ключа — используйте схему "decorate-sort-undecorate":

std::vector<std::pair<int, size_t>> temp;
for (size_t i = 0; i < vec.size(); ++i)
temp.emplace_back(compute_key(vec[i]), i);

std::sort(temp.begin(), temp.end());
std::vector<MyStruct> result;
for (const auto& [_, i] : temp)
result.push_back(vec[i]);


🧠 Мораль: Если std::sort "медленный", не спешите винить алгоритм. Лучше проверьте, что вы передаёте ему на вход.

➡️ @cpp_geek
👍11😁1



tgoop.com/cpp_geek/302
Create:
Last Update:

🔧 Что делать, если std::sort тормозит?

Привет! Сегодня хочу поделиться с вами одной типичной ситуацией, с которой сталкивался не раз — сортировка больших контейнеров через std::sort, которая неожиданно начинает тормозить. Вызываешь вроде обычную сортировку, а работает медленно. Почему так?

🔍 Проблема — не std::sort, а компаратор!

В 90% случаев проблема не в std::sort, а в лямбде или компараторе, который вы передаёте. Особенно если он:

1. Вызывает копирование: вы сравниваете по значениям, а не по ссылке.
2. Делает что-то тяжёлое внутри: например, вызывает метод, делает std::string копию, обращается к БД (да, и такое видел!).
3. Некеширует результат: например, каждый раз считает длину строки.

Как ускорить сортировку:
- Передавайте данные по ссылке, особенно если у вас вектор структур:


std::sort(vec.begin(), vec.end(), [](const MyStruct& a, const MyStruct& b) {
return a.key < b.key;
});

- Если у вас есть вычисление ключа — используйте схему "decorate-sort-undecorate":

std::vector<std::pair<int, size_t>> temp;
for (size_t i = 0; i < vec.size(); ++i)
temp.emplace_back(compute_key(vec[i]), i);

std::sort(temp.begin(), temp.end());
std::vector<MyStruct> result;
for (const auto& [_, i] : temp)
result.push_back(vec[i]);


🧠 Мораль: Если std::sort "медленный", не спешите винить алгоритм. Лучше проверьте, что вы передаёте ему на вход.

➡️ @cpp_geek

BY C++ geek


Share with your friend now:
tgoop.com/cpp_geek/302

View MORE
Open in Telegram


Telegram News

Date: |

You can invite up to 200 people from your contacts to join your channel as the next step. Select the users you want to add and click “Invite.” You can skip this step altogether. How to Create a Private or Public Channel on Telegram? Co-founder of NFT renting protocol Rentable World emiliano.eth shared the group Tuesday morning on Twitter, calling out the "degenerate" community, or crypto obsessives that engage in high-risk trading. How to Create a Private or Public Channel on Telegram? With the sharp downturn in the crypto market, yelling has become a coping mechanism for many crypto traders. This screaming therapy became popular after the surge of Goblintown Ethereum NFTs at the end of May or early June. Here, holders made incoherent groaning sounds in late-night Twitter spaces. They also role-played as urine-loving Goblin creatures.
from us


Telegram C++ geek
FROM American