【问题标题】:How do i insert objects into STL set如何将对象插入 STL 集中
【发布时间】:2013-11-21 04:56:48
【问题描述】:

我正在尝试将对象 Point2D 插入到 Point2D 集中,但我无法做到,似乎该集适用于 int 和 char 但不适用于对象。

我需要帮助才能知道如何将对象插入集合中???假设我想按 x 值的升序对它们进行排序

class Point2D
{
public:
    Point2D(int,int);
    int getX();
    int getY();

    void setX(int);
    void setY(int);

    double getScalarValue();

protected:
    int x;
    int y;
    double distFrOrigin;
    void setDistFrOrigin();
};


int main()
{
    Point2D abc(2,3);

    set<Point2D> P2D;
    P2D.insert(abc); // i am getting error here, i don't know why
}

【问题讨论】:

  • 你需要为Point2Doperator&lt;
  • 你能详细说明一下吗,对不起我对c++很陌生
  • 一组已排序。如果它不能对你的对象进行排序,那么你就不能把它们放在一个集合中。排序是使用operator&lt; 或用户指定的谓词完成的。
  • 下次请提供您收到的错误信息。

标签: c++ stl set


【解决方案1】:

您需要为您的班级实现operator&lt; 重载。例如,在你的课堂上,你可以这样做:

friend bool operator< (const Point2D &left, const Point2D &right);

然后,在你的课堂之外:

bool operator< (const Point2D &left, const Point2D &right)
{
    return left.x < right.x;
}

编辑:根据 Retired Ninja 的建议,您也可以在您的类中将其实现为常规成员函数:

bool operator< (const Point2D &right) const
{
    return x < right.x;
}

【讨论】:

  • 我严重怀疑这个函子的逻辑是否足够。
  • 原发帖人说他/她需要做的只是基于 x 排序。当 std::set sorts 使用这个函数时,它不就是这样做的吗?
  • 无需将其设为免费功能,即可轻松成为会员。这些引用也应该是 const。
  • OP 认为他需要做的事情无关紧要。集合的键类型必须满足严格的弱排序,并且只考虑x 的比较函数会忽略所有其他成员。它严格有效吗?在我的脑海中,好吧,可能是的。这真的是OP想要的吗?疑。这是正确的解决方案吗?没有。
  • 退休忍者,你说得对,谢谢。轨道中的轻量级竞赛,对于一般情况,你当然是对的,但我只是给了 OP 他/她所要求的,对不起。
【解决方案2】:

std::set&lt;T&gt; 要求 std::less&lt;T&gt; 对于值类型 T 是已知的。这样它就可以对其元素进行排序,这是其内部工作方式的基础。

通过定义bool operator&lt;(const Point2D&amp;, const Point2D&amp;) 来解决此问题,只要它满足Strict Weak Ordering,就可以使用您选择的任何逻辑。

这是类型的要求,但是一旦你做到了,你就可以开始了。

【讨论】:

    【解决方案3】:

    我相信 C++ 11 或更新版本定义顺序的更好方法是使用自定义函子,因为 std::set 支持。

    我们可以看到 set 在 header &lt;set&gt; 中定义如下:

    template<
        class Key,
        class Compare = std::less<Key>,
        class Allocator = std::allocator<Key>
    > class set;
    

    因此,例如基于 x 进行比较:

    struct Point2DCmp
    {
        bool operator() (Point2D& p1, Point2D& p2)
        {
            return p1.getX() < p2.getX();
        }
    }
    
    set<Point2D, Point2DCmp> P2D;
    

    【讨论】:

    • 为什么更好?
    猜你喜欢
    • 2012-04-07
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多