2010-09-04 3 views
1

Следующий код:станд :: сортировать и станд :: Единственная проблема с структуры

#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 станд: : оператор == (Const станд :: вектор < _Ty, _Alloc> &, Const станд :: вектор < _Ty, _Alloc> &) ': не может вывести аргумент шаблона для ' сопзЬ станд :: вектор < _Ty, _Allo с> & 'от „myStructDim“

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

Какие именно и как именно так?

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

ответ

4

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

+0

Угу. Не был уверен в этом. Большое спасибо! – Poni

+0

@ Пони, пожалуйста! –

1

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

0

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

В этом примере я использую 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() 
    ); 
0

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

шаблон инлайн недействительные уников (listtype В, listtype & Out) { Out.resize (В .размер()); 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++; 

    } 
} 

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