在 C++ 中,检查一个数字是否已经添加到列表中,而不用暴力搜索该列表

In C++, check if a number has already been added to a list, without brute force searching that list

假设我有一个二维矩阵,由 vector<vector<double>> matrix 给出,并且 matrix 已经初始化为具有 R 行和 C 列。

还有一个 坐标列表 (由 N (x,y) 对组成),我们将要处理,这样对于每个坐标,我们都会得到到矩阵中特定行 (r) 和列 (c) 的映射。所以,我们基本上有 [r, c] = f(x,y)。映射函数 f 的特殊性并不重要。但是,我们想要做的是跟踪使用的行 r 和列 c,方法是将它们插入另一个列表,称为 list-of-indicies

问题是,如果 (r,c) 对已经存在于该列表中,我不想继续将相同的 rc 添加到列表中。蛮力方法是每次我想检查时简单地扫描整个索引列表,但这将非常耗时。

例如,如果我们有坐标 (x=4, y=5),则得到 (r=2, c=6)。因此,我们现在将 (r=2, c=6) 添加到索引列表中。现在我们得到一个新点,由 (x=-2, y=10) 给出。这也最终落在 (r=2, c=6) 之下。但是,由于我已经将 (r=2, c=6) 添加到我的列表中,所以我不想再次添加它!但是如果不对索引列表进行暴力扫描,有没有更好的方法?

你需要一张地图才能做到这一点。

如果你使用 c++11,你可以使用 unordered_map,它是一个 hashmap 并且有一个恒定的时间查找,如果你使用旧版本的 c++,你可以使用标准映射,它是树状图,并具有对数查找。

如果你没有很多项目,性能差异不会很大。

而不是 mapunordered_map 你可以简单地使用一个矩阵 vector<vector<bool>> 与每个矩阵相同的 RC字段初始化为 false。 您只需将矩阵中相应的布尔值设置为 true.

,而不是将 (r,c) 对添加到列表中