C ++ сортировать массив строк - PullRequest
17 голосов
/ 10 мая 2010

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

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

Ответы [ 6 ]

42 голосов
/ 10 мая 2010

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

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

std::vector<std::string> stringarray;
std::sort(stringarray.begin(), stringarray.end());
9 голосов
/ 10 мая 2010

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

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

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

6 голосов
/ 25 мая 2010

алгоритм сортировки в 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 голос
/ 14 февраля 2013

Вы можете использовать boost :: sort, как это:

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

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

Если вы хотите использовать find, используйте boost :: find, вот так:

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

См. 2 полезные функции (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 голосов
/ 03 октября 2018

Вот C ++ еще один способ сортировки массива строк без использования .

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    string WordArray[] = {"AA","DD","CC","BB","ZZ","NN"};
    sort(begin(WordArray), end(WordArray));  /*Sort the Array*/
    for(auto& Word: WordArray){
       cout<<Word<<endl;                     /*Print Every String Element*/
    }
    return 0;
}
0 голосов
/ 21 мая 2014

Как многие здесь заявили, вы можете использовать std :: sort для сортировки, но что произойдет, если вы, например, захотите отсортировать по z-a? Этот код может быть полезен

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...