0

我声明了一个名为 Position 的结构,它有 2 个数据成员:x、y。我想将这些结构的实例存储到 std::set 中。我以后如何从正确的 Position 结构中检索 x, y 的值?

struct Position
{
    long m_x;
    long m_y;
    Position(long x, long y) : m_x(x), m_y(y) {}
}

std::set<Position> m_visited;

我正在尝试实现的是 2D 地图中实体的跟踪系统。每次实体移动时,它的当前位置都会被记录到集合中,以便稍后我可以知道它到了哪里。

我通过每次移动时调用它来记录它的当前位置。

m_visited.insert(Position(CorX(),CorY());

稍后,我想查看我的实体将要访问的新单元格是否已被访问。如果是,那么我会告诉实体选择其他单元格做某事,方法是说类似

for (set<Position>:iterator i = m_visited.begin(); i != m_visited.end(); i++)
{
    if ([X cor of next cell] != [X cor of a visited cell] && [Y cor of next cell] != [Y cor of a visited cell])
    {
         do something
    }
}

问题是我不知道如何找到具有要比较的正确数据的正确单元格。对不起,如果这听起来真的很混乱

4

1 回答 1

1

迭代器i可以像指针一样使用Position,所以你可以写

Position visited = ...
for (set<Position>:iterator i = m_visited.begin(); i != m_visited.end(); i++) {
    if (i->m_x == visited.m_x && i->m_y == visited.m_y) {
        ... // Been there before
    }
}

但是,这种用法与set使用 a 没有太大区别list,因为 serach 是线性的。您可以通过检查以下的返回值来确定您插入的项目是否是没有循环的新项目insert

if (!m_visited.insert(Position(CorX(),CorY())).second) {
    // Position at { CorX(), CorY() } has been visited
}

set::insert如果您插入的项目是新项目,则返回 apair并将第二个成员设置为 to ,如果另一个具有相同数据的项目已经在集合中,则返回 to。truefalse

于 2014-04-17T09:51:42.907 回答