сортировка строк в стиле c с помощью sort и qsort

Я пытаюсь использовать sort и qsort для сортировки строки в стиле c, и они видят, какая из них лучше, поэтому я написал этот код, но он не работает, поэтому не могли бы вы сказать мне, что не так с Это.
заранее спасибо.

#include <iostream>
#include<vector>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<chrono>
#include<string>
#include<sstream>

using namespace std;
using namespace std::chrono;

void bvect(vector<double> &vec, int num)
{
auto gen = bind(normal_distribution<double>(15,4.0),default_random_engine());
for(int i=0; i<num; ++i)
vec.push_back(gen());
}

char* converttostring(int number)
{
stringstream ss;
ss << number;
return (ss.c_str());
}

int cst_cmp(const void *one, const void *two)
{
char a = *((char*)one);
char b = *((char*)two);
return strcmp(a, b);
}

//Generated random strings
void textvect(vector<string> &vec, int num)
{
srand(time(NULL));
for(int i=0; i<num; ++i)
vec.push_back(converttostring(rand()%num +1));
}void displayvector(vector<char*>vect)
{
for (int i=0; i<vect.size(); ++i){
for (int j=0; j<strlen(vect[i]); ++j)
cout<<vect[i][j];
cout<<endl;
}
}

int main(){
int sz=100000;
vector<char*>text1, text2;
textvect(text1, sz);
text2.resize(text1.size());
copy(text1.begin(),text1.end(),text2.begin());

// qsort() string
auto t1 = system_clock::now();
qsort(&text1[0], text1.size(), sizeof(char*), cst_cmp);
auto t2 = system_clock::now();
auto dms = duration_cast<milliseconds>(t2-t1);
cout << "string qsort() took " << dms.count() << " milliseconds\n";

// sort() string
auto t3 = system_clock::now();
std::sort(text2.begin(), text2.end());
auto t4 = system_clock::now();
auto dms1 = duration_cast<milliseconds>(t4-t3);
cout << "string sort() took " << dms1.count() << " milliseconds\n";

return 0;
}

2

Решение

За std::sortвы просто используете компаратор по умолчанию, который будет просто сравнивать значения указателя. Вам нужно передать компаратор, который делает правильное сравнение (например, с помощью strcmp):

std::sort(text2.begin(), text2.end(),
[](const char* lhs, const char* rhs) { return strcmp(lhs,rhs) < 0; });

Это одна проблема, могут быть и другие.

2

Другие решения

Одна проблема в вашей функции сравнения для qsort:

int cst_cmp(const void *one, const void *two)
{
char a = *((char*)one);
char b = *((char*)two);
return strcmp(a, b);
}

Вы не сравниваете строки здесь, потому что a а также b просто символы. Вы могли бы также избежать их:

int cst_cmp(const void *one, const void *two)
{
return (strcmp(*(char **)one, *(char **)two));
}
2

Вот ошибки, которые я получаю, пытаясь скомпилировать ваш код:

> g++ main.cc -std=c++0x
main.cc: In function ‘char* converttostring(int)’:
main.cc:24:15: error: ‘std::stringstream’ has no member named ‘c_str’
main.cc: In function ‘int cst_cmp(const void*, const void*)’:
main.cc:31:23: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
/usr/include/string.h:143:12: error:   initializing argument 1 of ‘int strcmp(const char*, const char*)’ [-fpermissive]
main.cc:31:23: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
/usr/include/string.h:143:12: error:   initializing argument 2 of ‘int strcmp(const char*, const char*)’ [-fpermissive]
main.cc: In function ‘int main()’:
main.cc:55:23: error: invalid initialization of reference of type ‘std::vector<std::basic_string<char> >&’ from expression of type ‘std::vector<char*>’
main.cc:35:6: error: in passing argument 1 of ‘void textvect(std::vector<std::basic_string<char> >&, int)’

24:15 c_str() является функцией-членом string не stringstream, Увидеть Вот.

31:23 strcmp() хочет два const char * не два char, Увидеть Вот.

55:23 и 35: 6 char* не тот же тип, что и string,

2

Эта функция не работает

char* converttostring(int number)
{
stringstream ss;
ss << number;
return (ss.c_str());
}

и если бы это было отчасти исправлено (ss.str().c_str()), он будет возвращать указатель на временный.

Если у вас есть компилятор с поддержкой C ++ 11, вы можете использовать std::to_string из стандартной библиотеки. В противном случае измените тип возвращаемого значения на std::string (без указателя!).

2

Спросите Stroustrup;) просто выделите место для массива строк C и введите символы в него .. не забудьте освободить его ..

0