C++写一个函数 把一个三角网分成多个独立的三角网解决方法

C++写一个函数 把一个三角网分成多个独立的三角网
具体题目是这样的
写一个函数 把一个三角网分成多个独立的三角网。
输入: vector<UINT> indexArr; indexArr为每个三角形的索引值 (即每0, 1, 2个索引是一个三角形, 3, 4, 5索引又是一个三角形 。。。)
输出:vector<vector<UINT>> indexArrs  把索引不相连的三角形给分开。
注意效率。
例如下图: 输入[0,1,2,0,2,3,4,5,6] 输出[0,1,2,0,2,3],[4,5,6]

大侠们 如果有时间的话帮我看一下程序好么?
该怎样改进才能使c++编程的优势得到更充分的发挥。

#include <vector>
#include <iostream>
#include <map>
using namespace std; 

int main()
{
vector<vector<int>> fun(const vector<vector<int> > indexArrs);
vector<vector<int>> input();

fun(input());
return 0;
}

vector<vector<int>> input()      //输入
{
                                                                                   
vector<int> indexArr;
int s;
cout<<"please input the index"<<endl;
while(cin>>s)
{
indexArr.push_back(s);
}
int num=indexArr.size()/3;
int n=0;
vector<vector<int>> indexArrs(num);
vector<vector<int>>::iterator itera;
for(vector<int>::iterator iter=indexArr.begin(); iter!=indexArr.end(); iter++)
{
indexArrs[n/3].push_back(*iter);
n++;
}
return indexArrs;
}

vector<vector<int> > fun(const vector<vector<int> > indexArrs)
{

map<int, int> Add;
int i=0;
//////对顶点进行分组
for(vector<vector<int> >::const_iterator it=indexArrs.begin(); it!=indexArrs.end(); it++)
{
vector<int>::const_iterator iter=it->begin(); 
if(!Add.count(*iter)&&!Add.count(*(iter+1))&&!Add.count(*(iter+2)))                
//第一个第二个第三个没有出现过时进行标号
{
Add[*iter]=++i;
Add[*(++iter)]=i;
Add[*(++iter)]=i;

}
else if(Add.count(*iter)&&!Add.count(*(iter+1))&&!Add.count(*(iter+2)))          
//第一个出现过第二个第三个没有出现过时
{
 Add[*(iter+1)]=Add.find(*iter)->second;
 Add[*(iter+2)]=Add.find(*iter)->second;
}
else if(!Add.count(*iter)&&Add.count(*(iter+1))&&!Add.count(*(iter+2)))              
//第二个出现过第一个第三个没有出现过时
{
 Add[*iter]=Add.find(*(iter+1))->second;
 Add[*(iter+2)]=Add.find(*(iter+1))->second;
}
else if(!Add.count(*iter)&&!Add.count(*(iter+1))&&Add.count(*(iter+2)))          
//第三个出现过第一个第二个没有出现过时
{
 Add[*iter]=Add.find(*(iter+2))->second;
 Add[*(iter+1)]=Add.find(*(iter+2))->second;
}
else if(Add.count(*iter)&&Add.count(*(iter+1))&&!Add.count(*(iter+2)))            
//第一个第二个出现第三个没有出现过时
{
if(Add.find(*(iter+1))->second!=Add.find(*iter)->second)                       
{
map<int, int>::mapped_type mapty=Add.find(*(iter+1))->second;            
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)          
{
if(it->second==mapty)
it->second=Add.find(*iter)->second;
}
}
 Add[*(iter+2)]=Add.find(*iter)->second;
}
else if(Add.count(*iter)&&!Add.count(*(iter+1))&&Add.count(*(iter+2)))             
//第一个第三个出现第二个没有出现过时
{
if(Add.find(*(iter+2))->second!=Add.find(*iter)->second)                      
{
map<int, int>::mapped_type mapty=Add.find(*(iter+2))->second;           
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)        
{
if(it->second==mapty)
it->second=Add.find(*iter)->second;
}
}
 Add[*(iter+1)]=Add.find(*iter)->second;
}
else if(!Add.count(*iter)&&Add.count(*(iter+1))&&Add.count(*(iter+2)))             
//第二个第三个出现第一个没有出现过时进行标号
{
if(Add.find(*(iter+2))->second!=Add.find(*(iter+1))->second)