繁体   English   中英

std :: set中的自定义函数

[英]Custom Functor in std::set

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int order[26];
struct lexcmp
{
    bool operator()(const string &s1,const string &s2)
    {
        int i=0;
        int j=min(s1.size(),s2.size());
        while(1)
        {
            if(order[s1[i]-'a']<order[s2[i]-'a'])
            return true;
            if(order[s1[i]-'a']>order[s2[i]-'a'])
            return false;
            if(i==j-1)
            return false;
            i++;
        }
    }
};
int main()
{
        string s;
        cin>>s;
        for(int i=0;i<s.size();i++)
        {
            order[s[i]-'a']=i;
        }
        set<string,lexcmp> store;
        int m;
        cin>>m;
        while(m--)
        {
            string q;
            cin>>q;
            store.insert(q);
        }
        for(auto i=store.begin();i!=store.end();i++)
        {
            cout<<*i<<endl;
        }
    }
    return 0;
}

  • 制作自定义函数的问题问题是,我有一个新的元素顺序(而不是简单的az)。 //保存在订单数组中
  • 我想要的只是根据新订单订购给定的字符串。
  • 例如:顺序是:bacdefghijklmnopqrstuvwxyz因此,如果字符串是ss,aa,bb新的顺序将是bb,aa,ss。
  • 该代码工作正常,但它给我一个问题,而字符串就像“pas”“p”进行比较。 p应该在pas之前出现,但它会在之后发生。
  • 我应该在仿函数中做些什么修改?

这是一种方法:

#include <cassert>
#include <cstddef>
#include <cstdint>
#include <algorithm>
#include <numeric>
#include <array>
#include <string>
#include <locale>

struct lexcmp {
    lexcmp() { std::iota(order_.begin(), order_.end(), std::int_fast8_t{}); }
    explicit lexcmp(std::string const& order) {
        assert(order.size() == order_.size());

        for (std::size_t i{}; i != order_.size(); ++i) {
            char const order_letter = order[i];
            assert(std::isalpha(order_letter, std::locale::classic()));
            assert(std::islower(order_letter, std::locale::classic()));
            order_[i] = order_letter - 'a';
        }

        auto unique_order_letters = [this]{
            auto order = order_;
            std::sort(order.begin(), order.end());
            return order.end() - std::unique(order.begin(), order.end()) == 0;
        };
        assert(unique_order_letters());
    }

    bool operator ()(std::string const& a, std::string const& b) const {
        auto const a_len = a.size(), b_len = b.size();
        std::size_t i{};
        for (auto const len = std::min(a_len, b_len); i != len; ++i) {
            if (auto const diff = order_[a[i] - 'a'] - order_[b[i] - 'a']) {
                return diff < 0;
            }
        }
        return i == a_len && i != b_len;
    }

private:
    std::array<std::int_fast8_t, 26> order_;
};

在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM