@kill94

Как исправить ошибку?

int cmp_func(const void *a, const void *b){
	return strcmp((*(string*)a).c_str(), (*(string*)b).c_str());
}

qsort(Str, countStr, sizeof(string), cmp_func);


выдает ошибку при сортировке
Unhandled exception at 0x75ABC42D in Test.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0022E348.

в массиве Str 20000000 строк, длиной 20 символов
  • Вопрос задан
  • 359 просмотров
Пригласить эксперта
Ответы на вопрос 3
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
std::vector<std::string> vct;
std::sort(vct.begin(), vct.end());
Ответ написан
Вообще говоря C++ строки так не сортируют, так как они - не-POD. По факту в данном случае qsort меняет местами внутренности std::string, что напрямую делать нельзя (UB).
Сортировать не-POD типы надо при помощи std::sort.
Да и вообще, std::sort - шаблонная функция; лучше инлайнится, чем qsort, а посему лучше использовать его в C++ коде.

#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>

int str_compare(std::string const & l, std::string const & r)
{
	if (l == r)
		return 0;
	return l < r ? -1 : 1;
}
int str_compare(void const * l, void const * r) { return str_compare(*static_cast<std::string const *>(l), *static_cast<std::string const *>(r)); }

int main()
{
	std::string strs[3] = { "foo", "bar", "baz" };
	std::qsort(strs, 3, sizeof(std::string), str_compare); // В общем, работает, но UB
	// std::sort(&strs[0], &strs[0] + 3); // вот так - лучше
	for (auto & s : strs)
		std::cout << s << std::endl;
    return 0;
}
Ответ написан
Drakonn
@Drakonn
Инженер-программист
я думаю, что вместо const void *a нужно const void& a
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы