bugfix> c++ > 投稿

私はC ++で小さなプログラムを書いていました。このプログラムでは、指定された文字列が文字列のベクトルに存在するかどうかをチェックします。ここにコードがあります

std::vector<std::string> keywords {std::string("add_contact"),std::string("who"),std::string("block"),std::string("make_group"),std::string("send_images")}; // List of keywords defined in the grammar
bool search_Keyword(std::string keyword_text)
    {
        auto pos = std::find(keywords.begin() , keywords.end( ), keyword_text);
        return pos == keywords.end( );
    }     

このコードのデバッグ時に、文字列の文字の読み取りエラーを示すstd :: findでエラーがあることがわかりました。コードのどこが間違っていたのか理解できません。事前に助けてくれてありがとう。

回答 3 件
  • デバッガーが文字列を読み取れないことを通知しているようです。これはさまざまな理由で発生する可能性があります(たとえば、デバッグ情報をマングルする最適化、関数本体に入る前に関数の引数を読み取ろうとする、デバッガーのバグなど)。必ずしも問題を示しているわけではありません。プログラムの出力を確認し、プログラムの他の場所をデバッガーで調べ、デバッグビルドを使用して、コードが正しいことを実行していることを確認します。

  • あなたが書くコードは問題ありません...疑わしい唯一のことは、あなたが false を返すことです  アイテムを見つけたら!より良い解決策はこれです:

    bool isKeyword(const std::string& keyword_text) // <-- better name
    {
        auto pos = std::find(keywords.begin() , keywords.end( ), keyword_text);
        return pos != keywords.end();
    }
    
    

  • これは必要なことを正確に行うために使用したスニペットです。文字列に対してのみこれが必要な場合は、すべてのテンプレートを削除できます(リテラル型に依存しない必要があります):

    template <typename T, typename X>
    bool KeywordLookUp(std::vector<T> &vec, X toFind) 
    {
        auto pos = find(vec.begin(), vec.end(), toFind);
        if (pos == vec.end())
        {
            return false;
        }
        else
        {
            return true;
        }
    
    

あなたの答え