在当前情况下,我有一个std :: vector,它填充了Vector3f对象(每个都有x,y和z值),它们充当网格顶点,我想获取播放器位置(也是Vector3f)并将其发送给函数可以在前面提到的网格顶点向量中的vector3f对象中搜索一个mach并返回匹配的Vector3f,以便我可以访问其y分量并使用它来设置层板高度。
我最近得到的是波纹管:
Vector3f Mesh::checkMeshVertices(Vector3f playerPos)
{
return std::find(meshVertices.begin(), meshVertices.end(), playerPos) != meshVertices.end();
}
但是,这将在匹配后返回true,我希望能够返回匹配的实际Vector3f。
返回值的类型为bool
,而函数的返回类型为Vector3f
。
由于返回的类型不是引用的类型,因此如果找到矢量,则可以在调用方中使用其传递的参数。因此,该函数只能返回布尔值,例如
bool Mesh::checkMeshVertices(Vector3f playerPos)
{
return std::find(meshVertices.begin(), meshVertices.end(), playerPos) != meshVertices.end();
}
如果要返回对找到的对象的引用,则该函数应在未找到该对象的情况下引发异常。
例如
Vector3d & Mesh::checkMeshVertices(Vector3f playerPos)
{
auto it = std::find(meshVertices.begin(), meshVertices.end(), playerPos);
if ( it != meshVertices.end() ) return *it;
else throw std::out_of_range();
}
实际上,您既可以返回表示已成功找到元素的布尔值,也可以返回从函数中对该特定元素(或找到的值)的实际迭代器。为了实现这一点,您应该使用C ++ 17的structured binding功能。
这里是一个简单的代码,您可以将其应用于您的案例:
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
std::pair<bool, std::vector<int>::const_iterator> find(std::vector<int> const& v, int number) {
auto it = std::find(v.begin(), v.end(), number);
if (v.end() == it) {
return std::make_pair(false, it);
} else {
return std::make_pair(true, it);
}
}
int main() {
std::vector<int> v = { 1, 2, 3, 4, 5 };
if (auto [success, iter] = find(v, 5); success) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
签出live
将此逻辑应用于您的示例将如下所示:
std::pair<bool, std::vector<Vector3f>::const_iterator> Mesh::checkMeshVertices(Vector3f playerPos) {
auto it = std::find(meshVertices.begin(), meshVertices.end(), playerPos);
if (meshVertices.end() == it) {
return std::make_pair(false, it);
} else {
return std::make_pair(true, it);
}
}