一段写到我哭的C++代码,只涉及数据结构的操作。

这是快把我写哭的那段代码,,,数据结构这个东西,,,太复杂了。

	//释放所有内存,太麻烦了。。。。。。。
	//std::vector < std::vector< class g_point* >* > v_pregion;
	std::vector < std::vector< class g_point* >* >::iterator iv_pregion;
	std::vector<class g_point*>::iterator iv_gppts;

	iv_pregion = v_pregion.begin();			//这个是个vector指针
	while( iv_pregion != v_pregion.end() )
	{
		iv_gppts = (* (*iv_pregion)).begin();
		while( iv_gppts!=(* (*iv_pregion)).end() )
		{
			delete (*iv_gppts);
			iv_gppts++;
		}
		iv_pregion++;
	} 

这个函数的作用,是这样的:

已经得到原始图像经过区域生长(见我第2篇博文)后,得到的各个独立边界:



整个图像是以整型数标注的。黑色的地方是SEED(-1);灰色的地方是INVAL(-3);具有颜色的区域是彼此独立的,编码规律如下:1为区域内部(颜色深),2为区域边缘(颜色浅),3为另一片区域内部(颜色深,且是另一个颜色),4为另一片区域边缘……

以整形数数组的形式存储。


这段函数的目的是:

对数组进行统计,以顺序容器vector的形式存储各个区域。以便于进行比较。


std::vector < std::vector< class g_point* >* > v_pregion;
class g_point是自定义的类,包含点的(x,y)及id,可以理解为标准点。

每一个区域由各个点构成,每个区域数据存储在vector <class g_point*>当中,容器中存储的是标准点指针。

而整幅图片由不同区域构成,由v_pregion表示。v_pregion中的数据,为区域结构的指针。


种种复杂的东西,由此展开,尤其是释放内存那段,简直把我要写哭了。

C++这种编程语言……很好奇Linux之父Torvalds为什么会毫不犹豫的会炮轰C++是垃圾~



程序的结果倒蛮简单,就是提取最大面积区域的边缘:


有兴趣童鞋,可以看一下这个函数。

void regionPruning(int * p_mat, int width, int height, int id)
{
	std::vector < std::vector< class g_point* >* > v_pregion;
	for( int nid = 1; nid <= id; nid += 2 )
	{
		v_pregion.push_back( new std::vector<class g_point * > );
	}

	int region_id = 0;
	for(int h = 0; h < height; h++)
	{
		for(int w = 0; w < width; w++)
		{
			region_id = p_mat[h * width + w];
			//如果属于生长到的区域:
			if(region_id != SEED && region_id >0)
			{

				region_id = ( region_id + (region_id % 2) )/2;
				//g_point容器指针
				(* ( v_pregion.at(region_id-1) ) ).push_back(new class g_point(w, h, region_id) );

			}
		}
	}


	std::vector < std::vector< class g_point* >* >::iterator iv_pregion;
	int max_size = 0;
	int max_num = 0;
	int cur_num = 1;
	iv_pregion = v_pregion.begin();
	while( iv_pregion != v_pregion.end() )
	{
		//		std::cout<< ( * (*iv_pregion) ).size() << std::endl;
		if( ( * (*iv_pregion) ).size() > max_size)
		{
			max_size = ( * (*iv_pregion) ).size();
			max_num = cur_num;
		}

		iv_pregion++;
		cur_num ++;
	}
	//	std::cout<<max_num;

	for(int h = 0; h < height; h++)
	{
		for(int w = 0; w < width; w++)
		{
			if( p_mat[h*width + w] == max_num*2 )
			{
				p_mat[h*width + w] = SEED;
			}
			else
			{
				p_mat[h*width + w] = INVAL;
			}
		}
	}

	//释放所有内存,太麻烦了。。。。。。。
	//std::vector < std::vector< class g_point* >* > v_pregion;
	std::vector<class g_point*>::iterator iv_gppts;

	iv_pregion = v_pregion.begin();			//这个是个vector指针
	while( iv_pregion != v_pregion.end() )
	{
		iv_gppts = (* (*iv_pregion)).begin();
		while( iv_gppts!=(* (*iv_pregion)).end() )
		{
			delete (*iv_gppts);
			iv_gppts++;
		}
		iv_pregion++;
	} 

	v_pregion.clear();
}
相关文章
相关标签/搜索