Сортировка вектора с использованием пользовательской функции, которая будет принимать вектор любого типа и std::less/std::greater в качестве компаратора

Я пытаюсь отсортировать вектор (в данном конкретном случае содержащий std::make_unique<std::string>но он также должен уметь работать с разными типами). Вот код, который мне предоставили:

      template <typename T>
void print_vector_of_pointers(const std::vector<T>& vec) {
 for (const auto& ptr : vec) {
 std::cout << *ptr << ' ';
 }
 std::cout << '\n';
}
int main() {
 auto vec = std::vector<std::unique_ptr<std::string>>();
 vec.push_back(std::make_unique<std::string>("ghi"));
 vec.push_back(std::make_unique<std::string>("abc"));
 vec.push_back(std::make_unique<std::string>("jkl"));
 vec.push_back(std::make_unique<std::string>("def"));
 print_vector_of_pointers(vec);
 auto sorted = sorted_view(vec, std::less());
 print_vector_of_pointers(sorted);
 print_vector_of_pointers(vec);
}

Вывод должен быть:

      ghi abc jkl def
//abc def ghi jkl wrong, of course as you've stated it will sort the pointers, not what it actually contains
ghi abc jkl def

Компилятор выдает мне эту ошибку независимо от того, что я пытаюсь сделать:

      cannot deduce template arguments for 'less' from ()

И я не уверен, должен ли я написать шаблон только для функции sorted_view() и написать какой-нибудь шаблон для std::less, чтобы он мог принимать вектор любого типа, или я должен также перегрузить оператор (). Прямо сейчас любые испытания при написании sorted_view() приводили к ошибке компилятора, как я прикрепил выше. Любая помощь будет принята с благодарностью.

2 ответа

Вы просите компилятор вывести из ничего. Вам нужно будет указать, чтобы построить один, или std::less<>построить полиморфную.

Обратите внимание, что std::less<std::unique_ptr<std::string>>не будет сравнивать строки, он упорядочит указатели на основе общего порядка, определенного реализацией.

Обычно вы бы не использовали std::vector<std::unique_ptr<std::string>>, но std::vector<std::string>вместо.

Вы утверждаете, что используете C++17(поскольку вы использовали его тег). Скорее всего, вы не включили его в своем проекте. Просто добавьте флаг, который включает его, например -std=c++17для Clang или GCC, или /std:c++17для МСВС.

Если вы используете CMake, вы можете просто использовать set(CMAKE_CXX_STANDARD 17).

Другие вопросы по тегам