我正在尝试在以下向量上使用std :: find:
std::vector<LoopDetectorData *> Vec_loopDetectors;
这就是我使用它的方式:
const LoopDetectorData *searchFor = new LoopDetectorData( (*it).c_str(), "", vehicleName.c_str() );
std::vector<LoopDetectorData *>::iterator counter = std::find(Vec_loopDetectors.begin(), Vec_loopDetectors.end(), searchFor);
这是LoopDetectorData类的定义,带有operator == overloading。
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);
};
即使项目存在于向量中,似乎std :: find也找不到项目。
答案 0 :(得分:1)
std::find()
按值搜索。因此,它会将存储在向量中的指针与刚刚创建的指针进行比较,以作为搜索参数。这是失败的:你比较指针而不是对象的值。
您应使用 std::find_if()
代替:
auto counter = std::find_if (Vec_loopDetectors.begin(),
Vec_loopDetectors.end(),
[&searchFor](const LoopDetectorData *f)->bool
{ return *f == *searchFor; }
);
find_if使用谓词,这里是一个特殊的lambda函数,用于比较解引用指针所指向的值。如果你对lambda不熟悉,你可以使用函数poitner。
这里有live demo这个替代方案,与你的初步尝试进行比较。