Поиск элемента в наборе, который использует структуру C ++ - PullRequest
0 голосов
/ 23 сентября 2018

Я создаю 8-головоломку в C ++.Я беру головоломку на основе входных данных, затем создаю набор, содержащий головоломку.Набор использует структуру для хранения координат x, y и идентификатора.Это моя структура:

struct tile {
int id;
int xCord;
int yCord;

tile(int a, int b, int c) :
    id(a),
    xCord(b),
    yCord(c) {}


bool operator<(const tile& Rhs) const {

    if (xCord < Rhs.xCord)
        return true;
    else if (xCord > Rhs.xCord)
        return false;
    else if (xCord == Rhs.xCord) {
        if (yCord < Rhs.yCord)
            return true;
        else if (yCord < Rhs.yCord)
            return false;
        else
            return false;
    }
}

void print() const {
    cout << "Node - id=" << id << " Coordinates=(" << xCord << "," << yCord << ")" << endl;
}
};

На данный момент мне нужно перетасовать головоломку, которая включает в себя поиск пустой плитки с идентификатором 0.Я не могу понять, как использовать функцию find с настройками моего устройства.

Пока я использовал это, но есть синтаксическая ошибка:

set<tile>::iterator it = puzzleSet.find(0);

Вот мое объявление набора:

set<tile> puzzleSet;

Может ли кто-нибудь помочь мне в этом?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Синтаксическая ошибка в том, что set<tile>::find ожидает другого tile, а не int.В C ++ 14 добавлены новые перегрузки, которые позволяют выполнять поиск по другому типу, см. ref .Этот источник также говорит, что для их включения компаратор set должен быть прозрачным .Компаратором по умолчанию является std::less<tile>, который, насколько мне известно, явно не считается прозрачным.Поэтому решение состоит в том, чтобы определить пользовательский компаратор:

struct comp
{
public:
    using is_transparent = void;//Can be anything, just needs to be defined.
    constexpr bool operator()(const tile &lhs, const tile &rhs) const
    {
        return lhs < rhs;//You should reimplement to create proper ordering.
    }
    constexpr bool operator()(const tile &lhs, int ID) const
    {
        return lhs.ID < ID;//You should reimplement to create proper ordering.
    }
    constexpr bool operator()(int ID, const tile &rhs) const
    {
        return ID < rhs.ID;//You should reimplement to create proper ordering.
    }
};
#include <set>

int main() {
    std::string buffer = "a s d f ";
    std::cout << "Before " << buffer << std::endl;
    std::set<tile, comp> set;
    set.find(0);//Should compile and find the tile with zero ID
}

Примечание компаратор должен создать такой же слабый порядок для всех перегрузок вработать правильно.Ваша реализация operator< этого не делает, потому что, как указал @Alexander в своем ответе, ваши плитки не сортируются по идентификаторам.

РЕДАКТИРОВАТЬ: так что не используйте комп как он есть сейчас, вы должны изменитьреализация для правильного создания заказа.

0 голосов
/ 23 сентября 2018

ваш набор упорядочен по координатам, поэтому ваш набор не может помочь вам найти по идентификатору.Возможное решение: std::find_if(puzzleSet.begin(), puzzleSet.end(), [id](puzzleSet const & item){ return item.id == id; });

, если линейный поиск слишком дорогой.Вы можете добавить другой набор, который упорядочен по id.или попробуйте заказать ваш набор по id и координатам (если применимо)


небольшая опечатка в вашем коде:

if (yCord < Rhs.yCord)
        return true;
    else if (yCord < Rhs.yCord) // here should be >
        return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...