STL中的deque队列使用erase删除元素出现问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lifei092/article/details/82347806

这是错误的使用方法:

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会自动指向下一个元素,因此不需再进行++操作
		}
	}

 

展开阅读全文

没有更多推荐了,返回首页