Как отсортировать вектор? - PullRequest
4 голосов
/ 22 октября 2011
#include <algorithm>

bool comparisonFunc(char* c1, char* c2)
{
     return strcmp(c1, c2) ? 0 : 1;
}

vector<char*> myVec;
vector<char*>::iterator itr;
sort(myVec.begin(), myVec.end(), comparisonFunc)

Это правильно или есть лучший способ сделать это?

Ответы [ 3 ]

11 голосов
/ 22 октября 2011

std::sort ожидает предикат "меньше чем".Вы должны реализовать свой comparisonFunc() следующим образом:

bool comparisonFunc(const char *c1, const char *c2)
{
    return strcmp(c1, c2) < 0;
}

(обратите внимание на const s; они важны.)

Ваша текущая реализация не может работать, потому что вы просто возвращаетеесли значения равны или нет.Этой информации недостаточно для сортировки - вам нужно знать, какая из них меньше, а какая больше (если, конечно, значения не равны).

0 голосов
/ 20 июня 2018

С современным C ++ вы можете определить встроенный метод сравнения:

std::vector<const char*> strings;
/* fill strings vector */
std::sort(strings.begin(), strings.end(), [](const char* lhs, const char* rhs) {
    return strcmp(lhs, rhs) < 0;
});

Обратите внимание, что strcmp возвращает -1 / 0 / + 1, чтобы указать порядковый номер, следовательно, сравнение < 0.

0 голосов
/ 22 октября 2011

Я чаще хочу отсортировать вектор указателя на записи, чем просто простые C-строки ...

    template<>
    struct std::less<const foo*>
    {
       bool operator()(const foo* lhs, const foo* rhs) const
       {
          return strcmp(lhs->key, rhs->key);
       }
    };

Это переопределяет сравнение foo *, так что сравнение по умолчанию работает в сортировке.Для меня этот стиль кажется более декларативным, а другой - более процедурным.Если вам нужно несколько заказов, такое использование по умолчанию проблематично;если вы хотите быть уверены, что все упорядоченные коллекции foo * s в одном и том же порядке, это хорошо.

std::vector<foo*> db;
std::sort(db.begin(), db.end());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...