c++ string iterators incompatible


參考內容:
http://bingxinye1.blog.163.com/blog/static/168797098201332294321491/

vc2005 對於迭代器的匹配是非常嚴格的,通常這種錯誤是因爲兩個不同的迭代器操作同一個 vector,或者是因爲迭代器在遍歷vector時,vector的鏈表改變了,就會引發這種錯誤,比如vector在遍歷的途中,別的位置push_back()一個元素,這時迭代器就失效了,導致錯誤。


例如:在調用函數的裏面不要再定義並使用針對同一個string對象的迭代器...


//0615
bool GetFirstReInfo_model_one(string str,string::const_iterator it,string::const_iterator end,EmailBody_ReInfo *re_info)
{
	cout << "GetFirstReInfo by Model_one:" << endl;
	boost::regex expression("((On)(\\s)(.*?)(AM|PM)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(wrote))|((At)(\\s)(.*?)(,)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(wrote))|((在\\s)([0-9-]+(.*?)[0-9:]+)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(寫道))");
	boost::smatch what;
	string re_date = "",re_sender = "";
	//注:再對string str定義新的起始迭代器,並對該string對象進行迭代操作將報錯  
//	string::const_iterator it = str.begin();
//	string::const_iterator end = str.end();

	while(boost::regex_search(it,end,what,expression))
	{
		if(what[1].matched)
		{
			//cout << what[1].str() << endl;
			re_date = what[4].str() + what[5].str();
			re_sender = what[7].str();
		}
		else if(what[10].matched)
		{
			//cout << what[10].str() << endl;
			re_date = what[13].str();
			re_sender = what[16].str();
		}
		else if(what[19].matched)
		{

			//cout << what[19].str() << endl;
			re_date = what[21].str();
			re_sender = what[24].str();
		}

		it = what[0].second;
		break;
	}

	if(re_date != "" && re_sender != "")
	{
		(*re_info).Re_Sender = re_sender;
		(*re_info).Re_SendDate = re_date;
		return true;
	}
	else
		return false;

}


bool GetFirstReInfo_model_two(string str,string::const_iterator it,string::const_iterator end,EmailBody_ReInfo *re_info)
{
	cout << "GetFirstReInfo by model_two ..." << endl;

	//regex expression of model two
	boost::regex exp1("(發件人)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(發送日期|日期|發送時間)(.*?)([0-9]+(年)[0-9]+(月)[0-9]+(日)(.*?)[0-9]+(點|:)[0-9]+(分)?)");//  (分)?  0 or 1 
	boost::regex exp2("(From)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(Date)(.*?)((Mon|Tue|Wed|Thu|Fri|Sat|Sun)(.*?)(AM|PM))");
	boost::regex exp3("(From)(.*?)([A-Za-z0-9.-]+@[A-Za-z0-9-]+[.\\w+]+)(.*?)(Date)(.*?)([0-9]+-[0-9]+-[0-9]+\\s[0-9]+:[0-9]+:[0-9]+)");
	//

	boost::smatch what;
	string re_date = "",re_sender = "";
//	string::const_iterator it = str.begin();
//	string::const_iterator end = str.end();

	if(boost::regex_search(it,end,what,exp1))
	{
		re_date = what[3].str();
		re_sender = what[7].str();
	}
	else if(boost::regex_search(it,end,what,exp2))
	{
		re_date = what[3].str();
		re_sender = what[7].str();
	}
	else if(boost::regex_search(it,end,what,exp3))
	{
		re_date = what[3].str();
		re_sender = what[7].str();
	}

	if(re_date != "" && re_sender != "")
	{
		(*re_info).Re_Sender = re_sender;
		(*re_info).Re_SendDate = re_date;
		return true;
	}
	else
		return false;
}

//match "On/At; From and other equivalent Chinese characters"
bool GetFirstReInfo_model(string str,EmailBody_ReInfo *re_info)
{
	boost::regex exp("(On|At|在)|(From|發件人)");//****   (str1)|(str2)   not ((str1)|(str2))
	
	boost::smatch what;
	string::const_iterator it = str.begin();
	string::const_iterator end = str.end();
	while(boost::regex_search(it,end,what,exp))
	{
		it = what[0].first;//**
		cout << "what[1]:" << what[1].str() << endl;
		cout << "what[2]:" << what[2].str() << endl;

		if(what[1].matched)
		{
			if(GetFirstReInfo_model_one(str,it,end,re_info))
				return true;
			else 
				it = what[0].second;
		}
		else if(what[2].matched)
		{
			if(GetFirstReInfo_model_two(str,it,end,re_info))
				return true;
			else
				it = what[0].second;
		}
	}

	return false;
}








發佈了63 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章