我怀疑你想要的是一个好主意,如果你真的坚持,你可以创建一个支持从隐式转换char
、隐式转换到的类std::string
,并且可以与自身的另一个实例或字符串进行比较:
class cvt {
char val;
public:
cvt(char val) : val(val) {}
bool operator<(cvt other) const { return val < other.val; }
bool operator<(std::string const &s) const {
return !s.empty() && val < s[0];
}
friend bool operator<(std::string const &s, cvt const &c) {
return !s.empty() && s[0] < c.val;
}
operator std::string() const { return std::string(1, val); }
};
有了这个,我们可以创建我们的set<cvt>
,但像使用它一样使用它set<std::string>
(因为其中的元素可以/将std::string
隐式转换为并与 比较std::string
):
int main() {
std::string some_string = "ZABCDECD";
// Create our (sort of) set<string> from characters in some_string:
std::set<cvt> char_set(some_string.begin(), some_string.end());
// An actual set<string> to use with it:
std::set<std::string> strings{ "A", "C", "E", "F", "Y" };
// demonstrate compatibility:
std::set_intersection(char_set.begin(), char_set.end(), strings.begin(), strings.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
Live on Coliru.
如果我们在 Godbolt 上查看为此生成的代码,我们会发现它实际上几乎都是语法糖——实际为cvt
该类生成的唯一代码是复制一个字节以cvt
从 a创建 a 的微小位char
,并将 acvt
与 a进行比较string
。其他一切都已优化不存在。
如果我们确定我们的字符串不会为空,我们可以简化与 and 的比较return val < s[0];
,return s[0] < val;
在这种情况下,它们也会被优化掉,所以使用 using 生成的唯一代码cvt
是从源中复制一个字节来构造一个cvt
目的。
根据您的想法,这可能符合您的要求。这是相当多的额外输入,但它优化得很好——以至于将 acvt
与字符串进行比较可能比将 a 与 a 进行string
比较更快string
。到目前为止,最大的缺点可能源于质疑您的基本前提,并想知道为什么您不只是编写一个循环并完成它。