c++ - 添加元素后如何停止添加到 std::vector
问题描述
我正在尝试进行 boids 模拟。我目前正在做的是检查 boids 是否在彼此的范围内,如果它们在,则将它们的内存地址添加到std::vector
被调用withinSensoryRange
者中。这是代码。
struct Boid
{
float sensoryRadius = 50.0f;
std::vector<Boid*> withinSensoryRange;
};
std::vector<Boid> boids;
while (true)
{
for (int i = 0; i < boids.size(); i++)
for (int j = i; j < boids.size(); j++)
{
float distance = sqrtf((boids[i].position.x - boids[j].position.x) * (boids[i].position.x - boids[j].position.x) +
(boids[i].position.y - boids[j].position.y) * (boids[i].position.y - boids[j].position.y));
if (distance > boids[i].sensoryRadius)
{
boids[i].withinSensoryRange.push_back(&boids[j]);
boids[j].withinSensoryRange.push_back(&boids[i]);
}
}
}
我的问题是,只要它们在范围内,它就会每帧不断地添加到向量中。有没有办法检测它是否已经在向量中,如果是就不要添加它?谢谢。
解决方案
您可以使用std::find
来检查容器中是否已存在项目。或者您可以使用包含唯一键的容器,例如std::unordered_set
.
警告!!
存储地址时需要非常小心。如果对象移动或超出范围,则地址将变为无效。这实际上是您的示例中可能发生的情况,因为std::vector
会在调整大小时移动对象。
解决方案:
- 关联并存储一些唯一标识符
- 使用
std::unique_ptr
(std::vector<std::unique_ptr<Boid>> boids;
),这将确保对象不会移动(移动的是智能指针) - 制作
boids
vector或set const(在构造时对其进行初始化)并确保包含对象(如果有)不会在您通过指针的访问过程中移动。 - 使用在调整大小时不会使迭代器无效的容器,例如
std::list
我尝试以 std::unique_ptr 方式进行操作。当我尝试推回内存地址时它不起作用
withinSensoryRange
应该是原始指针的向量:
struct Boid
{
float sensoryRadius = 50.0f;
std::vector<Boid*> withinSensoryRange;
};
std::vector<std::unique_ptr<Boid>> boids;
//...
boids[i]->withinSensoryRange.push_back(boids[j].get())
推荐阅读
- php - PHP - 使用 ColorThief 提取图像颜色
- php - 如何创建一个按钮来向 OneSignal 发送通知?
- python - 但是要将字符串值转换为原始字符串作为 selenium chrome 驱动程序的下载路径
- webpack - Webpack babel-loader 是否需要 babel.config.js?
- jquery - 请,谁能告诉我如何清除修剪错误
- java - 嗨,我想通过 spring data JPA 为我的 crudrepository 实现搜索栏操作(按关键字返回所需数据)的 springboot 项目,但是,
- python-3.x - discord webhook 无法发送空消息
- android - Android:使用计时器定期执行任务
- ruby-on-rails - 如何在 erb 模板中显示自定义设计参数
- authorization - Rails:我需要不同的 AdminUser 才能拥有不同的权限