不能在标准向量中插入自己的结构,但是字符串可以

Can not insert own structure in standard vector but string can

本文关键字:字符串 结构 自己的 标准 向量 插入 不能      更新时间:2023-10-16

我做了一个简单的结构:

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==在这种情况下,当我只想把结构在向量?如果我必须实现这个算子,你能告诉我应该怎么实现它吗。谢谢。

正如您所说,您正在使用std::find,您需要在struct

上重载操作符==
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会将vector成员与sToken对象进行比较。

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,[…]。如果找不到最后一个迭代器,返回最后一个。

这表明find将使用操作符==查找所需的元素。您需要为您的类/结构实现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); 
}

将整个结构体比较为相等。

你好,你需要重载操作符==。这是我的代码版本,工作得很好。

#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;
}