簡體   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