std :: set с пользовательским компаратором - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь упорядочить wordItems в порядке убывания wordCount в наборе.

Я нахожусь в структурах данных, и наш профессор ставит перед нами задачи по использованию контейнеров STL в предыдущих заданиях. Причина, по которой здесь используется std :: set, заключается в том, что мой профессор хочет показать нам, как на практике использовать STL BST.

Я не могу понять, std::set и все его функции ...

Вот то, что я считаю соответствующим кодом, относящимся к моей структуре wordItem:

// header file (HashTable.hpp)
struct wordItem
{
    std::string word;
    int count;
    wordItem* next;
};

struct comp 
{
    // I have also tried bool operator<()(wordItem const &lhs, wordItem const &rhs)     
    bool operator()(wordItem const &lhs, wordItem const &rhs) const {
        if (lhs.count == rhs.count) {
            return lhs.word > rhs.word;
        }
        return lhs.count > rhs.count;
    }
};

И вот моя функция, которая фактически использовала бы этот набор:

// implementation file (HashTable.cpp)
#include "HashTable.hpp"
void HashTable::printTopN(int n) {
    set<wordItem,comp> s;

    for (int i = 0; i < hashTableSize; i++) {
        if (hashTable[i] != nullptr) {
            wordItem *temp = hashTable[i];
            s.insert(*temp);
            while (temp->next != nullptr) {
                temp = temp->next;
                s.insert(*temp);
            }
        }
    }
}

Однако я получаю сообщение об ошибке, в котором говорится, что я использую необъявленные идентификаторы. И comp, и s вызывают это ... Это точное сообщение об ошибке:

HashTable2.cpp:129:16: error: use of undeclared identifier 'comp' 
set<wordItem,comp> s;
             ^
HashTable2.cpp:134:7: error: use of undeclared identifier 's'
s.insert(*temp);
^
HashTable2.cpp:137:9: error: use of undeclared identifier 's'
s.insert(*temp); 
^

Предполагается, что набор должен содержать wordItem с наибольшим первым wordCount, и если два слова имеют одинаковое количество, прерыватель связей должен быть в лексикографическом порядке.

Мне кажется, что проблема, вероятно, связана с тем, что я, вероятно, неправильно сравниваю эти wordItem

Наконец, я прошу прощения, потому что я предполагаю, что смешивать мои собственные пользовательские структуры данных со структурами STL очень грязно, но любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 30 октября 2018

Когда вы используете собственный компаратор std::map использует его как

comp_object(a, b)

В

struct comp {
    bool operator<(wordItem const &lhs, wordItem const &rhs) const {
        if (lhs.count == rhs.count) {
            return lhs.word > rhs.word;
        }
        return lhs.count > rhs.count;
    }
};

вы определяете operator <, а не operator (), поэтому он не будет работать. Измените его на

struct comp {
    bool operator()(wordItem const &lhs, wordItem const &rhs) const {
        if (lhs.count == rhs.count) {
            return lhs.word > rhs.word;
        }
        return lhs.count > rhs.count;
    }
};

И это будет работать. Это называется функтором, и вы можете узнать больше о нем здесь: Что такое функторы C ++ и их использование?

...