3

他のどの文字列よりも常に大きく比較される実際の文字シーケンスはありますか?

私の最初の考えは、次のように構成された文字列でした。

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

それがほぼ確実に機能しないという事実がそれほど大きな問題ではないという条件で、トリックを実行します。したがって、この種のハッカーは、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つの文字は数字のように機能し、長い文字列は短い文字列よりも大きくなります。

常に他の文字列よりも大きく比較される実際の文字シーケンスはありますか?

いいえ、理由:

  1. 他のどの文字列よりも常に大きい 文字列sがあると仮定しましょう。
  2. sのコピーを作成すると、そのコピーはsと等しくなります。等しいとは「大きくない」という意味です。したがって、 s以下の文字列が存在する可能性があります。
  3. sのコピーを作成し、最後に1文字を追加すると、元のsよりも大きくなります。したがって、 sより大きい文字列が存在する可能性があります。
  4. つまり、sを作成することはできません。

つまり

他のどの文字列よりも常に大きい文字列sは存在できません。sのコピー(copy == other string)はsと等しくなり、「equal」は「大きくない」ことを意味します。最大文字列サイズに妥当な制限がある場合は、常に他の文字列以上
の文字列sが存在する可能性があります。サイズ制限がない場合、 sのコピーを取り、最後に1文字を追加して、 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 に答える