我如何使用std :: search来检查内容?正确的方法是什么?

时间:2018-12-13 19:43:33

标签: c++ algorithm search standard-library

所以我试图了解std ::搜索。首先,我创建了一个类的数组,然后将其复制到向量中。

现在,我正在尝试检查向量的内容是否出现在数组中(我已经修改了一个向量值,因此它们将不相同)。

就像矢量是空的一样,我也无法指出_brandName!

这是我的最佳尝试:

#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
#include <iterator>

class Car{
    public:
    Car(){};
    Car(std::string brand, double speed){_brandName = brand; _speed = speed};
    ~Car(){};

    bool operator==(const Car& rhs){return _brandName == _brandName;}
    std::string GetBrand(){return _brandName;}

    private:
    std::string _brandName;
    double _speed;

};

int main(){


    Car carArray[4];

    carArray[0] = Car("BMW", 280);
    carArray[1] = Car("FORD", 300);
    carArray[2] = Car("FORD", 380);
    carArray[3] = Car("AUDI", 380);

    auto arraySize = sizeof(carArray) / sizeof(carArray[0]);
    std::vector<Car> carVector(carArray, carArray + arraySize);
    carVector[0] = Car("Ferrari", 400);
    std::cout << carVector[0].GetBrand();

    std::vector<Car>::iterator it;
    it = std::search(carVector.begin(), carVector.end(), std::begin(carArray), std::end(carArray));
    std::cout << it->GetBrand();
    return 0;
}

我必须在向量末端加上-1,否则会出现错误: 抛出'std :: logic_error'实例后终止调用

what():basic_string :: _ M_construct null无效

我认为该错误是因为我试图用值NULL调用std :: string构造函数,但我不明白为什么这么说。

我也不知道我对std :: search的实现是否正确,正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

您使用此版本的search算法:

template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
                   ForwardIt2 s_first, ForwardIt2 s_last );

search将迭代器返回到[s_first,s_last)范围内[first,last)首次出现的开始处。如果找不到该事件,则返回last。您需要做的是检查it的值。没有-1的版本会因为search返回carVector.end()而崩溃(您要传入search两个范围,它们的长度相同,并且在一个范围内您修改了两个项目,因此{{ 1}}在第一个范围中找不到第二个范围的出现,并且当您调用search时,您正在访问不存在的vector元素,这将导致不确定的行为。

getBrand()