【问题标题】:How can I find a minimum value from a vector of entities?如何从实体向量中找到最小值?
【发布时间】:2022-01-05 12:00:13
【问题描述】:
class enemy{
    ....
}

std::vector<std::unique_ptr<enemy> > enemies1;

for (unsigned i = 0; i < 3; ++i)
    enemies1.emplace_back(...);

for (int i = 0; i < enemies1.size(); i++) {
    std::cout << i <<"x: " << enemies1[i]->rect.getPosition().x << std::endl;
}

输出:

100
200
400

如何从向量中的多个敌人获得最小坐标值?我想检测离玩家最近的敌人,例如玩家的坐标是 50,敌人在 100、200、400,如上例所示。我想检测向量中最近的敌人。

【问题讨论】:

标签: c++ class vector


【解决方案1】:

您可以使用

中的 min_element
#include <algorithm>
#include <iostream>
#include <vector>

struct enemy_t
{
    explicit enemy_t(const double d) :
        distance{ d }
    {
    }

    double distance;
};

int main()
{
    // create a vector of enemies using the constructor with one double
    std::vector<enemy_t> enemies{ 100.0,400.0,200.0,10.0 };

    // the last argument to min_element is a lambda function 
    // it helps you define by what condition you want to find your element.
    auto enemy = std::min_element(enemies.begin(), enemies.end(), [](const enemy_t& lhs, const enemy_t& rhs)
    {
        return lhs.distance < rhs.distance;
    });

    std::cout << "The minimum distance found = " << enemy->distance << "\n";

    return 0;
}

【讨论】:

  • 正确的想法,错误的实现。您需要让 lambda 捕获玩家的位置,然后让 lambda 返回 2 个参数中哪个更接近该位置。 min_element() 的结果将是一个迭代器,指向离玩家最近的敌人。
  • 是的,完全正确
  • 感谢您花时间和答案...
【解决方案2】:

找出你可以使用的最小值:

auto result = std::min_element(enemies.begin(), enemies.end(), [](auto a, auto b){return a->rect.getPosition()< b->rect.getPosition();});
std::cout<<"minimum is: "<<(**result).rect.getPosition()<<std::endl;

上面的例子会打印出你想要的最近(最小)enemy 的位置。您只需将以上两条语句添加到您的程序中即可。

为了确认这是可行的(编译并给出预期的结果),下面我给出了一个例子,其输出可以看到here

#include <vector>
#include <iostream>
#include <algorithm>
struct Rectangle
{
    int getPosition() const 
    {
        return position;
    }
    Rectangle(int p):position(p)
    {
        
    }
    int position = 0;
};
struct enemy 
{
    Rectangle rect;
    enemy(int p): rect{p}
    {
        
    }

};
int main()
{
    std::vector<enemy*> enemies;
    enemy e1(600),e2(200),e3(400),e4(300), e5(100);
    enemies.push_back(&e1);
    enemies.push_back(&e2);
    enemies.push_back(&e3);
    enemies.push_back(&e4);
    enemies.push_back(&e5);
    
    auto result = std::min_element(enemies.begin(), enemies.end(), [](auto a, auto b){return a->rect.getPosition()< b->rect.getPosition();});
    std::cout<<"minimum is: "<<(**result).rect.getPosition()<<std::endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-01-10
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多