由于您想将所有点与所有其他点进行比较,您可以执行如下算法。假设这样的数据结构:
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";
}