【问题标题】:Equals operator on STL vector of pointers指针的 STL 向量上的等于运算符
【发布时间】:2017-02-12 19:10:47
【问题描述】:

我有 2 个向量,类型为指向 Point 的指针以利用多态思想,因为我有一些继承自 Point 类的点类。

vector<Point*> previous_points;
vector<Point*> current_points;

init_points(previous_points);
init_points(current_points);

do_some_proccess(previous_points);
do_some_proccess(current_points);

cout << (previous_points == current_points) << endl; // returns 0

即使内容相同, == 运算符也会返回 0,原因是(根据我的阅读和理解)它正在比较作为指针的向量内容,并且指针当然不一样( init_points 为每个向量创建具有相同内容的新对象)。

我的问题是,我仍然可以使用比较运算符并让它比较向量中指针的内容而不是指针本身吗?还是我必须实现自己的 is_content_equals 函数才能做到这一点?

编辑:我在 Point 类中实现了 equals == 运算符,因此它正在比较点的内容。

谢谢

【问题讨论】:

  • 如果指针不一样,则内容不一样。
  • 您的比较只会比较向量中的指针,而不是它们指向的对象。
  • 我已经在 Point 类中实现了 equals == 运算符,因此它可以比较内容。忘记说了。
  • @JoachimPileborg 这是我的问题,我是否需要实现自己的功能才能做到这一点?或者我仍然可以使用运算符?

标签: c++ pointers vector stl


【解决方案1】:

您不必推出自己的功能。您可以使用std::equal 和合适的谓词。这假定 operator==Point 工作。

bool ok = equal(begin(previous_points), end(previous_points),
                begin(current_points), end(current_points),
                [](const Point* lhs, const Point* rhs){ return *lhs == * rhs; });

在 C++14 之前,你可以使用这个重载。在这里,您需要确保current_pointsprevious_points 的长度相同。

bool ok = equal(begin(previous_points), end(previous_points),
                begin(current_points),
                [](const Point* lhs, const Point* rhs){ return *lhs == * rhs; });

【讨论】:

  • 哦,太好了,c++14 之前的重载对我有用。最后一个问题,由我来确保长度相同,你的意思是我需要进行这两项检查(长度和内容)才能像 == 那样有效地比较它?再次感谢,我想我需要更多地了解 C++ 上的 lambda 函数,这是我第一次在这种语言中使用它。
  • @DimaGimburg 是的,这就是我的意思。 std::equal 比较范围,C++11 之前的只设置第二个的开头。所以有两件事可能与== 不同。首先,第二个范围更长。 == 应该为假,但子范围可以等于第一个子范围。其次,第二个范围可能更短,在这种情况下,您会超出界限并得到未定义的行为,这是非常糟糕,必须避免。
  • 这个滚动你自己的函数^_^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多