2012-03-26 12 views
0

私はregexpsの中から検索しなければならないので、自分自身でmap.findを実装しようとしています。 しかし私のコードは長く働いています。ヘルプplz。コードをどのように改善できますか?他の方法でイテレータに整数を追加することはできますか?ビルトイン機能は10倍以上速く動作します。map.find implementation

iterator find (string toFind) 
{ 
    iterator begin=mainMap.begin(); 
    int L=0; 
    int R=mainMap.size(); 
    iterator M; 
    while (L!=R) 
    { 
     M=begin; 
     addition(&M,((R+L)/2)); 
     if (match (&(*M).first, &toFind)) 
      return M; 
     if (toFind<(*M).first) 
     { 
      R=(R+L)/2; 
     } 
     else 
      L=(R+L)/2+1; 
    } 
    return mainMap.end(); 
} 

void addition (iterator* it, int n) 
{ 
    for(int i=0;i<n;i++, (*it)++) 
    { 
    } 
} 

bool match (const string* expression, const string* line) 
{ 
    return *expression==*line; 
} 
+0

mapに{"a * 5"、 "b * 4"、 "c5"}が含まれている場合 find( "any")=要素 "a * 5"のイテレータ。 find( "bingo")=要素 "b * 4"のイテレータ。 find( "nothing")=過去の最後のイテレータ –

答えて

0

新しい検索アルゴリズムを実装する必要はありません。比較ファンクタをマップに渡すだけで十分です。

struct MyLessThan 
{ 
    bool operator(const string& left, const string& right)(
     //Your implementation of less than, where you can use regular expressions 
     //Don't forget it should have strict weak ordering 

    } 
}; 

ような何か、その後VALUETYPEと

std::map<string, VALUETYPE, MyLessThan> myMap; 

(テンプレート引数としてファンクタを使用して)としてマップの値のタイプをマップを定義します。

+0

ありがとう、良いアイデア。私はそれを実装しようとします。 –

+0

あなたは、マップ内に検索可能な要素と比較できない要素が存在する場合、findがそれを返しますか? –