Написание собственного компаратора std::set для объекта, содержащего массив в С++

Я пытаюсь сделать свой вопрос простым здесь. У меня есть одна структура с массивом int в качестве переменной-члена.

struct elem
{
    elem (int a, int b, int c) {id[0]=a; id[1]=b; id[2]=c;}
    int id[3];
};

Я хочу поместить указатели на элементы в std::set, и я хочу использовать find() для поиска определенного объекта из этого набора позже, поэтому я хочу предоставить собственный компаратор для этого std::set.

struct compare
{
    bool operator() (elem *one, elem *two )
    {
            // logic 
    }
};

int main(int argc, char* argv[])
{
    std::set< elem *, compare> elemSet;
    std::set< elem *, compare>::iterator itr;

    elem ob1(2,5,9), ob2(5,9,7), ob3(4,3,7);

    elemSet.insert(&ob1);
    elemSet.insert(&ob2);
    elemSet.insert(&ob3);

    elem temp(4,3,7);
    itr = elemSet.find(&temp);

    if(itr != elemSet.end())
    {
        cout << endl << (*itr)->id[0] << " " << (*itr)->id[1] << " " << (*itr)->id[2]; 
    }

    return 0;
}

Не могли бы вы помочь мне с логикой для компаратора? Есть ли общая логика для массива любого размера?


person Shrik    schedule 29.11.2011    source источник
comment
Какая помощь вам нужна? Только вы должны знать, что должен делать оператор less для вашего класса   -  person BЈовић    schedule 29.11.2011
comment
Просто используйте вектор, в нем есть все, что вам нужно.   -  person v01d    schedule 29.11.2011
comment
Какую семантику вы хотите использовать для сравнения?   -  person Björn Pollex    schedule 29.11.2011
comment
@ v01d - я не могу использовать вектор, так как количество элементов может быть более 20 лакхов ..   -  person Shrik    schedule 29.11.2011
comment
@VladimirJovic Мне нужна логика, которая будет удовлетворять строгому слабому порядку ..   -  person Shrik    schedule 29.11.2011
comment
@BjörnPollex Я хочу сравнить идентификаторы, например if(one-›id[0] › two-›id[0]) return true;...   -  person Shrik    schedule 29.11.2011
comment
Я думаю, что если у вас достаточно памяти для массива, нет проблем с использованием вектора. Я могу ошибаться, просто не понимаю, как массив будет существовать с этим количеством элементов, а вектор не будет?   -  person v01d    schedule 29.11.2011


Ответы (1)


Поскольку std::setstd::map, и их варианты multi) требуют строго-слабого порядка, вам нужно обеспечить этот порядок через компаратор. Строго-слабый порядок требует, чтобы

(x < x) == false
(x < y) == !(y < x)
((x < y) && (y < z)) == (x < z)

Что может быть сложно реализовать для классов со многими членами (массив — это просто набор членов, если вы этого хотите).

В этот мой вопрос я спросил, если было разумно реализовать строгое-слабое упорядочение через tuple и tie, что делает его смехотворно простым:

struct compare
{
    bool operator() (elem const* one, elem const* two )
    {   // take 'tie' either from Boost or recent stdlibs
        return tie(one->id[0], one->id[1], one->id[2]) <
               tie(two->id[0], two->id[1], two->id[2]);
    }
};

Также обратите внимание, что я принимаю аргументы как указатели-на-const.

person Xeo    schedule 29.11.2011