C ++在不知道位置的情况下删除矢量中的特定值

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

我想,以确定是否在栈上的字符ourstack可以在载体中找到visitable 。 如果是的话,我希望这个角色从visitable被删除。

我将如何编码? 我知道载体使用erase ,但这需要该字符的具体位置(我不知道)。

这是为了我的迷宫寻路工作。

另外,我的returnTop给我一个错误: class "std.stack<char..." has no member returnTop 。 我在我的程序的顶部声明了#include。 这里发生了什么事?

提前致谢!


如果你使用find ,那么你已经知道角色的位置。 find返回一个迭代器到find该字符的位置,或者返回一个迭代器,如果它找不到的话。

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

至于stack ,你正在寻找的功能是top() 。 标准C ++库不使用camelCased标识符,看起来更像Java或C#的东西。


像这样:

// 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);
链接地址: http://www.djcxy.com/p/73779.html

上一篇: C++ Deleting a specfic value in a vector without knowing location

下一篇: Struct member equality without overloading operator== in C++