【问题标题】:std::find on vector of objects with overloaded == operatorstd::find 重载 == 运算符的对象向量
【发布时间】:2015-05-22 21:54:05
【问题描述】:

我正在尝试在以下向量上使用 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);

这是带有 operator == 重载的 LoopDetectorData 类的定义。

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

【问题讨论】:

  • 您不能为内置类型重载运算符,包括指针。
  • 您的vector 包含LoopDetectorData *,因此std::find 将比较指针是否相等,而searchFor 永远不会与vector 中已有的任何指针进行比较.您很可能应该使用std::vector&lt;LoopDetectorData&gt; Vec_loopDetectors;
  • 由于你刚刚创建了searchFor,指向它的指针不可能在向量中。
  • 谢谢大家。我得到了它。为什么我收到这么多负票! :)

标签: c++ operator-overloading


【解决方案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 使用一个谓词,这里是一个 ad-hoc lambda 函数,它比较通过取消引用指针指向的值。如果您对 lambdas 不满意,则可以使用函数 poitner 代替。

这里是此替代方案的live demo,与您最初的尝试进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2013-11-10
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多