如何擦除double for循环中的矢量元素
How to erase a vector element within double for loop
我有一个结构的向量
vector<contour> hotspots;
轮廓是我在下面定义的结构
struct contour
{
double arc;
double area;
Point2f center;
double me;
double hullArea;
vector<Point> contourVector;
vector<Point> hullVector;
bool operator <(const contour& comp)
{
return me < comp.me;
}
};
所以我想做的是循环遍历,并删除另一个轮廓中包含的每个轮廓,我可以让它在很大程度上工作,但有时我会出现索引错误,我认为这与当我删除一个元素时索引会出错有关,所以我超出了范围。这是我写的循环:
vector<vector<Point>> cleanUp(vector<Point2f> centers, vector<Moments> areas, vector<vector<Point>> contours)
{
for (int i = 0; i < contours.size(); i++)
for (int j = 0; j < contours.size(); j++)
if (i != j)
{
if ((areas[i].m00 < areas[j].m00) == true && (pointPolygonTest(contours[j], centers[i], false) > 0) == true)
{
contours.erase(contours.begin() + i);
centers.erase(centers.begin() + i);
areas.erase(areas.begin() + i);
}
}
return contours;
}
我尝试了一些不同的解决方案,比如I-1,但它删除了错误的轮廓,而不是使用擦除,而是用最后一个覆盖我想删除的元素,然后使用.pop_back删除最后一个元素,但这似乎也不起作用。有什么想法吗?
编辑:修复了区域和中心不同步的问题,但现在只要我调用函数来擦除一些轮廓,问题就会立即出现。
您可以为要删除的项保留一个索引列表,并在最后删除这些索引处的项。
vector<vector<Point>> cleanUp(vector<Point2f> centers,
vector<Moments> areas,
vector<vector<Point>> contours)
{
std::<int> itemsToErase;
for (int i = 0; i < contours.size(); i++)
for (int j = 0; j < contours.size(); j++)
if (i != j)
{
if ((areas[i].m00 < areas[j].m00) == true &&
(pointPolygonTest(contours[j], centers[i], false) > 0) == true)
{
itemsToErase.push_front(i);
}
}
while ( !itemsToErase.empty() )
{
int i = itemsToErase.back();
contours.erase(contours.begin() + i);
centers.erase(centers.begin() + i);
areas.erase(areas.begin() + i);
itemsToErase.pop_back();
}
return contours;
}
使用迭代器,我会尝试这种方法:
#include <iterator>
template <typename BinaryPred>
void RemoveIfPairwise(std::vector<T> & v, BinaryPred f)
{
for (auto it1 = v.begin(); it1 != v.end(); ++it1)
{
for (auto it2 = std::next(it1); it2 != v.end(); )
{
if (f(*it1, *it2)) { it2 = v.erase(it2); }
else { ++it2; }
}
}
}
这使用了std::vector
的迭代器非无效保证,例如擦除不会在擦除点之前使迭代器无效(因此it1
不需要特殊处理)。
注意,这个循环只检查不同元素对;您需要修改它来检查对角线。
相关文章:
- 擦除while循环中迭代的元素
- C++:如何循环通过向量中的整数元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++基于范围的 for 循环和元素副本
- 这个返回元素位置的基于循环的函数有什么问题?
- 为什么我在尝试在单向链表中打印元素时会出现这个永无止境的循环
- 循环访问还包含未使用元素的字符串数组
- C++用于循环跳过向量的元素?
- 基于相邻元素 c++ 的分段误差范围的循环
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 需要帮助编写一个小程序来将循环乘以 n 个元素和 k 个多重性
- C++ 数据结构队列:使用 for 循环查找队列中最大的元素
- 将函数应用于特征矩阵中的所有元素,而无需循环
- 使用 C++ 从每个循环的数组中选择 n 个元素
- 忽略元素的基于范围的 for 循环
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?