根据条件将元素从std :: vector复制到std :: set但它崩溃了

时间:2014-03-05 20:15:15

标签: c++ stdvector stdset

class Information
{
public:

    const std::string comp_num() const;
    const std::string comp_address() const;

    void set_comp_address( const std::string& comp_address );
    void set_comp_num( const std::string& comp_num );

private:
    std::string comp_address_;
    std::string comp_num_;
};

class Compare
{
public:
    bool operator()(Information lf, Information rt)
    {
        return( lf.comp_num() == rt.comp_num() );
    }
};

// somwhere in function 
 std::set< Information ,Compare> test_set;
    for(  std::vector< Information >::iterator  i = old_vector.begin() ; i != old_vector.end(); ++i  )
     {
         // store all sub_cateeogroy in set
          std::cout << i->comp_num() << std::endl;// works fine 
          test_set.insert( *i ); // fails why ? Application crashes

     }

1 个答案:

答案 0 :(得分:0)

std::set要求比较器保留strict weak ordering个元素。你的比较器没有,因为它不能满足反射性和不对称性要求,也可能是其它因素。将比较器更改为以下内容将修复错误,但可能无法保留所需的语义。

class Compare
{
public:
    bool operator()(Information const& lf, Information const& rt) const
    {
        return( lf.comp_num() < rt.comp_num() );
    }
};

请注意,不需要将参数更改为Information const&,但它可以避免不必要的复制。