あなたはあなたが達成しようとしていることとあなたの要件が何であるかを述べるように努めるべきです。特に、文字列である必要がありますか?ドメインに制限はありますか?それらはと比較する必要があり<
ますか?
非文字列型を使用できます。
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;
}