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

我想确定是否ourstack可以在向量中找到堆栈中的顶部字符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 在 stack 类中不存在,但 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 回答