-2

我做了简单的结构:

struct sToken
{
    std::string token;
    unsigned int lineNb;
};

我想使用push_back()方法将此结构插入标准向量中,但是当我这样做时:

std::vector<sToken> result;
result.push_back(tkn); //compiler-error

我收到以下错误消息: no match for operator== in __first__gnu_cxx::__normal_iterator<_Iterator,_Container>::operator*<sToken*,std::vector<sToken> >()== in stl_algo.h

但是,如果我想输入标准字符串,一切都可以:

std::vector<std::string> result;
result.push_back(tkn.token); //OK

我看到编译器在抱怨operator==,但是为什么呢?operator==当我只想将结构放入向量时,为什么要在这种情况下提供?如果我必须实现这个运算符,你能告诉我应该如何实现它吗?谢谢。

4

3 回答 3

1

正如您所说,您正在使用 std::find,您需要在结构上重载运算符 ==

struct sToken
{
    std::string token;
    unsigned int lineNb;
    bool operator ==(const sToken& ref )
    {
        return ref.token.compare( this->token ) == 0;
    }
};

在此示例中,token将用于区分(识别)此结构与其他结构。您当然可以将其更改为您想要的任何内容

编辑

如果您想按照评论所述使用std::find查找,std::string tkn.token 则需要像这样重载它:

bool operator ==(const std::string ctoken)
{
    return ctoken.compare( this->token ) == 0;
}

您必须这样做,因为std::find会将向量成员与您的sToken对象进行比较。

于 2013-06-21T09:37:55.273 回答
1

C++11、25.2.5 查找

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);

1 范围 [first,last) 中满足以下相应条件的第一个迭代器 i:*i == value , [...]。如果没有找到这样的迭代器,则返回 last。

这表明 find 将使用operator==查找所需的元素。您需要operator==()像这样为您的类/结构实现:

struct sToken
{
    std::string token;
    unsigned int lineNb;
    bool operator== (sToken const & rhs) 
    { 
      return !token.compare(rhs.token) && (lineNb == rhs.lineNb); 
    }
};

或像这样:

struct sToken
{
    std::string token;
    unsigned int lineNb;
};
bool operator== (sToken const & lhs, sToken const & rhs) 
{ 
  return !lhs.token.compare(rhs.token) && (lhs.lineNb == rhs.lineNb); 
}

这将整个结构比较为相等。如果您只希望特定成员相互匹配:调整它。

于 2013-06-21T09:49:27.057 回答
1

嗨 chao 你需要重载operator ==。这是我的代码版本,效果很好。

#include <iostream>
#include <vector>

using namespace std;

struct sToken
{
    std::string token;
    unsigned int lineNb;

    bool operator == (const sToken& obj)
    {
        if(token.compare(obj.token) != 0)
            return false;

        if(lineNb != obj.lineNb)
            return false;

        return true;
    }
};

int main()
{
    struct sToken a1;
    a1.token = "jksdhfjksdf";
    a1.lineNb = 5;

    struct sToken a2;
    a2.token = "jksdhfjksdf";
    a2.lineNb = 5;

    if(a1 == a2)
        cout<< "jhfdhvhjdf"<<endl;

    vector<sToken> myVector;
    myVector.push_back(a1);
    myVector.push_back(a2);

    cout<<myVector.size();

    return 0;
}
于 2013-06-21T09:49:55.797 回答