C++ 添加元素后,如何停止添加到std::vector

C++ 添加元素后,如何停止添加到std::vector,c++,C++,我正在尝试做boids模拟。我目前正在做的是检查BOID是否在彼此的范围内,并将它们的记忆地址添加到名为withinSensoryRange的std::vector中(如果它们在范围内)。这是代码 struct Boid { float sensoryRadius = 50.0f; std::vector<Boid*> withinSensoryRange; }; std::vector<Boid> boids; while (true) { for

我正在尝试做boids模拟。我目前正在做的是检查BOID是否在彼此的范围内,并将它们的记忆地址添加到名为withinSensoryRange的std::vector中(如果它们在范围内)。这是代码

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::vector将在调整大小时移动对象

解决方案:

而是关联并存储一些唯一标识符 使用std::unique_ptr std::vector boids;,这将确保对象不会移动,移动的是智能指针 使boids vector或set const在构造时初始化它,并确保包含的对象(如果有)不会通过指针在整个访问过程中移动。 使用不需要调整大小的容器,例如std::list 我试着用std::unique\u 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())

可能使用集合而不是向量?boids[i]。withinSensoryRange.push_back&boids[j];-这是个坏消息。您正在存储boids向量项的地址。由于boids向量的大小调整,地址将无效。不管还有什么问题,这都需要解决。不要存储向量元素的地址!当向量调整大小时,其内部数组可能会移动,然后指针无效。2.如果存储索引或其他id,可以使用std::set或std::unordered_set之类的结构,尽管我不确定它们是否适合每一帧更新。插入时间复杂度为log2n,因此它取决于一次有多少BOID在范围内。1000000将意味着大约20个操作,所以std::list和稳定迭代器不是那么糟糕吗?我期待着和唯一指针向量类似的性能损失,但老实说,我没有clue@largest_prime_is_463035818说得好。我怀疑列表更快,因为向量在访问元素时有1个额外的间接寻址。@bolov感谢您的回答。我试着用std::unique\u ptr的方式来做。当我尝试推回内存地址.boids[I].withinSensoryRange.push\u backsd::make\u unique时,它不起作用;它说“tihs”不能用在常量中expression@Apple_Banana看见update@bolov我完全按照您的示例执行,并尝试运行它,但收到了此错误消息。错误C2280'std::unique_ptr::unique_ptrconst std::unique_ptr&':试图引用xmemory文件第701行中已删除的函数。