std :: sort и std :: уникальная проблема со структурой

Следующий код:

#include <vector>
#include <algorithm>

struct myStructDim
{
    int     nId;
    int     dwHeight;
    int     dwWidth;
};    

void main()
{
    ::std::vector<myStructDim>  m_vec_dim;

    ::std::sort(m_vec_dim.begin(), m_vec_dim.end());
    m_vec_dim.erase(
        ::std::unique(m_vec_dim.begin(), m_vec_dim.end()),
        m_vec_dim.end()
        );
}

не будет компилироваться со многими ошибками, такими как:

ошибка C2784: 'bool std :: operator == (const std :: vector ‹_Ty, _Alloc> &, const std :: vector‹ _Ty, _Alloc> &)': не удалось вывести аргумент шаблона для 'const std :: vector ‹_Ty, _Alloc> & 'из myStructDim'

Я понимаю, что мне нужно переопределить одного или двух операторов.

Какие и как именно понравятся?

Спасибо за поддержку!


person Poni    schedule 04.09.2010    source источник


Ответы (4)


Вам нужны операторы сравнения, чтобы выразить отношения «меньше» и «равенство». Определение автономных логических функций operator< и operator==, которые принимают два аргумента, каждый const myStructDim&, и выполняют сравнение именно так, как вам нужно, вероятно, проще, чем определять их как методы в struct.

person Alex Martelli    schedule 04.09.2010
comment
Ага. Не был в этом уверен. Большое спасибо! - person Poni; 04.09.2010

Вам нужна функция сравнения для sort и функция сравнения для unique.

person Billy ONeal    schedule 04.09.2010

Как и другие, упомянутые operator ‹и operator == сработают, но я обычно предпочитаю передавать предикат сравнения.

В этом примере я использую лямбда-выражения C ++ 0x, но его можно реализовать и без этого.

   std::sort(
      vec_dim.begin(), 
      vec_dim.end(), 
      [] (myStructDim const & l, myStructDim const & r) {return l.nId < r.nId;}
      ); 

   vec_dim.erase( 
      std::unique(
         vec_dim.begin(), 
         vec_dim.end(),
         [] (myStructDim const & l, myStructDim const & r) {return l.nId == r.nId;}
         ), 
      vec_dim.end() 
      ); 
person Just another metaprogrammer    schedule 04.09.2010

Разве нельзя иметь какой-то уникальный без оператора>? Я имею в виду, что могу понять, что для уникальности мне нужен оператор == (например, яблоки не стулья), но почему стул должен быть больше яблока ??? Мне бы пришлось реализовать оператор для некоторых объектов, где это не имеет смысла! может быть, какое-то объяснение имело бы больше смысла. Поэтому я решил реализовать вопрос для себя, вот, на мой взгляд, решение, которое имеет больше смысла:

шаблон inline void uniques (listtype In, listtype и Out) {Out.resize (In.size ()); std :: copy (In.begin (), In.end (), Out.begin ()); listtype :: iterator it = Out.begin (); listtype :: iterator it2 = Out.begin (); it2 ++; int tmpsize = Out.size ();

    while(it!=Out.end())
    {
    it2 = it;
    it2++;
    while((it2)!=Out.end())
        {
        if ((*it)==(*it2))
            Out.erase(it2++);
        else
            ++it2;
        }
    it++;

    }
}

возможно не лучшее решение, но на данный момент я не знаю лучше

person jamk    schedule 21.01.2013