获取存储在C++集中的结构中的值

Get values in a struct stored in C++ set

本文关键字:结构 集中 存储 C++ 获取      更新时间:2023-10-16

我声明了一个名为Position的结构,它有两个数据成员:x,y。我想将这些结构的实例存储到std::集中。以后如何从右侧的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;

我试图实现的是一个二维地图中实体的跟踪系统。每次实体移动时,它的当前位置都会记录到集合中,这样以后我就可以找到它去过的地方。

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

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
    }
}

问题是我不知道如何找到具有正确数据进行比较的正确单元格。如果这听起来真的很困惑

,很抱歉

迭代器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的这种使用与list的使用没有太大区别,因为serach是线性的。您可以通过检查insert:的返回值来确定您插入的项目是否是没有循环的新项目

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

如果您插入的项是新项,则set::insert将第二个成员设置为truepair返回;如果集合中已存在另一个具有相同数据的项,则返回false