std :: sort и std :: unique проблема со структурой - PullRequest
1 голос
/ 04 сентября 2010

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

#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 '

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

Какие и как именно, пожалуйста?

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

Ответы [ 4 ]

4 голосов
/ 04 сентября 2010

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

1 голос
/ 04 сентября 2010

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

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

   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() 
      ); 
1 голос
/ 04 сентября 2010

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

0 голосов
/ 21 января 2013

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

шаблон встроенный void unique (listtype In, listtype & Out) { Out.resize (In.size ()); станд :: копия (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++;

    }
}

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

...