C++ std::在重载==运算符的对象的向量上查找
我试图在以下向量上使用std::find:C++ std::在重载==运算符的对象的向量上查找,c++,operator-overloading,C++,Operator Overloading,我试图在以下向量上使用std::find: std::vector<LoopDetectorData *> Vec_loopDetectors; std::find似乎无法找到项,即使该项存在于向量中。std::find()按值搜索。因此,它会将存储在向量中的指针与刚创建用作搜索参数的指针进行比较。这可能会失败:比较指针,而不是所指向对象的值 您应改用: auto counter = std::find_if (Vec_loopDetectors.begin(),
std::vector<LoopDetectorData *> Vec_loopDetectors;
std::find似乎无法找到项,即使该项存在于向量中。std::find()
按值搜索。因此,它会将存储在向量中的指针与刚创建用作搜索参数的指针进行比较。这可能会失败:比较指针,而不是所指向对象的值
您应改用:
auto counter = std::find_if (Vec_loopDetectors.begin(),
Vec_loopDetectors.end(),
[&searchFor](const LoopDetectorData *f)->bool
{ return *f == *searchFor; }
);
find_if使用一个谓词,这里是一个特殊的lambda函数,它通过取消引用指针来比较指向的值。如果您对lambdas不满意,可以使用函数poitner
这里是这个替代方案的一个例子,与您最初的尝试进行比较 您不能为内置类型(包括指针)重载运算符。您的
vector
包含LoopDetectorData*
,因此std::find
将比较指针是否相等,而searchFor
将永远不会与vector
中已有的任何指针进行相等比较。在所有可能的情况下,您应该使用std::vector Vec\u检测器
由于您刚刚创建了搜索
,因此向量中不可能有指向它的指针。谢谢大家。我得到了它。为什么我得到这么多的反对票!:)
class LoopDetectorData
{
public:
char detectorName[20];
char lane[20];
char vehicleName[20];
double entryTime;
double leaveTime;
double entrySpeed;
double leaveSpeed;
LoopDetectorData( const char *str1, const char *str2, const char *str3, double entryT=-1, double leaveT=-1, double entryS=-1, double leaveS=-1 )
{
strcpy(this->detectorName, str1);
strcpy(this->lane, str2);
strcpy(this->vehicleName, str3);
this->entryTime = entryT;
this->leaveTime = leaveT;
this->entrySpeed = entryS;
this->leaveSpeed = leaveS;
}
friend bool operator== (const LoopDetectorData &v1, const LoopDetectorData &v2);
};
auto counter = std::find_if (Vec_loopDetectors.begin(),
Vec_loopDetectors.end(),
[&searchFor](const LoopDetectorData *f)->bool
{ return *f == *searchFor; }
);