所以我试图了解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的实现是否正确,正确的方法是什么?
答案 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()