2017-04-03 6 views
2

別の文字列内の指定された文字列を検索したい。前回の計算で知られている可能性のある開始点。例:std :: memcmpまたはstring :: compareとの部分文字列の比較?

int main() 
{ 
    std::string input("Foo Bar Hash Bang"); 
    std::string keyword("Bar"); 

    const char* inputStart = input.c_str() + 4; // at 'B' 
    std::cout << "memcmp=" << std::memcmp(inputStart, keyword.c_str(), keyword.length()) << "\n"; 

    std::cout << "compare=" << input.compare(4, keyword.length(), keyword) << "\n"; 

    return 0; 
} 

Ideone

は両方とも同等か?キーワードの長さが開始位置からの入力長を超えた場合、memcmpとの比較は正しいです。 strncmpはより安全なアプローチですか?

+0

std :: stringによって提供されるfind()メソッドを使用しないのはなぜですか? –

+0

@Oz。パフォーマンス。その時点で、私はすでに可能なキーワードの位置と長さを知っています。 find()では、入力文字列全体のすべてのキーワードに対してfindを呼び出さなければなりません。入力文字列にはキーワードがまったくないかもしれません。 – aggsol

答えて

4

std::char_traits<char>::compareは標準ライブラリベンダーのほとんどでmemcmpを使用しているので安全で冗長です(VC++とGCCはそれぞれmemcmp__builtin_memcmpを使用しています)。

パフォーマンスのためにはそれほど変わらないでしょう。

std::string::compareの方がよい。

1

あなたはstd::string_view使用することができます

bool matchSubstring(std::string_view haystack, 
        std::string_view needle, 
        std::size_t pos) 
{ 
    if(haystack.size() < pos + needle.size()) return false; 
    return haystack.compare(pos, needle.size(), needle) == 0; 
} 

使用法:

std::string input("Foo Bar Hash Bang"); 
std::string keyword("Bar"); 

std::cout << std::boolalpha << matchSubstring(input, keyword, 4) << "\n" 
          << matchSubstring(input, keyword, 5) << "\n" 
          << matchSubstring(input, keyword, 1000) << "\n"; 

真偽偽

live wandbox example

+0

私は新しいC++ 17の機能が好きです。 substr()はすでにオーバーフローの可能性を処理してはいけませんか?部分文字列は短く、一致しません。一方、substr()は常にコピーを作成します。私はまずそれをテストしなければならないでしょう。 – aggsol

+0

['substr'](http://en.cppreference.com/w/cpp/string/basic_string_view/substr)は新しい' string_view'を作成します。また、値が範囲外である場合はスローされます。なぜそれが明示的にチェックされているのですか。 –

+0

また、代わりに、代わりに 'compare'を使用する答えを更新しました:) –

関連する問題