尝试使用 std::find 时出现转换错误

Getting a conversion error when trying to use std::find

no suitable conversion function from "std::_Vector_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types<int, size_t, ptrdiff_t, int *, const int *, int &, const int &>>>>" to "int *" exists

当我将鼠标悬停在我的代码中的 "std::find" 上时会显示此信息。我在任何地方都找到了 0 个结果。我试过删除和添加指针,但无济于事。

我正在尝试编写一种算法,为我的游戏创建一个发生血液飞溅的位置向量。我的代码如下所示:

Blood.hpp

#pragma once
#include <vector>

class Blood {
public:
    int x, y;
    std::vector<int> bloodx;
    std::vector<int> bloody;

    Blood(int x, int y);
    void makeBloodied(int x, int y);
    bool isBloodied(int x, int y);
};

(我也对如何正确插入向量感到困惑,如果可以将其作为子问题回答,我将不胜感激。)

Blood.cpp

#include "main.hpp"

Blood::Blood(int x, int y) : x(x), y(y) {
}

void Blood::makeBloodied(int x, int y) {
    std::vector<int>::iterator it;
    bloodx.insert(it, x);
    bloody.insert(it, y);
}

bool Blood::isBloodied(int x, int y) {
    int *resultx = std::find(bloodx.begin(), bloodx.end(), x);

}

How to insert to a vector properly:

您可以使用 std::vector::push_back() 将某些内容放在末尾,或 std::vector::insert() 插入特定位置(在给定的迭代器处)。

对于你的情况,我认为你想做的是:

bloodx.push_back(x);

或者,如果您想将其插入索引 idx,您可以这样做:

bloodx.insert(bloodx.begin() + idx, x);

Why am I getting this error?

std::find的用法是正确的。但是,它 returns std::vector<int>::iterator,无法转换为 int *.

我建议使用 auto resultx,或者转换为 int *,如下所示:

// dereference iterator and take address (only if item found)
auto it = std::find(bloodx.begin(), bloodx.end(), x);
int *resultx = (it == bloodx.end()) ? NULL : &*resultx_it;

但是,要小心,因为如果向 std::vector 添加元素,指向其元素的迭代器和指针将失效。

How to check if an element was found

如果没有找到元素,std::find returns迭代器std::vector::end,它在vector结束之后。

bool found = std::find(bloodx.begin(), bloodx.end(), x) == bloodx.end();

注意不要在 int * 上强制转换,因为取消引用 std::vector::end 是未定义的行为。