Упорядочивание набора пар в порядке убывания по первому значению, а затем по алфавиту по второму значению

У меня есть набор пар целых чисел и наборов, например: items = {(2,{"A", "B", "C"}),(3,{"C"}),...}
Я настроил это так, потому что наборы stl можно легко заказать, написав компаратор для объявления, но я не знаю, как написать такую ​​​​функцию, чтобы делать то, что мне нужно. Мне нужно распечатать в порядке убывания на основе целочисленного значения (первое значение пары), и если два элемента имеют целочисленное значение, то в алфавитном порядке по строке. В настоящее время он выводится в порядке возрастания по целочисленному значению и в алфавитном порядке по строке. Я приложу ожидаемые и текущие результаты ниже.

set<pair<int, set<string>>> outputSet;
map<set<string>, int> supportMap;
set<set<string>> candidateItemSets;
vector<set<set<string>>> frequentItemSets;

for(int i = 0; i < frequentItemSets.size(); i++){
    for(auto it = frequentItemSets[i].begin(); it != frequentItemSets[i].end(); it++){
        pair<int, set<string>> temp(supportMap[*it],*it);
        outputSet.insert(temp);
    }
}

for(auto it = outputSet.begin(); it != outputSet.end(); it++){
    pair<int, set<string>> temp = *it;

    auto sit = temp.second.begin();
    auto end = temp.second.end();
    advance(end, -1);

    cout << temp.first << " [";
    for(sit; sit != end; sit++)
        cout << *sit << " ";

    cout << *sit << "]" << endl;

/**
current output:  
2 [A]  
2 [A C]  
2 [B]  
2 [B C]  
2 [B C D]  
2 [B D]  
2 [C D]  
2 [D]  
3 [C]  

expected output:  
3 [C]  
2 [A]  
2 [A C]  
2 [B]  
2 [B C]  
2 [B C D]  
2 [B D]  
2 [C D]  
2 [D]
**/

person Daryl Drake    schedule 18.07.2017    source источник
comment
Вы объявляете set из items, но вместо этого ссылаетесь на outputSet, не используя при этом items. Это по ошибке?   -  person Tas    schedule 18.07.2017
comment
Спасибо, я исправил ошибку   -  person Daryl Drake    schedule 18.07.2017
comment
Вы пробовали написать функцию сравнения? Покажите нам, что вы пробовали.   -  person 1201ProgramAlarm    schedule 18.07.2017


Ответы (1)


В общем, если вы хотите хранить элементы и иметь определенные правила упорядочения, вы должны написать процедуру сравнения, которая гарантирует, что порядок будет таким, как вы хотите.

std::set‹ тип, компаратор> Где компаратор имеет функциональный объект

Следующий компаратор перевернул бы числовой тест, поэтому порядок был таким, каким вы хотели изначально.

bool operator()(const std::pair< std::string, int> &lhs, const std::pair<std::string, int> &rhs) const 
{
    if( lhs.first < rhs.first ) // string ordering is already correct
        return true;
    if( lhs.first > rhs.first ) 
        return false;  // needed to ensure we don't test second.
    if( lhs.second > rhs.second )
        return true;
    return false;
}
person mksteve    schedule 18.07.2017
comment
можно просто использовать return std::tie(rhs.first, lhs.second) < std::tie(lhs.first, rhs.second) - person Caleth; 18.07.2017