STL map find_if

来源:互联网 发布:胸肌锻炼方法 知乎 编辑:程序博客网 时间:2024/06/06 02:19

事出有因,今天刷leetcode的时候需要用到用一个map来记录每一个字母出现的下标映射。(Isomorphic Strings)
一开始考虑使用了:

 map< char, vector<int> >

但是会遇到一个问题,就是map在存储元素的时候会自动调整内部的顺序,导致最后存储的字母的顺序变化,映射匹配的时候出错。

所以只能使用

vector< char, vector<int> >

但是这样的一个问题是没办法使用find(beg,end,val)去查找对应的char。
主要是自己对于find_if不熟悉,不会写find_if的判断函数

class vector_finder{public:    vector_finder(const char ch):_ch(ch){}    bool operator ()(const vector< pair< char,vector<int> > > ::value_type &value){        return value.first==_ch;    }    private:        char  _ch;                  };
    auto it1=find_if(charIdxMap1.begin(),charIdxMap1.end(),vector_finder(s[i]));

使用find_if的时候需要一个xxx_finder class ,通过构造函数来初始化要查询匹配的value,然后重载 operator () 来实现在find_if中的调用。
注意重载函数的返回类型必须是bool类型.

说道这里,把自己的解决方法也给出来吧。

bool isIsomorphic(string s, string t) {     vector<pair< char,vector<int> > >  charIdxMap1; //字母及索引映射表,第一个元素存字母,第二个存下标     vector<pair< char,vector<int> > > charIdxMap2;    for(size_t i=0;i<s.size();++i){        auto it1=find_if(charIdxMap1.begin(),charIdxMap1.end(),vector_finder(s[i]));        auto it2=find_if(charIdxMap2.begin(),charIdxMap2.end(),vector_finder(t[i]));        if(it1==charIdxMap1.end()){//如果是新的元素,插入            vector<int> ivec(1,i);            charIdxMap1.push_back(make_pair(s[i],ivec));        }        else{//如果不是新的元素            (*it1).second.push_back(i);        }        if(it2==charIdxMap2.end()){//如果是新的元素,插入            vector<int> ivec(1,i);            charIdxMap2.push_back(make_pair(t[i],ivec));        }        else{//如果不是新的元素            (*it2).second.push_back(i);        }    }    auto it1=charIdxMap1.begin();    auto it2=charIdxMap2.begin();    //遍历映射表    for(;it1!=charIdxMap1.end(),it2!=charIdxMap2.end();it1++,it2++){        if(  (*it1).second.size() != (*it2).second.size() ){            return false;        }        else{            for(size_t j=0;j<(*it1).second.size();++j){                int temp1=(*it1).second.at(j);                int temp2=(*it2).second.at(j);                if( temp1 != temp2){                    return false;                }            }        }    }    return true;}
1 0