在列表中查找元素c ++

时间:2015-08-05 20:41:12

标签: c++ list find

我想在列表中找到一个元素:

#include <iostream>
#include <algorithm>
#include <list> 

using namespace std;

class Testing {
public: 
Testing();
}

list<Testing> Testing_List;

Testing Testing_Object;

auto List_Index = find(Testing_List.begin(), Testing_List.end(), Testing_Object);

它给了我错误信息

Semantic Issue. Invalid Operands to binary expression 


template <class _InputIterator, class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
_InputIterator
find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
{
    for (; __first != __last; ++__first)
        if (*__first == __value_)
            break;
    return __first;
}

可能是因为没有为Testing类定义的正确比较运算符==。所以我做的是尝试为Testing类定义==运算符,如下所示:

bool operator==(const Testing & lhs, const Testing & rhs) {
    return &lhs == &rhs;
}

仍然没有运气!你能告诉我什么是错的吗?我该如何在Testing对象列表中找到元素?

非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

你的错误是将operator==放在Testing类中。它应该是一个全球性的功能。

bool operator==(const Testing & lhs, const Testing & rhs) {
    return &lhs == &rhs;
}

我忽略了你对operator==的实际定义,我会假设你知道你在做什么。

答案 1 :(得分:1)

首先是这个运算符

bool operator==(const Testing & lhs, const Testing & rhs) {
    return &lhs == &rhs;
}

对于容器和声明为

的搜索元素没有意义
list<Testing> Testing_List;

Testing Testing_Object;

因为它将列表中元素的地址与局部变量的地址进行比较,对于列表的所有元素,该地址变量的地址明显不同。如果您知道列表中某些元素的地址,则可以使用此运算符。

例如

#include <iostream>
#include <list>
#include <algorithm>

class Testing 
{
public: 
    Testing() = default;
};

bool operator==(const Testing & lhs, const Testing & rhs) {
    return &lhs == &rhs;
}

int main()
{
    const size_t N = 10;

    std::list<Testing> Testing_List;
    Testing *sixthElement;

    for ( size_t i = 0; i < N; i++ )
    {
        Testing_List.push_back( Testing() );
        if ( i + 1 == 6 ) sixthElement = &Testing_List.back();
    }

    auto it = std::find( Testing_List.begin(), Testing_List.end(), *sixthElement );

    if ( it != Testing_List.end() ) std::cout << "Wow, the sixth element is found!" << std::endl;
    else std::cout << "It is the end of the World" << std::endl;
}    

程序输出

Wow, the sixth element is found!

然而,使用这种方法没有多大意义。

您应该在类中定义一些属性,并使用它们来比较类的对象。在这种情况下,您不应该在运算符的主体中使用指针。

例如

class Testing 
{
public: 
    Testing( int i = 0 ) aProperty( i ) {}
    int getProperty() const { return aProperty; }
private:
    int aProperty;
};

bool operator ==( const Testing &lhs, const Testing &rhs ) 
{
    return lhs.getProperty() == rhs.getProperty();
}