Вы можете сделать одну из двух вещей:
- Сначала позаботьтесь о "NULL", а затем отсортируйте другие строки наивным способом, которым мы регулярно будем
- Сортировать всю строкуиспользуя более сложный порядок, который вы определили
Обработка «NULL» вначале
Стандартная библиотека имеет алгоритм «разбиения» , который будет перемещать все элементы, соответствующиеопределенный критерий конца строки.
std::vector<string> vec {
"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
};
auto is_not_null = [](const std::string& s) { return s != "NULL"; }
auto nulls_start = std::partition(vec.begin(), vec.end(), is_not_null);
auto non_nulls_end = nulls_start;
std::sort(vec.begin(), non_nulls_end);
Сортировка с комплексным сравнением
std::vector<string> vec {
"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
};
auto comparator =
[](const std::string& lhs, const std::string& rhs)
{
return rhs == "NULL" or lhs <= rhs;
};
std::sort(vec.begin(), vec.end(), comparator);
Обратите внимание на разницу между сравнением здесь и вашей comp()
функцией.Компаратор отвечает на вопрос "должна ли первая полученная строка предшествовать второй?"- и ваша comp()
функция просто не дает ответа, соответствующего вашему требованию.