gpt4 book ai didi

c++ - std::set 中的自定义仿函数

转载 作者:太空狗 更新时间:2023-10-29 22:58:58 28 4
gpt4 key购买 nike

#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;
}

  • 制作自定义仿函数的问题问题是,我有一个新的元素顺序(而不是简单的 a-z)。//按顺序数组保存
  • 我只想根据新顺序对给定的字符串进行排序。
  • 例如:订单是: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_;
};

Online Demo

关于c++ - std::set 中的自定义仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38370964/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com