我声明了一个名为Position的结构,其中包含2个数据成员:x,y。我想将这些结构的实例存储到std :: set中。我怎样才能从右边的位置结构中检索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
}
}
问题是我不知道如何找到具有正确数据的正确单元格。对不起,如果这听起来真的很混乱
答案 0 :(得分:1)
Iterator 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
返回pair
,如果您插入的项目是新项目,则第二个成员设置为true
,如果另一个项目设置为false
,则返回{{1}}相同的数据已经在集合中。