[英]How to use qsort to sort array of string in c++? [duplicate]
这个问题已经在这里有了答案:
我正在使用qsort在c ++中对字符串数组进行排序。 我的代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
int CompareString( const void * e1, const void * e2) {
string * s1 = (string * ) e1;
string * s2 = (string * ) e2;
if( *s1 < *s2 ) return -1;
else if( *s1 == *s2 ) return 0;
else if( *s1 > *s2 ) return 1;
}
int main() {
string Array[4] = {"hehe","789","456","123"};
qsort(Array,4,sizeof(string),CompareString);
for( int i = 0;i < 4;++i )
cout << Array[i] << endl;
return 0;
}
但它收到运行时错误。 我确实知道这种排序方式有效,但是我想知道为什么不能使用qsort。 谢谢 :)
这个问题类似于这个问题,但是有一些区别。 在该问题中,人们建议改用sort或对琐碎类型使用qsort。 但是,我的问题是我必须使用qsort而不是sort ,因此该问题未解决我的问题,而且我也不认为我的问题是重复的。
至于为什么我必须使用qsort而不是sort,答案是“这是分配的要求”,链接是: 这里 。 我将原始问题翻译如下:
实现MyString类,该类继承std:string,并且代码应使用以下代码编译并正确运行:
MyString SArray[4] = {"big","me","about","take"};
qsort(SArray,4,sizeof(MyString), CompareString);
for( int i = 0;i < 4;++i )
cout << SArray[i] << endl;
MyString应该类似于:
class MyString:public string{
...
};
这个原始问题要求MyString通过其他测试,而这些测试我已经通过了。 但是我仍然不能通过qsort ,所以我改了一下,问了我的第一版问题。
从答案中,我可以得出结论,qsort不适用于非POD。 由于MyString继承了字符串,并且string是非POD的,因此MyString是非POD的,因此MyString无法通过测试。
谢谢大家回答我的问题:)
为了在数组内重新排列和移动C ++类,必须使用该类的复制/移动构造函数和/或赋值运算符。 qsort()
是C库函数,对std::string
或任何其他C ++类,其构造函数或析构函数一无所知。 qsort()
不能用于对非POD类的向量进行排序。
使用std::sort()
对向量进行排序。
C的qsort
不能移动非POD对象。 但是它可以移动指针。 因此,如果绝对必须使用qsort
对std::string
数组进行排序,则可以通过对相应的指针数组进行排序来实现:
#include <iostream>
#include <string> // std::string
#include <vector> // std::vector
#include <stdlib.h> // qsort
using namespace std;
auto compare( void const* e1, void const* e2 )
-> int
{
string const* const p1 = *reinterpret_cast<string* const*>( e1 );
string const* const p2 = *reinterpret_cast<string* const*>( e2 );
return p1->compare( *p2 );
}
template< size_t n >
void sort( string (&a)[n] )
{
vector<string const*> pointers;
pointers.reserve( n );
for( string& item : a ){ pointers.push_back( &item ); }
qsort( &pointers[0], n, sizeof( pointers[0] ), compare );
vector<string> result;
result.reserve( n );
for( string const* p : pointers ) { result.push_back( move( *p ) ); }
for( int i = 0; i < int( n ); ++i ) { a[i] = move( result[i] ); }
}
auto main()
-> int
{
string strings[4] = { "hehe", "789", "456", "123" };
sort( strings );
for( string const& s : strings )
{
cout << s << endl;
}
}
您的密码
string Array[4] = {"hehe","789","456","123"};
产生4个字符串,而不是4个指向字符串的指针,如果您的实现使用SmallStringOptimization,则sizeof(std :: string)应该为3 * sizeof(void *)+一些常数。
尝试我的阅读技巧时,我会猜到您认为Array是指向字符串的指针或字符串本身是指针。
最初将String声明为这样(如果您删除所有模板内容)。
class string {
size_t length;
size_t capacity
char *buffer;
};
如果您已声明数组
std::string *Array[4] = {
new std::string("hehe"),
new std::string("789"),
new std::string("456"),
new std::string("123")
};
会的。
您可以在此处查看整个代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.