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
相关产品推荐
相关产品推荐

