給定一個輸入字串A,是否有一種簡潔的方法來生成一個按B字典順序大于的字串A,即A < B == true?
我的原始解決方案是說:
B = A;
B.back();
但一般來說這是行不通的,因為:
A可能是空的- 的最后一個字符
A可能接近環繞,在這種情況下,結果字符將具有較小的值,即B < A。 - 每次添加一個額外的字符都是浪費,而且會很快出現在不合理的大字串中。
所以我想知道是否有一個標準庫函式可以在這里幫助我,或者當我想從任意字串開始時是否有一個很好的擴展策略。
uj5u.com熱心網友回復:
您可以將 A 復制到 B 然后查看最終字符。如果最后一個字符不是您范圍內的最后一個字符,那么您可以簡單地將其加一。
否則,您可以查看 last-1、last-2、last-3。如果您到達字串列的前面,則附加到長度。
uj5u.com熱心網友回復:
這是我的虛擬解決方案:
std::string make_greater_string(std::string const &input)
{
std::string ret{std::numeric_limits<
std::string::value_type>::min()};
if (!input.empty())
{
if (std::numeric_limits<std::string::value_type>::max()
== input.back())
{
ret = input ret;
}
else
{
ret = input;
ret.back();
}
}
return ret;
}
理想情況下,我希望避免對所有特殊情況進行顯式處理,并使用一些可以更自然地處理它們的工具。已經在看@JosephLarson 的答案,我看到我可以增加比最后一個字符更多的增量,這將在不添加更多字符的情況下提高可實作的范圍。
這是在這篇文章中的建議之后的改進:
std::string make_greater_string(std::string const &input)
{
constexpr char minC = ' ', maxC = '~';
// Working with limits was a pain,
// using ASCII typical limit values instead.
std::string ret{minC};
auto rit = input.rbegin();
while (rit != input.rend())
{
if (maxC == *rit)
{
rit;
if (rit == input.rend())
{
ret = input ret;
break;
}
}
else
{
ret = input;
(*(ret.rbegin() std::distance(input.rbegin(), rit)));
break;
}
}
return ret;
}
演示
uj5u.com熱心網友回復:
您可以復制字串并附加一些字母 - 這將產生按字典順序排列的更大的結果。
B = A "a"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321240.html
標籤:C 细绳 时间:2019-05-06 标签:c -standard-library
上一篇:模板朋友錯誤,錯誤:“類LinkedList”需要模板引數
下一篇:運算子多載矩陣乘法
