尝试使用 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
是未定义的行为。
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
是未定义的行为。