【问题标题】:How can i use std::search to check contents? what is the right way? [closed]我如何使用 std::search 来检查内容?什么是正确的方法? [关闭]
【发布时间】:2019-05-15 02:12:54
【问题描述】:

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

【问题讨论】:

  • 为什么你的类在构造函数的第二个参数中使用双精度参数,但有一个std::string 成员? _value(value) 会导致坏事。
  • 您需要创建一个minimal reproducible example。你已经解决了你的问题,所以它是最小的,但是你需要创建一个小的可以编译的代码 sn-p。然后,我们只需将您的代码复制粘贴到我们的编译器中,然后自己查看。
  • 写错了,应该是双份的。
  • 搁置 NathanOliver 所说的话,这确实是导致编译时错误的原因(尽管编译器在给出错误时应该将您定向到该行);为什么要填充一个数组,然后从该数组中创建一个向量,而不是直接从一个向量开始?
  • 您的代码与您的问题描述不匹配。哪里有两个元素被修改?您当前的代码工作正常,因为两个范围是相同的。

标签: c++ algorithm search standard-library


【解决方案1】:

你使用这个版本的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 两个范围,两个范围都具有相同的长度,并且在一个范围中您修改了两个项目,所以search 找不到第二个范围的出现在第一个中),当您调用 getBrand() 时,您正在访问不存在的向量元素,它会导致未定义的行为。

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多