C ++:比较数据文件中的点集

时间:2012-07-17 12:54:29

标签: c++

我有一个由三列x,y和z组成的数据文件(这些是数字)。我想做以下事情:

  1. 比较数据中的每个(x,y)集。
  2. 如果两组相等,说(x1,y1)=(x2,y2),
  3. 然后,比较z1和z2。根据比较,我会写一个条件,我想覆盖其中一个集合,以便它取得通过我所做的某些条件的值的值。
  4. 数据包含数千个点,因此我不确定如何有效地进行比较,以及如何覆盖或省略不通过该条件的点。

      

    所以有人可以建议一些事情,或者给一些小事   例如,我只有两个点(x1,y1,z1)和(x2,y2,z2)。

2 个答案:

答案 0 :(得分:2)

由于您想要将所有点与所有其他点进行比较,您可以执行如下算法。假设这样的数据结构:

struct Data {
    double x_, y_, z_;
    bool skip;
    const std::pair<double, double> & xy () const {
        return std::pair<double, double>(x, y);
    }
};

std::vector<Data> file;
typedef std::multimap<std::pair<double, double>, unsigned> PointMap;
PointMap xyline;

然后,当您在文件中读取时,搜索xyline以查看当前点是否已存在。如果是这样,请相应地更新当前点和file向量(因为您知道所有匹配点的行号,您可以修改所有匹配或仅修改最新匹配,您的选择)。然后插入与当前行关联的当前点,然后迭代到文件中的下一行。

处理完文件后,写出file的内容。然后,如果您愿意,可以使用输出替换现有文件。

void update (PointMap::iterator first, PointMap::iterator last, Data &d) {
    //... revisit all matching points and decide which to keep
}

Data d;
std::ifstream ifile;
std::ofstream ofile;
ifile.open("input.dat");
while (ifile >> d.x_ >> d.y_ >> d.z_) {
    PointMap::iterator i = xyline.find(d.xy());
    if (i != xyline.end()) {
        update(i, xyline.upper_bound(d.xy(), d);
    }
    xyline.insert(i, std::pair<d.xy(), file.size());
    file.push_back(d);
}

ofile.open("output.dat");
for (size_t i = 0; i < file.size(); ++i) {
    d = file[i];
    if (!d.skip)
        ofile << d.x_ << " " << d.y_ << " " << d.z_ << "\n";
}

答案 1 :(得分:0)

typedef std::map<float, float> Leafs;
typedef std::map<float, Leafs> Node;

Node root;

以这种方式填充树: 假设您要添加(a,b,c)

Leafs l;
l[ b ] = c;
root[ a ] = l;

然后当您添加新值时,使用查找(检查std :: map :: find方法描述)方法来检查值是否存在。这应该足够快解决这个'问题'