所以我试图理解std::search。首先,我创建了一个类的数组,然后复制到一个向量中。
现在我正在尝试检查我的向量的内容是否出现在我的数组中(我已经修改了一个向量值,所以它们不会相同)。
就像矢量是空的,我也无法_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 调用 std::string 构造函数,但我不明白它为什么这么说。
我不知道我对std::search的实现是否正确,正确的方法是什么?
你使用这个版本的search
算法:
template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );
search
将迭代器返回到范围[first,last)
中第一次出现[s_first,s_last)
的开头。如果找不到该实例,则返回last
。您需要做的是检查it
值。没有-1
的版本崩溃search
因为返回carVector.end()
(您正在传递search
两个范围,这两个范围的长度相同,并且在一个范围内您修改了两个项目,因此search
无法在第一个范围中找到第二个范围的出现),并且当您调用getBrand()
时,您正在访问不存在的 vector 元素, 它导致未定义的行为。
std::vector<Car>::iterator it;
it = std::search(carVector.begin(), carVector.end(), std::begin(carArray), std::end(carArray));
if (it != carVector.end())
{
// carArray was found in carVector, do sth here with it
std::cout << it->GetBrand();
}