std::find 在具有重载 == 运算符的对象向量上

std::find on vector of objects with overloaded == operator

我正尝试在以下矢量上使用 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 class 的定义。

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找不到一个项目,即使该项目存在于向量中。

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 这个替代方案,并与您的初始尝试进行了比较。