0

我试图找出一个对象是否存在于指针向量中。

vector<Objectoid*> elements;

bool contains(Objectoid &o){
    for(int i = 0; i < elements.size(); i++){
        if(elements[i] == &o){
            return true;
        }
    }
    return false;
}

但得到这些错误,

no match for 'operator==' in '__first. __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Objectoid**, _Container = std::vector<Objectoid*, std::allocator<Objectoid*> >]() == __value'

stl_algo.h.

非常感谢帮助。

编辑:

完整代码

class Cell : public Element{

public:
    Rectf cellRect;
    Vec2i size;
    Vec2i pos;
    vector<Objectoid*> elements;

    Cell(Vec2f &pos_, Vec2f &size_){
        pos = pos_;
        size = size_;
        Vec2f p2 = Vec2f(pos.x + size.x, pos.y + size.y);
        cellRect = Rectf(pos, p2);
    }

    void add(Objectoid &o){
        elements.push_back(&o);
    }
    void remove(Objectoid &o){
        elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
    }

    bool contains(Objectoid &o){
        for(int i = 0; i < elements.size(); i++){
            if(elements[i] == &o){
                return true;
            }
        }
        return false;
    }

};

我正在尝试在 2D 游戏中实现用于碰撞检测的哈希表。这是表格中每个单元格的类。

编辑

所以罪魁祸首其实是

void remove(Objectoid &o){
    elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
}
4

2 回答 2

1

首先,评论:您现在提供了一些我们可以编译的东西,这很有帮助。话虽如此,您提供的一堆代码不是问题的一部分(例如您的构造函数),我们实际上无法编译您提供的代码(Vec2i没有定义)。

其次,您的问题的答案: Clang 提供以下错误:

/usr/include/c++/4.2.1/bits/stl_algo.h:208:17: error: invalid operands to binary expression ('Objectoid *' and 'const Objectoid')
      if (*__first == __val)

sa.cc:27:19: note: in instantiation of function template specialization 'std::remove<__gnu_cxx::__normal_iterator<Objectoid **, std::vector<Objectoid *, std::allocator<Objectoid *> > >, Objectoid>' requested here
      elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());

如果我将该行更改为:

elements.erase(std::remove(elements.begin(), elements.end(), &o), elements.end());

然后一切编译。我提供的版本可以编译,因为 std::remove 的第三个参数必须是value_type您正在迭代的任何内容。您最初提供了 a Objectoid,但我们需要它成为value_type您的容器的 ,即 a Objectoid *


并且只是为了扩展第一个注释,一个很好的简化问题陈述可以包含如下所示的代码。它非常小,问题仍然很明显。遇到这种情况的任何人都可以很快提供帮助。

#include <vector>
#include <algorithm>

class Objectoid {};

int main() {
    std::vector<Objectoid *> elements;
    Objectoid o;

    elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
}
于 2013-04-23T21:53:40.453 回答
0

您的问题没有意义,因为编译器在抱怨operator*,但在您的示例中没有使用它。

同时,您应该使用 STL 算法并将您的重写contains为:

bool contains(Objectoid &o) {
    return std::find(elements.cbegin(), elements.cend(), &o) != elements.cend();
}

这完全避免了这个问题。

于 2013-04-23T21:39:35.123 回答