当前位置:   article > 正文

STL map find_if

STL map find_if

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

 map< char, vector<int> >
  • 1

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

所以只能使用

vector< char, vector<int> >
  • 1

但是这样的一个问题是没办法使用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;                 
 };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
    auto it1=find_if(charIdxMap1.begin(),charIdxMap1.end(),vector_finder(s[i]));
  • 1

使用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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/992060
推荐阅读
相关标签
  

闽ICP备14008679号