这是错误的使用方法:
for (deque<StateTable>::iterator iter = standTable.begin(); iter != standTable.end();)
{
cv::Mat SegTemp;
SegModel(iter->standRegion).copyTo(SegTemp);
int nonZerosNum = countNonZero(SegTemp); // 计算矩阵非零元素个数
cout << "nonZerosNum = " << nonZerosNum << endl;
if ((1 == iter->stand_falg) && (nonZerosNum > proParam.of_nonZerosNumThred))
{
state[count] = *iter;
rectangle(SegModel, iter->standRegion, cv::Scalar(255, 0, 0), 2);
count++;
iter++;
}
else
{
standTable.erase(iter); // iter会自动指向下一个元素,因此不需再进行++操作
}
}
上述代码中的最后一行代码是有问题的,迭代器在erase操作之后无法获取下一个指针元素;
正确的写法如下:
for (deque<StateTable>::iterator iter = standTable.begin(); iter != standTable.end();)
{
cv::Mat SegTemp;
SegModel(iter->standRegion).copyTo(SegTemp);
int nonZerosNum = countNonZero(SegTemp); // 计算矩阵非零元素个数
cout << "nonZerosNum = " << nonZerosNum << endl;
if ((1 == iter->stand_falg) && (nonZerosNum > proParam.of_nonZerosNumThred))
{
state[count] = *iter;
rectangle(SegModel, iter->standRegion, cv::Scalar(255, 0, 0), 2);
count++;
iter++;
}
else
{
standTable.erase(iter++); // iter会自动指向下一个元素,因此不需再进行++操作
}
}
或者
for (deque<StateTable>::iterator iter = standTable.begin(); iter != standTable.end();)
{
cv::Mat SegTemp;
SegModel(iter->standRegion).copyTo(SegTemp);
int nonZerosNum = countNonZero(SegTemp); // 计算矩阵非零元素个数
cout << "nonZerosNum = " << nonZerosNum << endl;
if ((1 == iter->stand_falg) && (nonZerosNum > proParam.of_nonZerosNumThred))
{
state[count] = *iter;
rectangle(SegModel, iter->standRegion, cv::Scalar(255, 0, 0), 2);
count++;
iter++;
}
else
{
iter = standTable.erase(iter); // iter会自动指向下一个元素,因此不需再进行++操作
}
}