gpt4 book ai didi

C++ 嵌套 for 循环删除元素

转载 作者:行者123 更新时间:2023-11-28 01:25:31 28 4
gpt4 key购买 nike

我想相互检查 vector 的所有元素。通过检查一个条件,应该删除一个元素。

一种方法是通过嵌套的 for 循环删除元素

for (int a = 0; a < rs.size(); a++)
{
Point A = rs[a];

for (int b = 1; b <= rs.size(); b++)
{
Point B = rs2[b];
float distance = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) * 1.0);

if (distance < 10.0)
{
if (distance > 0)
{
rs.erase(rs.begin() + b);
}
}
}
}

但这会在运行时影响 vector 及其大小。

第二种方法是在 unordered_set 中收集 b 的索引,但如何删除原始 vector 中具有相应索引的元素?

unordered_set<int> index;

for (int a = 0; a < rs.size(); a++)
{
Point A = rs[a];

for (int b = 0; b < rs.size(); b++)
{
Point B = rs2[b];
float distance = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) * 1.0);

if (distance < 10.0)
{
if (distance > 0)
{
index.insert(b);
}
}
}
}

如您所料,这种方法也不起作用:

for (const int& idx : index)
{
rs.erase(rs.begin() + idx);
}

有什么帮助吗?

最佳答案

您可以在上次提出的建议中使用反向循环从 vector 中删除索引。只需将 index 设为 vector 即可。我们称它为 toRemove

for (int i = toRemove.size() - 1; i >= 0; i--)
{
rs.erase(rs.begin() + toRemove[i]);
}

请注意这个循环必须有一个带符号的索引。否则你可能会下溢。您可以使用反向迭代器使它“更好”。这只是一个概念证明。

关于C++ 嵌套 for 循环删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com