比较一个类的每个实例的变量 - C ++

时间:2011-08-12 15:15:38

标签: c++ class instance

这可能很简单,但我似乎无法在任何地方找到解决方案。这是一个C ++问题。 基本上,我有一个有几个实例的类。我想自动检查这个类的每个实例中的变量。我无法手动检查每个实例,因为它们有几百个。有谁知道怎么做?

为清楚起见,这是我正在尝试实现的确切用法: 我有一个名为Room的课程,其中包括属性X和Y. 玩家还拥有属性X和Y. 我需要对Room的每个实例进行排序,找出玩家坐标是否匹配,然后从该对象中提取数据。

干杯!

5 个答案:

答案 0 :(得分:1)

最初的方法是将所有房间放在矢量中,然后迭代矢量搜索匹配。 (即 - 使用.location()方法返回x,y坐标,并与玩家的位置进行比较)。

这种线性搜索可能很慢,所以我会研究使用类似kd-tree结构的东西,它专门用于空间搜索。

这里有一个非常好的标准库,基于标头的KD树容器(我已经使用了很多,并且发现相当不错):libkdtree++

答案 1 :(得分:1)

您可以将所有Room类放在std :: map中,键是std :: pair(或者X和Y都是)。那么你将获得比矢量解决方案更好的性能。

答案 2 :(得分:0)

如果属性X,Y不太“糟糕”,那么您可以将属性X,Y映射到特定房间

答案 3 :(得分:0)

您尚未提及如何存储Room的所有实例。我们假设您将它们放在std::vector(或您可以迭代的另一个容器)中,称为rooms。您可以使用find_if找到实例。

struct Finder
{
  Finder( int x, int y ) : x_(x), y_(y) {}

  bool operator()( const Room& room ) 
  {
    return (room.getX() == x_) && (room.getY() == y_);
  }
private:
  int x_;
  int y_;
};

Finder finder( 10, 20 ); // these are the coordinates you're looking for

std::vector<Room>::const_iterator it = find_if( rooms.begin(), rooms.end(), finder );

如果您使用的是支持lambdas的编译器,或者您正在使用boost,则可以删除Finder结构并将其替换为lambda。

答案 4 :(得分:0)

如果性能是问题,那么你应该寻找空间数据结构,如kd-tree,quadtree或octree。