2

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;
}
4

5 に答える 5

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:15c_str()はnotofのメンバー関数stringですstringstreamここを参照してください。

31:23は2つではなく2つをstrcmp()望んでいます。ここを参照してください。const char *char

55:23と35:6char*は。と同じタイプではありませんstring

于 2012-09-22T17:01:27.713 に答える
2

の場合std::sort、ポインタ値を比較するだけのデフォルトのコンパレータを使用しています。適切な比較を行うコンパレータを渡す必要があります(たとえば、strcmpを使用)。

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

それは1つの問題であり、他の問題があるかもしれません。

于 2012-09-22T16:51:18.377 に答える
2

1つの問題は、次の比較関数にありますqsort

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

abは単なる文字であるため、ここでは文字列を比較していません。あなたはそれらを避けたほうがよいでしょう:

int cst_cmp(const void *one, const void *two) 
{ 
return (strcmp(*(char **)one, *(char **)two));
}
于 2012-09-22T16:53:07.293 に答える
2

この機能が機能していません

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

そして、それが一種の固定(ss.str().c_str())である場合、一時へのポインタを返します。

C ++ 11をサポートするコンパイラがある場合はstd::to_string、標準ライブラリから使用できます。それ以外の場合は、戻りタイプをstd::string(ポインターなし!)に変更します。

于 2012-09-22T17:12:51.363 に答える
0

Stroustrupに質問してください;)C文字列配列にスペースを割り当て、その中に文字を入力するだけです。割り当てを解除することを忘れないでください。

于 2012-09-23T22:38:02.367 に答える