C ++比较向量

时间:2013-02-19 22:46:16

标签: c++ vector comparison

我有一个班级Table,其成员函数std::vector<Attribute> attributeVec();,其中Attribute是一个单独的类。

我正在使用想要执行

形式的代码
if (tableA.attributeVec() == tableB.attributeVec()){ ...

其中tableAtableBTable个对象。 我在Visual Studio 2012中遇到了很多奇怪的编译器错误,比如

binary '==' : no operator found which takes a left-hand operand of type 'const DatabaseAPI::Attribute' (or there is no acceptable conversion)

所以我相信这些载体不能那样比较。 如果我能将这段代码编译成,这将使我的生活更轻松,但我怎么能这样做?我可以定义运算符吗?我是否需要重写一些Attribute类,以便对它们进行比较?

细节:在编写API之后,我得到了一组测试,如果合理的话,需要工作。虽然我认为这至少会对我的代码做出不合理的假设(给定我的API),但在我的代码中实现它并没有什么坏处。

谢谢!

4 个答案:

答案 0 :(得分:2)

您需要在operator==课程中实施Attribute

class Attribute {
  bool operator== (const Attribute& other) const {
   // return true if *this == other, otherwise return false
  }
}
顺便说一下:正如juanchopanza注意到的那样,你可能只能从attributeVec()函数返回对向量的引用,而不是它的副本:

std::vector<Attribute>& attributeVec();

这会更有效,并且在表达式中进行比较(使用operator==):

o1.attributeVec() == o2.attributeVec()

仍然可以正常工作。

答案 1 :(得分:2)

可以使用==来比较向量,但是它们包含的类型(在这种情况下为Attribute)必须具有比较operator==。如果您将其提供给Attribute类,则比较应该有效。

一个无关的说明,他的方法

std::vector<Attribute> attributeVec();

正在返回矢量的副本。你必须考虑这是否是你真正想要的行为。

答案 2 :(得分:1)

错误基本上是不言自明的,operator==上需要Attribute

答案 3 :(得分:1)

看看std::equal;第二种形式允许您指定自己的比较功能。

示例:

bool compareAttributes (const Attribute &a, const Attribute &b) { /* ... */ }

// assumes attributeVec() returns a reference; if not, then remove '&'
const std::vector<Attribute>& attribsA = tableA.attributeVec();
const std::vector<Attribute>& attribsB = tableB.attributeVec();

if(attribsA.size()==attribsB.size() &&
    std::equal(attribsA.begin(), attribsA.end(),
    attribsB.begin(), compareAttributes))
{ /* ... */ }

理想情况下,attributeVec()会向属性向量返回引用。如果您不能这样写,那么attribsAattribsB不应该被定义为引用。 (在这种情况下,您可以考虑为Table编写一个不需要生成Attribute向量的比较函数。)