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

时间:2015-05-22 21:54:06

标签: c++ operator-overloading

我正在尝试在以下向量上使用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也找不到项目。

1 个答案:

答案 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这个替代方案,与你的初步尝试进行比较。