3

外部ライブラリを使用せずにいくつかの単語を置き換えたい。私の最初の試みは文字列のコピーを作成することでしたが、効率的ではなかったので、これは私がアドレスを使用する別の試みです:

void ReplaceString(std::string &subject, const std::string &search, const std::string &replace) 
{
    size_t position = 0;
    while ((position = subject.find(search, position)) != std::string::npos)    //if something messes up --> failure
    {
         subject.replace(position, search.length(), replace);
         position = position + replace.length();
    }
}

これもあまり効率的ではないので、別のものを使用したいのですが、行き詰まりました。and (for ループなどで解析する) をreplace_stuff(std::string & a);使用して単一のパラメーターを使用するような関数を使用し、それを使用して非常に便利にしたいと考えています。string.replace()string.find()std::map <std::string,std::string>;

大量の入力単語に使いたい。(多くの悪い言葉を無害なものに置き換えるとしましょう)

4

4 に答える 4

2

文字列内のすべての「悪い」単語を無害なものに置き換えたいようですが、悪い単語のリストが入力文字列の長さよりもはるかに大きいため、現在の実装は非効率的です ( subject)。これは正しいです?

もしそうなら、次のコードはそれをより効率的にするはずです。ご覧のとおり、マップをパラメーターとして渡す必要がありましたが、関数がクラスの一部になる場合は、その必要はありません。

void ReplaceString(std::string &subject, const std::map<std::string, std::string>& replace_map) 
{
    size_t startofword = 0, endofword = 0;
    while(startofword < subject.size())
    {
      size_t length = std::string::npos;

      //get next word in string
      endofword = subject.find_first_of(" ", startofword);
      if(endofword != std::string::npos)
        length = endofword-startofword;

      std::string search = subject.substr(startofword, length);

      //try to find this word in the map
      if(replace_map.find(search) != replace_map.end())
      {
        //if found, replace the word with a new word
        subject.replace(startofword, length, replace_map[search]);
        startofword += replace_map[search].length();
      }
      else
      {
        startofword += length;
      }

    }

}
于 2013-03-30T06:53:51.643 に答える
2

私は次の機能を使用しています。

//=============================================================================
//replaces each occurence of the phrase in sWhat with sReplacement
std::string& sReplaceAll(std::string& sS, const std::string& sWhat, const std::string& sReplacement)
{
    size_t pos = 0, fpos;
    while ((fpos = sS.find(sWhat, pos)) != std::string::npos)
    {
        sS.replace(fpos, sWhat.size(), sReplacement);
        pos = fpos + sReplacement.length();
    }
    return sS;
}

//=============================================================================
// replaces each single char from sCharList that is found within sS with entire sReplacement
std::string& sReplaceChars(std::string& sS, const std::string& sCharList, const std::string& sReplacement)
{
    size_t pos=0;
    while (pos < sS.length())
    {
        if (sCharList.find(sS.at(pos),0)!=std::string::npos) //pos is where a charlist-char was found
        {
            sS.replace(pos, 1, sReplacement);
            pos += sReplacement.length()-1;
        }
        pos++;  
    }
    return sS;
}
于 2013-03-30T07:06:21.333 に答える
0

Replacer などのクラスを作成できます。

class Replacer 
{
  std::map<std::string,> replacement;

public:
  Replacer()
  {
     // init the map here
     replacement.insert ( std::pair<std::string,std::string>("C#","C++") );
     //...
  }
  void replace_stuff(std::string & a);
}

その場合、replace_stuff の定義は元の ReplaceString と非常に似ています (渡されたパラメーターの代わりにマップ エントリを使用します)。

于 2013-03-30T14:48:26.643 に答える