Почему я не могу найти pg в этом наборе, когда я устанавливаю второе значение 2? - PullRequest
0 голосов
/ 13 октября 2019
class PageMeta{
public:
    int pageNum;
    int freeSpace;
    PageMeta(){
        pageNum = 0;
        freeSpace = 0;
    }
    PageMeta(int pageNum_a, int freeSpace_a){
        this->pageNum = pageNum_a;
        this->freeSpace = freeSpace_a;
    }
    bool operator<(const PageMeta &pm) const {
        if(pageNum == pm.pageNum)
            return false;
        if(freeSpace != pm.freeSpace)
            return freeSpace < pm.freeSpace;
        else
            return pageNum < pm.pageNum;
    }
};

int main () {
    set<PageMeta> s;
    PageMeta pg1(1,2);
    PageMeta pg2(2,3);
    s.insert(pg1);
    s.insert(pg2);
    PageMeta pg(2,0);
    auto it = s.find(pg);
    cout<<(it == s.end())<<endl;

}

Я запутался в приведенном выше коде. Почему я не могу найти pg в наборе? Однако, когда я изменяю второе значение на большее число, например, 100, которое является свободным пространством, оно может быть найдено.

1 Ответ

0 голосов
/ 13 октября 2019

Проблема заключается в том, что оператор PageMeta меньше (<), который используется std :: set для упорядочения элементов при их вставке и для сравнения при поиске элемента. Неправильно сравнивать члены pageNum и freeSpace во всех случаях. Вот почему он находит соответствие для PageMeta (2, 100), когда такой записи в наборе нет. </p>

Должно ли сначала сравниваться pageNum? Если и только если pageNum не совпадает, следует ли сравнивать freeSpace? Затем я предлагаю изменить код следующим образом:

bool operator<(const PageMeta& pm) const {
    return pageNum < pm.pageNum || (pageNum == pm.pageNum && freeSpace < pm.freeSpace);
}

Все зависит от порядка, который вы хотите наложить. Имеет ли pageNum приоритет над свободным пространством или наоборот? Вы должны решить и изменить свой оператор <, чтобы сделать сравнение правильно. Проверьте логику сравнения элементов и порядок их сравнения. </p>

...