以下代码:
#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&lt; _Ty,_Alloc&gt;&amp;,const std :: vector&lt; _Ty,_Alloc&gt;&amp;)': 无法推断出模板参数 'const std :: vector&lt; _Ty,_Alloc&gt; &安培;”从 'myStructDim'
我知道我必须覆盖一两个运算符。
哪些以及如何取悦?
感谢您的支持!
答案 0 :(得分:4)
您需要比较运算符来表达“小于”和“相等”的关系。定义独立布尔函数operator<
和operator==
,它们采用两个参数,每个const myStructDim&
,并完全按照您的要求执行比较,可能比定义{struct
中的方法更简单{1}}。
答案 1 :(得分:1)
sort
需要某种形式的比较函数,并且unique
需要某种形式的相等函数。
答案 2 :(得分:1)
像其他提到的运营商&lt;和operator ==会做的伎俩,但我通常更喜欢传递比较谓词。
我在这个例子中使用了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()
);
答案 3 :(得分:0)
如果没有operato&gt;是否不可能有某种独特性? ?我的意思是我可以理解,对于独特我需要一个操作员==(像苹果不是椅子),但为什么椅子应该比苹果更大?我必须为一些没有意义的对象实现一个运算符!也许某种形式会更有意义。 所以我决定实现我自己的问题在我看来是一个更有意义的解决方案:
模板内联 void uniques(listtype In,listtype&amp; Out) { Out.resize(In.size()); 的std ::拷贝(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++;
}
}
也许不是最好的解决方案,但目前我不认识更好的人