Сортировать данные одним способом, но извлекать другим способом - PullRequest
0 голосов
/ 22 апреля 2020

У меня проблема с хранением чисел с плавающей точкой в ​​сортированном виде. Но при поиске я хочу использовать другой механизм. Текущее сохранение в std::set путем перегрузки < operator

bool operator < (const SpanStruct_Y &b) const
{
    CommonTypes::Point p1 = mobIdentifier.startPoint, p2 = mobIdentifier.startPoint;
    CommonTypes::Point p3 = b.mobIdentifier.startPoint, p4 = b.mobIdentifier.startPoint;
    editPoint(p1, span, 270.0f + spanOrientation);
    editPoint(p2, span, 90.0f + spanOrientation);
    editPoint(p3, b.span, 270.0f + b.spanOrientation);
    editPoint(p4, b.span, 90.0f + b.spanOrientation);
    return cmpPoint_Y(cmpPointR_Y(p1,p2),cmpPointR_Y(p3,p4));
}

Но при получении данных я хочу использовать, скажем, разные значения в идентификаторе. [mobileId and 2 index values]

struct uniqMobIdentifier
{
    CommonTypes::Point startPoint;
    uint16_t mobileId;
    uint16_t indexXInSpan;
    uint16_t indexYInSpan;

    uniqMobIdentifier()
    {
        startPoint = CommonTypes::Point();
        mobileId = DUMMY_ID;
        indexXInSpan = DUMMY_ID;
        indexYInSpan = DUMMY_ID;
    }

    uniqMobIdentifier(CommonTypes::Point p, uint16_t mobId, uint16_t x, uint16_t y)
    {
        startPoint = p;
        mobileId = mobId;
        indexXInSpan = x;
        indexYInSpan = y;
    }

    uniqMobIdentifier& operator =(const uniqMobIdentifier& a)
    {
        startPoint = a.startPoint;
        mobileId = a.mobileId;
        indexXInSpan = a.indexXInSpan;
        indexYInSpan = a.indexYInSpan;
        return *this;
    }

    bool operator==(const uniqMobIdentifier& a) const
    {
        return (((std::abs(startPoint.m_xCoordinate - a.startPoint.m_xCoordinate) < POINT_DISTANCE_TOLERANCE)
                || (std::abs(startPoint.m_yCoordinate - a.startPoint.m_yCoordinate) < POINT_DISTANCE_TOLERANCE))
                && mobileId == a.mobileId && indexXInSpan == a.indexXInSpan && indexYInSpan == indexYInSpan);
    }


    bool operator!=(const uniqMobIdentifier& a) const
    {
        return (/*((std::abs(startPoint.m_xCoordinate - a.startPoint.m_xCoordinate) > POINT_DISTANCE_TOLERANCE)
                || (std::abs(startPoint.m_yCoordinate - a.startPoint.m_yCoordinate) > POINT_DISTANCE_TOLERANCE))
                && */
                !(mobileId == a.mobileId) && !(indexXInSpan == a.indexXInSpan) && !(indexYInSpan == indexYInSpan));
    }


};

Возможно ли это сделать? Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 22 апреля 2020

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

Если ваши манипуляции с данными со временем станут все более и более сложными, вы можете рассмотреть возможность встраивания SQLite.

...