2

文字列var"sA"があり、文字列"123"がsAの最後にあるかどうかを確認したいとします。

何をすべきか、そしてその理由:

  • if(sA.length() > 2) sA.substr(sA.length()-3) == "123"
  • if(sA.length() > 2) sA.find("123", sA.length() -3) != string::npos

前もって感謝します

4

3 に答える 3

4

2番目のコードフラグメントは、2つの一時オブジェクト(1つはに"123"変換されstd::string、もう1つはの戻り値substr)の作成を回避するため、理論的にはより高速になるはずです。ただし、この種のマイクロ最適化が効果を発揮することはめったにありません。この最適化をランダムに適用した場合、最初の形式よりも2番目の形式を使用することで大きなメリットが得られる可能性はほとんどありません。

もちろん、プロファイラーが、プログラムがこのように文字列の終わりをチェックするのにかなりの割合の時間を費やしていると言った場合、状況は異なります。この場合、最適化が役立つ可能性があります。

于 2012-09-12T13:05:15.750 に答える
2

パフォーマンスが重要な場合、これより速くなることはないと思います(他の方法と比較して、割り当ては必要ありません)。

const char needle[] = "abc";
const char *haystack;
const int len = strlen(haystack);

if (len<sizeof(needle))
    return false;
for (int i=0; i<sizeof(needle); i++)
    if (needle[i] != haystack[len-sizeof(needle)+i])
        return false;
return true;

明らかにさまざまなマイクロ最適化が可能ですが、このアプローチは私が考えることができる最速です。


干し草の山にstd::stringを使用した、よりC ++yバージョン:

const char needle[] = "abc";
const std::string haystack;
const int len = haystack.length();

if (len<sizeof(needle))
    return false;
for (int i=0; i<sizeof(needle); i++)
    if (needle[i] != haystack[len-sizeof(needle)+i])
        return false;
return true;

O(1)である限りstd::string::operator[]、2つのリストのパフォーマンス特性は同じであることに注意してください。

于 2012-09-12T13:07:24.573 に答える
1

このコードは、おそらくテストしているコードよりも高速です。しかし、あなたはあなたがいくつかのテストをするかどうかだけを知るでしょう。

bool EndsWith(const string &strValue, const string &strEnd)
{            
    int iDiference = strValue.size() - strEnd.size();
    if(iDiference >= 0)     
        return (memcmp(strValue.c_str() + iDiference, strEnd.c_str(), strEnd.size()) == 0);

    return false;
}
于 2012-09-12T13:25:02.577 に答える