Следующий код:
#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'
Я понимаю, что мне нужно переопределить одного или двух операторов.
Какие и как именно понравятся?
Спасибо за поддержку!
Ответ 1 · рейтинг 4 · Alex Martelli
Вам нужны операторы сравнения, чтобы выразить отношения "меньше" и "равенство". Определение автономных логических функций operator< и operator==, которые принимают два аргумента, каждый const myStructDim&, и выполняют сравнение именно так, как вам нужно, вероятно, проще, чем определять их как методы в struct.
Ответ 3 · рейтинг 1 · Just another metaprogrammer
Как и другие, упомянутые 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()
);
Ответ 4 · jamk
Разве нельзя иметь какой-то уникальный без оператора>? Я имею в виду, что могу понять, что для уникальности мне нужен оператор == (например, яблоки не стулья), но почему стул должен быть больше яблока ??? Мне бы пришлось реализовать оператор для некоторых объектов, где это не имеет смысла! может быть, какое-то объяснение имело бы больше смысла. Поэтому я решил реализовать вопрос для себя, вот, на мой взгляд, решение, которое имеет больше смысла:
шаблон 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++;
}
}
возможно не лучшее решение, но на данный момент я не знаю лучше