Ответ 1
Это С++, а не C. Сортировка массива строк легко.
#include <string>
#include <vector>
#include <algorithm>
std::vector<std::string> stringarray;
std::sort(stringarray.begin(), stringarray.end());
Я пытаюсь отсортировать массив строк, но он не сортирует ничего.... что я делаю неправильно?
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);
}
Это С++, а не C. Сортировка массива строк легко.
#include <string>
#include <vector>
#include <algorithm>
std::vector<std::string> stringarray;
std::sort(stringarray.begin(), stringarray.end());
std::qsort
наследуется от стандартной библиотеки C. Это не сработает.
Вам нужно использовать std::sort
для сортировки строк.
В частности, отбрасывайте std::string
до void*
, а затем до char*
является undefined и не будет работать.
сортировка алгоритма в 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;
}
Вы можете использовать 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];
}
Как уже было сказано выше, вы можете использовать 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.