Как отсортировать список указателей структуры по одному из полей структуры? - PullRequest
1 голос
/ 09 ноября 2011

У меня есть этот код:

struct nod
{
    nod *vCap;
    int vCost;
    char vInfo;
}; 

list<nod*> vList;

for (int i = 9; i >= 0; i--) 
{
    nod *vTmp;
    vTmp->vCost=i;
    vTmp->vInfo='a';
    vList.push_back(vTmp);
}

Как мне отсортировать список по значению vCost?

Ответы [ 3 ]

5 голосов
/ 09 ноября 2011

Вам понадобится специальный компаратор, чтобы сравнить интересующее вас поле:

struct compare_nod_by_cost {
    bool operator()(nod const * a, nod const * b) {
        return a->vCost < b->vCost;
    }
};

Тогда вы можете предоставить его в качестве компаратора для list::sort:

vList.sort(compare_nod_by_cost());

В C ++ 11 вы можете сжать это в лямбду:

vList.sort([](nod const * a, nod const * b) {return a->vCost < b->vCost;});

(Обратите внимание, что вы почти наверняка хотите хранить в своем списке объекты, а не указатели; в этом случае измените аргументы указателя компаратора на ссылки).

2 голосов
/ 09 ноября 2011

Если обычный или естественный порядок для nod определяется по стоимости, то вы можете определить его operator<, чтобы сделать это:

struct nod{
    nod*vCap; 
    int vCost;
    char vInfo;

    bool operator<(nod const &other)  { return vCost < other.vCost; }
};

Тогда, конечно, вы почти наверняка захотите создать list<nod> вместо list<nod*>. После этого сортировка элементов в списке будет vList.sort();.

.

Просто FWIW, вам также нужно исправить опечатку в вашем определении nod (между определениями vCost и vInfo.

вместо запятой стоит запятая.
2 голосов
/ 09 ноября 2011

Используйте лямбду:

vList.sort([](const nod * a, const nod * b ) { return a->vCost < b->vCost; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...