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

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

本文关键字:列表 添加 不需要 搜索 是否 检查 c++ 数字 一个      更新时间:2023-10-16

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

还有一个坐标列表(由说,N (x,y)对组成),我们要处理,这样对于每个坐标,我们得到一个映射到我们矩阵中的特定行(r)和列(c)。我们基本上有[r, c] = f(x,y)。映射函数f的特殊性并不重要。然而,我们想做的是,通过将它们插入到另一个名为索引列表的列表中,来跟踪所使用的行r和列c

问题是,如果(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)对添加到列表中。