2010-05-10 2 views
15

Я пытаюсь сортировать массив строк, но он ничего не сортирует ... что я делаю неправильно?C++ sort array strings

string namesS[MAX_NAMES]; 

int compare (const void * a, const void * b){ 
    return (*(char*)a - *(char*)b); 
} 


void sortNames(){ 

    qsort(namesS, MAX_NAMES, sizeof(string), compare); 
} 
+1

Рассматриваете ли вы только первую букву строк? – Kasturi

+10

«Что я делаю неправильно?» Использование qsort, обработка строки как char * ... –

+1

Ваша функция 'compare' пытается * придать * string' символу 'char *'. Это определенно не нормальная вещь. –

ответ

38

Это C++, а не C. Сортировка массива строк легко.

#include <string> 
#include <vector> 
#include <algorithm> 

std::vector<std::string> stringarray; 
std::sort(stringarray.begin(), stringarray.end()); 
+1

Обратите внимание, что вы также можете использовать 'std :: sort' в массиве (но' std :: vector' - лучшая идея): 'std :: sort (namesS, namesS + MAX_NAMES);' –

+0

спасибо, что это сработало – user69514

+1

удобно, но не будет обрабатывать чувствительность к регистру. Верхний регистр W будет представлен в нижнем регистре a. – Miek

9

std::qsort наследуется от стандартной библиотеки C. Это не будет работать.

Для сортировки строк вам необходимо использовать std::sort.

В частности, литье std::string до void*, а затем до char* не определено и не будет работать.

+3

«Это не сработает». Его можно заставить работать. Это не значит, что это должно быть сделано для работы. –

+0

@JohnDibling: 'qsort' работает только со смешанными (тривиально копируемыми) типами, которые' std :: string' не являются. –

3

алгоритм сортировки в CPP имеет такую ​​же сложность, как QSort:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 
using namespace std; 

bool compare(string a, string b){ 
    cout << "compare(" << a << "," << b << ")" << endl; 
    return (a.compare(b) < 0); 
} 

int main() { 

    string mystrs[] = {"www","ggg","bbb","ssss","aaa"}; 
    vector<string> myvector (mystrs, mystrs + 5);    
    vector<string>::iterator it; 

    sort (myvector.begin(), myvector.end(), compare); 

    cout << "vector contains:"; 
    for (it=myvector.begin(); it!=myvector.end(); ++it) 
    cout << " " << *it; 

    cout << endl; 

    return 0; 
} 
1

Вы можете использовать повышение :: рода, как это:

#include <vector> 
#include <boost/range/algorithm.hpp> 

std::vector<std::string> stringarray; 
boost::sort(stringarray); 

Если вы хотите использовать находят применение подталкивание :: найти, например:

std::string findme; 
auto offset = boost::find(stringarray, findme) - stringarray.begin() 

См. 2 usef функции ул (m_stringarray должен быть членом ClassA):

const size_t ClassA::GetIdByName(std::string name) const 
{ 
    return (boost::find(this->m_stringarray, name) - this->m_stringarray.begin()); 
} 

const std::string ClassA::GetNameById(size_t id) const 
{ 
    return this->m_stringarray[id]; 
} 
0

Как многие здесь уже говорилось, вы можете использовать зЬй :: то, чтобы разобраться, но что произойдет, когда вы, например, хотите отсортировать из ZA? Этот код может быть полезен

bool cmp(string a, string b) 
{ 
if(a.compare(b) > 0) 
    return true; 
else 
    return false; 
} 

int main() 
{ 
string words[] = {"this", "a", "test", "is"}; 
int length = sizeof(words)/sizeof(string); 
sort(words, words + length, cmp); 

for(int i = 0; i < length; i++) 
    cout << words[i] << " "; 
cout << endl; 
    // output will be: this test is a 

} 

Если вы хотите изменить порядок сортировки, просто измените знак в функции cmp.

+1

Тело 'cmp' может быть просто' return a () ', либо' std :: больше () 'to' std :: sort' –