结构的std :: sort和std :: unique问题

时间:2010-09-04 02:36:35

标签: c++ stl operators compilation 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&lt; _Ty,_Alloc&gt;&amp;,const std :: vector&lt; _Ty,_Alloc&gt;&amp;)':   无法推断出模板参数   'const std :: vector&lt; _Ty,_Alloc&gt; &安培;”从   'myStructDim'

我知道我必须覆盖一两个运算符。

哪些以及如何取悦?

感谢您的支持!

4 个答案:

答案 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++;

    }
}

也许不是最好的解决方案,但目前我不认识更好的人