0
if (find(visitable.begin(), visitable.end(), ourstack.returnTop())) { ... }

ourstackスタックの一番上の文字が vector で見つかるかどうかを判断したいvisitable。はいの場合、このキャラクターを から削除してvisitableください。

それをどのようにコーディングしますか?ベクトルが を使用することは知ってeraseいますが、その文字の特定の場所が必要です (わかりません)。

これは私の迷路探索課題です。

また、returnTopエラーが表示されます: class "std.stack<char..." has no member returnTop。プログラムの先頭で #include を宣言しました。ここで何が起こっているのですか?

前もって感謝します!

4

2 に答える 2

3

を使用している場合findは、キャラクターの位置が既にわかっています。find文字が見つかった位置への反復子を返すか、見つからない場合は end として使用される値への反復子を返します。

vector<?>::const_iterator iter =
    find(visitable.begin(), visitable.end(), ourstack.top());
if( iter != visitable.end() )
{
    visitable.erase( iter );
}

についてstackは、探している機能は ですtop()。標準 C++ ライブラリは、Java や C# に似たキャメルケース識別子を使用しません。

于 2012-05-26T22:51:53.683 に答える
1

ちょうどこのような:

// Note assume C++0x notation for simplicity since I don't know the type of the template
auto character = ourstack.top();

auto iter = std::find(visitable.begin(), visitable.end(), character);
if (iter != visitable.end())
    visitable.erase(iter);

returnTop はスタック クラスには存在しませんが、top には存在します。

または、一般的な(そして派手な方法で)それを行う場合:

// Assume type of vector and stack are the same
template <class T>
void TryRemoveCharacter(std::vector<T>& visitable, const std::stack<T>& ourStack)
{
    // Note, could have passed a ref to the character directly, which IMHO makes more sense
    const T& ourChar = ourStack.top();

    visitable.erase(std::remove_if(visitable.begin(), visitable.end(), [&ourChar](const T& character)
    {
        // Note, this will not work http://www.cplusplus.com/reference/algorithm/find/
        // says that std::find uses the operator== for comparisons but I doubt that
        // as compilers typically do not generate equal comparison operator.
        // See http://stackoverflow.com/questions/217911/why-dont-c-compilers-define-operator-and-operator
        // It's best to either overload the operator== to do a true comparison or
        // add a comparison method and invoke it here.
        return ourChar == character;
    }));
}

注: この代替方法は、あなたが高度な C++ 機能 (C++0x) を突然導入したことに、教師が疑念を抱く可能性があるため、課題には適していない可能性があります。
しかし、知的好奇心のためにはうまくいくかもしれません;)

使用方法は次のとおりです。

TryRemoveCharacter(visitable, ourstack);
于 2012-05-26T22:56:56.770 に答える