C++アナログ標準ライブラリ関数replaceによる単語置換


自分で作成した単語置換関数は,主に標準ライブラリ関数replaceをシミュレートする方法である.欠点は、一致する文字を検出して置換するのではなく、単語のみを置換することであり、HiImLissyをlissyに置換する必要がある場合は実現できません.文字マッチングを置換する必要がある場合は、標準ライブラリ関数の使用を推奨します.
主にreplaceを行うために2つの方法を用いた.コードには注釈と解釈が与えられている.コードは次のとおりです.

///      insert erase       
void replace(std::string & ori, const std::string & oldVal, const std::string & newVal)
{
	std::string::iterator beg = ori.begin();
	std::string s;
	
	int start = 0;		//       
	int offset = newVal.size() - oldVal.size();		//         

	///                   string  oldVal  ,          。
	if (ori == oldVal)
	{
		ori = newVal;
		return;
	}

	///  2              
	while (start < ori.size())
	{
		s.push_back(ori.at(start));

		///       1  
		if (s == oldVal && (start + 1 == ori.size() || ori.at(start + 1) == ' '))
		{
			///  replace     
			ori.replace(start - (oldVal.size() - 1), oldVal.size(), newVal);		//    		
			s.clear();
			start += offset + 1;		//       newVal - oldVal              
		}
		else
		{
			///            
			if (ori.at(start) == ' ')
				s.clear();
			++start;		
		}
	}



#ifdef METHOD1					///  1             
	while (beg != ori.end())
	{
		s.push_back(*beg);
		///                           
		///                   string    ,                               。
		///      ,        string  ,                                  
		if (s == oldVal && (beg + 1 == ori.end() || *(beg + 1) == ' '))
		{
			///               。
			//           - (oldVal.size() - 1)    ,           ,         
			//                     ,      
			beg = ori.erase(beg - (oldVal.size() - 1), beg + 1);			//      。
			beg = ori.insert(beg, newVal.cbegin(), newVal.cend());			//      。  newVal     
			beg += newVal.size();		//         

			s.clear();					//          
		}
		else
		{
			if (*beg == ' ')			//       s
				s.clear();
			++beg;
		}
}
#endif
}