Очевидный, а также лучший способ очень похож на тот, который вы выбрали в Java: реализовать пользовательский компаратор.
В C ++ это специализация предиката меньше, чем:
struct less_than_sorted_anagram {
bool operator ()(std::string a, std::string b) {
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
return a < b;
}
};
И назовите это так:
std::vector<std::string> range;
// …
std::sort(range.begin(), range.end(), less_than_sorted_anagram());
Но (как и ваш Java-код) это довольно неэффективно, поскольку отсортированные анаграммы необходимо вычислять повторно. Было бы гораздо эффективнее вычислять их только один раз (скажем, при первом использовании) и кэшировать их.
Например, вы можете поддерживать этот кеш внутри предиката less_than_sorted_anagram
как std::map<std::string, std::string>
(или аналогичный словарь, отображающий строки в строки).