You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何从存储enemy实体的std::vector中查找最小坐标以获取最近敌人

实现方案

你可以通过两种常用方式实现该需求,以下代码均默认你需要比较x坐标的绝对距离差,如果是二维坐标可自行修改距离计算逻辑:

方法1:使用C++标准库std::min_element(推荐,代码更简洁)

首先需要引入对应的头文件:

#include <algorithm>
#include <cmath> // 用于计算绝对值

功能实现代码:

// 假设玩家x坐标为50,可替换为实际玩家坐标值
const int player_x = 50;

// 先判断vector非空,避免访问非法内存
if (enemies1.empty()) {
    // 没有敌人的处理逻辑,比如返回空指针
    return nullptr;
}

// 查找距离最近的敌人
auto nearest_enemy = std::min_element(enemies1.begin(), enemies1.end(),
    [player_x](const std::unique_ptr<enemy>& a, const std::unique_ptr<enemy>& b) {
        // 计算两个敌人和玩家的x坐标距离差,比较大小
        int dist_a = std::abs(a->rect.getPosition().x - player_x);
        int dist_b = std::abs(b->rect.getPosition().x - player_x);
        return dist_a < dist_b;
    });

// 拿到最近敌人的指针和坐标
enemy* target = nearest_enemy->get();
int nearest_x = target->rect.getPosition().x;
// 示例输出最近的坐标,你的测试用例下会输出100
std::cout << "最近敌人的x坐标:" << nearest_x << std::endl;

注意:必须优先判断vector是否为空,空容器下std::min_element返回的尾后迭代器不可解引用,会触发内存访问错误。

方法2:手动遍历实现(适合理解底层逻辑)

const int player_x = 50;
if (enemies1.empty()) {
    return nullptr;
}

enemy* nearest_enemy = nullptr;
// 初始化最小距离为极大值
int min_dist = INT_MAX;

for (const auto& e : enemies1) {
    int cur_dist = std::abs(e->rect.getPosition().x - player_x);
    if (cur_dist < min_dist) {
        min_dist = cur_dist;
        nearest_enemy = e.get();
    }
}

// 输出结果同方法1
std::cout << "最近敌人的x坐标:" << nearest_enemy->rect.getPosition().x << std::endl;

扩展说明

如果需要计算二维平面的距离,只需修改距离计算逻辑即可,为了避免开方的性能损耗,直接比较距离的平方大小即可,不会影响排序结果:

// 假设玩家坐标为(player_x, player_y),敌人坐标从rect.getPosition()同时取x、y即可
int dist_a_sq = (a->rect.getPosition().x - player_x) * (a->rect.getPosition().x - player_x) 
                + (a->rect.getPosition().y - player_y) * (a->rect.getPosition().y - player_y);

内容的提问来源于stack exchange,提问作者studyo34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:05