3

是否有任何真正的字符序列总是比较大于任何其他字符串?

我的第一个想法是这样构造的字符串:

std::basic_string<T>(std::string::max_size(), std::numeric_limits<T>::max())

可以做到这一点,只要它几乎肯定无法工作的事实不是一个大问题。所以我认为这种hackery只能在Unicode中完成,如果它可以完成的话。我从来没有听说过任何事情表明它确实可能的,但我也没有听说过它不是,我很好奇。

关于如何在没有 的情况下实现这一目标的任何想法possibly_infinite<basic_string<T>>

4

8 回答 8

3

您可能需要一个自定义比较器,为它定义一个神奇的“无限字符串”值,并且始终将该值视为大于其他值。

于 2010-07-15T17:38:15.917 回答
3

Unicode 解决了很多问题,但不是那个。Unicode 只是一个字符的不同编码,1、2 或 4 个字节,它们仍然存储在一个普通数组中。当您找到具有无限内存的机器时,您可以使用无限字符串。

于 2010-07-15T17:44:24.670 回答
3

我假设您使用它们的字符值比较字符串。即一个字符的行为就像一个数字,较长的字符串大于较短的字符串,等等。

是否有任何真正的字符序列总是比较大于任何其他字符串?

没有为什么:

  1. 假设有一个字符串s总是比任何其他字符串都大。
  2. 如果您制作s的副本,则该副本将等于s。相等的意思是“不更大”。因此,可以有一个不大于s的字符串。
  3. 如果您复制s并在末尾附加一个字符,它将大于原始s。因此,可能存在一个大于s的字符串。
  4. 这意味着,不可能制作s

IE

始终大于任何其他字符串的字符串s不能存在。s的副本(copy == 其他字符串)将等于s,“等于”表示“不大于”。如果最大字符串大小具有合理的限制,则可以存在始终大于或等于任何其他字符串
的字符串s 。如果没有大小限制,则可以获取s的副本,在末尾附加一个字符,并获得一个大于s的字符串。

在我看来,正确的解决方案是引入某种表示无限“大”字符串的特殊字符串对象,并为该对象和标准字符串编写一个比较运算符。此外,在这种情况下,您可能需要自定义字符串类。

可以使字符串始终小于或等于任何其他字符串。零长度字符串就是这样 - 总是比其他任何东西都小,并且等于其他零长度字符串。

或者您可以编写违反直觉的比较例程,其中较短的字符串大于较长的字符串,但在这种情况下,下一个代码维护人员会讨厌您,所以这不是一个好主意。

不过,不知道为什么你会需要这样的东西。

于 2010-07-15T18:01:24.793 回答
2

的。你是怎么做到的,我不知道:)

于 2010-07-15T18:14:05.640 回答
1

您应该尝试说明您打算实现什么以及您的要求是什么。特别是,它必须是一个字符串吗?域名有限制吗?他们需要比较<吗?

您可以使用非字符串类型:

struct infinite_string {};
bool operator<( std::string const & , infinite_string const & ) {
   return true;
}
bool operator<( infinite_string const &, std::string const & ) {
   return false;
}

如果可以使用std::lexicographical_compare并且不需要将其存储为字符串,则可以编写一个无限迭代器:

template <typename CharT>
struct infinite_iterator
{
   CharT operator*() { return std::numeric_limits<CharT>::max(); }
   infinite_iterator& operator++() { return *this; }
   bool operator<( const infinite_iterator& ) { return true; }
   // all other stuff to make it proper
};
assert( std::lexicographical_compare( str.begin(), str.end(), 
                              infinite_iterator, infinite_iterator ) );

如果您可以使用任何其他比较函子并且您的域有一些无效,您可以使用它来获得优势:

namespace detail {
   // assume that "\0\0\0\0\0" is not valid in your domain
   std::string const infinite( 5, 0 ); 
}
bool compare( std::string const & lhs, std::string const & rhs ) {
   if ( lhs == detail::infinite ) return false;
   if ( rhs == detail::infinite ) return true;
   return lhs < rhs;
}
于 2010-07-15T19:26:37.527 回答
0

如果您需要在界对象空间内进行人为绑定,则标准技巧是添加一个额外元素并定义一个新的比较运算符来强制执行您的属性。

或者实现惰性字符串。

于 2010-07-15T17:38:54.597 回答
0

好吧,如果您要动态构造一个与您要比较的字符串长度相等的字符串,并用可用的最高 ASCII 代码填充它(普通 ASCII 为 7F,扩展为 FF),您将保证该字符串比较等于或大于您与之比较的那个。

于 2010-07-15T17:40:27.190 回答
0

你的比较器是什么?

在此基础上,您可以构建作为晶格“顶部”的东西。

于 2010-07-15T17:41:51.807 回答