如何从std :: vector搜索和返回项目

问题描述 投票:2回答:2

在当前情况下,我有一个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。

c++ vector stl
2个回答
1
投票

返回值的类型为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();
}

0
投票

实际上,您既可以返回表示已成功找到元素的布尔值,也可以返回从函数中对该特定元素(或找到的值)的实际迭代器。为了实现这一点,您应该使用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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.