不能在标准向量中插入自己的结构,但是字符串可以
Can not insert own structure in standard vector but string can
我做了一个简单的结构:
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;
}
相关文章:
- C++结构到字符串
- 从字符串中获取结构的大小
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 如何解析表示树状数据结构的字符串
- 如何将字符串与结构(也包括字符串)进行比较?
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 在向量 C++14(无限制联合)的结构内的联合中创建和存储字符串
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 将字符串存储在 constexpr 结构中
- 为什么我的结构在包含字符串时崩溃?
- 如何将字符串字符与结构数组进行比较?
- 无法使用 strcpy 将字符串复制到静态结构成员
- c++ 将函数参数(带有模板变量的结构)转换为函数体内的字符串
- 在 c++ 中使用字符串变量选择静态类结构,而不带对象
- C++使用旧编译器GCC 4.4.0在结构列表中查找字符串
- 具有字符串成员的结构的动态数组
- 如何将文本文件保存到C 中的字符串结构
- C++ 斯特劳斯特鲁普的"std_lib_facilities.h"字符串结构 – 警告:无符号表达式的比较
- C++:字符串结构相等
- 返回字符串结构是否安全