我有一个简单的类,我将其作为指针存储在向量中。我想在向量上使用find但是找不到我的对象。在调试时它似乎没有调用我提供的==运算符。我可以在调试器中“看到”对象,所以我知道它在那里。下面的代码甚至使用列表中第一项的副本,但仍然失败。我可以通过的唯一方法是使用MergeLine * mlt = LineList.begin(),它告诉我它正在比较对象而不是使用我的相等运算符。
class MergeLine {
public:
std::string linename;
int StartIndex;
double StartValue;
double FidStart;
int Length;
bool operator < (const MergeLine &ml) const {return FidStart < ml.FidStart;}
bool operator == (const MergeLine &ml) const {
return linename.compare( ml.linename) == 0;}
};
Class OtherClass{
public:
std::vector<MergeLine*>LineList;
std::vector<MergeLine*>::iterator LL_iter;
void DoSomething( std::string linename){
// this is the original version that returned LineList.end()
// MergeLine * mlt
// mlt->linename = linename;
// this version doesn't work either (I thought it would for sure!)
MergeLine *mlt =new MergeLine(*LineList.front());
LL_iter = std::find(LineList.begin(), LineList.end(), mlt);
if (LL_iter == LineList.end()) {
throw(Exception("line not found in LineList : " + mlt->linename));
}
MergeLine * ml = *LL_iter;
}
};
欢呼声, 马克
答案 0 :(得分:2)
由于容器包含指针而不包含对象,因此比较将在指针之间进行。指针相同的唯一方法是指向完全相同的对象。正如您已经注意到,对象本身的比较运算符永远不会被调用。
您可以使用std::find_if
并将其传递给比较对象以供使用。
class MergeLineCompare
{
MergeLine * m_p;
public:
MergeLineCompare(MergeLine * p) : m_p(p)
{
}
bool operator()(MergeLine * p)
{
return *p == *m_p;
}
};
LL_iter = std::find_if(LineList.begin(), LineList.end(), MergeLineCompare(mlt));
答案 1 :(得分:1)
我认为你真正想要的是像这样使用std::find_if
:
struct MergeLineNameCompare
{
std::string seachname;
MergeLineNameComp(const std::string &name) : seachname(name)
{
}
bool operator()(const MergeLine * line)
{
return seachname.compare( line->linename ) == 0;
}
};
LL_iter = std::find_if(LineList.begin(), LineList.end(), MergeLineNameCompare(linename) );
operator ==
(无论形式如何)可以更好地保存,以便真正比较平等。
答案 2 :(得分:0)
运算符重载不能用于指针,因为它不明确。
Bjarne Stroustrup: -
引用的引用主要是为了支持运算符重载。 C按值传递每个函数参数,并传递一个对象 按值来说,用户可以传递的效率低或不合适 指针。这种策略在运算符重载的情况下不起作用 用过的。在这种情况下,符号方便对于用户来说是必不可少的 如果对象是,则不能期望插入运算符的地址 大。
所以,可能不是最好但仍然: -
std::vector<MergeLine>LineList;
std::vector<MergeLine>::iterator LL_iter;