带有自定义类指针的矢量查找
Vector find with pointers of custom class
我试图了解在 STL(SCL) 中使用自定义类时需要重载的运算符。
任何人都可以告诉我我做错了什么吗?
class myClass
{
public:
int data;
myClass()
{
data =0;
cout<<"Default const "<<endl;
}
myClass(int x)
{
data = x;
cout<<"Int constructor"<<endl;
}
myClass(const myClass &m)
{
cout<<"Copy constructor"<<endl;
}
bool operator == (const myClass &temp)
{
cout<<"Operator called &";
return data == temp.data;
}
bool operator == (const myClass *temp)
{
cout<<"Operator called *";
return data == temp->data;
}
};
int main ()
{
/*
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), meObj);
*/
vector<myClass*> myVec;
myClass temp;
myVec.push_back(&temp);
myClass temp2(19);
myVec.push_back(&temp2);
myClass temp3(19);
vector<myClass*>::iterator it = find(myVec.begin(),myVec.end(),&temp2); //works
if(it!=myVec.end())
{
cout<<"Value is "<<(*it)->data;
}
vector<myClass*>::iterator dit = find(myVec.begin(),myVec.end(),&temp3); //fails
if(dit!=myVec.end())
{
cout<<"Value is "<<(*dit)->data;
}
cout << endl;
return 0;
}
如果我错了,请纠正我,但第一个发现就像地址比较一样有效。我需要重载什么才能使上述工作?
两个签名有意义吗?
bool operator == (const myClass &temp); // seen in many places
bool operator == (const myClass *temp); // what if two pointer types of same object are being compared?
干杯!
运算符重载必须至少有一个用户定义类型。 因此,例如,您不能为两个指针重载operator==
。
您的myClass::operator==(const myClass *temp)
在编译的意义上是有效的,但语义意义很小,因此不建议这样做(在极少数情况下,您希望执行T x; T *y; ... (x == y)
)。
对于您有指针向量的情况,您可能需要考虑 std::find_if
,它需要一个谓词。 像这样:
class CompareByPointer
{
public:
explicit CompareByPointer(const myClass &p) : p(p) {}
bool operator() (const myClass &rhs) const { return p->data == rhs->data; }
private:
const myClass &p;
};
...
find_if(myVec.begin(), myVec.end(), CompareByPointer(&temp2));
[作为旁注,通常应尽可能const
定义成员函数。 因此,您的操作员过载应该const
。
在示例代码中,您尚未将&temp3
推送到myVec
中。因此,第二个std::find
失败是有道理的。
在这种情况下,"工作"是什么意思? 通常,当您存储指针时,这是因为对象确实具有标识,比较地址是正确的做法。 否则,您可能应该存储值(尽管有例外)。 无论如何,您始终可以使用 find_if
,以及您想要的任何比较标准。 对于除了最简单的类型之外的任何东西,我发现自己使用find_if
的频率都比find
多;通常,您不是在寻找平等,而是在寻找某种特定类型的匹配。例如,在这里,您更可能需要以下内容:
std::vector<MyClass>::iterator it = std::find_if( myVect.begin(), myVect.end(),
boost::bind(&MyClass::id, _1, 19) );
(假设此处的data
是某种标识符,并且您已经提供了一个成员函数,myClass::id()
读取它。
相关文章:
- 重载解析、名称查找和函数指针
- 有没有办法在递归中使用指针来查找数组的最小值?
- 查找排序的容器,其中指向元素的指针在添加/删除时不会更改
- 如何查找指向数组中元素的指针的索引
- 查找并将指针返回向量中的对象
- 如何从链表指针字符中查找字符
- 指向符号的指针与常规符号查找的 ABI 稳定性
- 如何通过也在向量中的指针查找作为类成员的向量的大小
- 使用C RTTI(内置)通过字符串查找功能指针
- 如何通过将数组的指针传递给函数来查找数组的模式?C++
- 如何在具有非常量指针键的地图中通过常量指针键查找
- 无法使用指针查找正确的元素 - 从函数返回时,对象上的 poiting 为 null
- 如何在 c++ 中查找文件指针位置
- 从堆栈指针中查找函数参数值
- 使用动态内存分配和指针查找最大值、最小值和平均值
- std::在对象指针的向量上查找
- 反向查找指针,以n在CSTRING中出现一个字符
- 使用原始内存地址查找指针/类
- 正在查找指针的类型
- 查找指针指向的数组的大小