是否有可能构建一个“无限”的字符串?

时间:2010-07-15 17:33:05

标签: c++ string infinite

是否有任何真实的字符序列总是比其他任何字符串都要大?

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

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

如果它几乎肯定无法工作这一事实并不是一个大问题。所以我认为这种hackery只能用Unicode完成,如果它可以完成的话。我从来没有听说任何表明它真的 可能的东西,但我也没有听说过它不是,而且我很好奇。

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

8 个答案:

答案 0 :(得分:3)

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

  

是否有任何真实的字符序列总是比其他任何字符串都要大?

不,因为:

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

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

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

    可以使字符串始终小于或等于任何其他字符串。零长度字符串将完全相同 - 总是小于其他任何东西,并且等于其他零长度字符串。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分: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 ) );

如果你可以使用任何其他comparisson仿函数并且你的域名有一些无效,你可以使用它们:

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

答案 5 :(得分:0)

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

或实现懒字符串。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

你的比较器是什么?

基于此,你可以构造一些格子的“顶部”。