C ++中的存在图

时间:2020-03-06 14:38:17  来源:igfitidea点击:

我想要一个std :: map之类的东西,但是我只想查看该项目是否存在,我实际上不需要键和值。我应该使用什么?

解决方案

看起来我们需要一个std :: set。

如果我们想要与std :: map相同类型的行为,则需要std :: set

如果混合使用插入/删除和查询操作,则" std :: set"可能是最佳选择。但是,如果我们可以先填充该集合,然后再进行查询,则可能值得使用std :: vector,对其进行排序,然后使用二进制搜索来检查向量中是否存在。

如果数据是数字数据,则可以使用针对空间进行了优化的std :: vector:

D:\Temp>type vectorbool.cpp
#include <iostream>
#include <vector>

using namespace std;

int main() {
        vector<bool> vb(10);
        vb[5] = true;

        for (vector<bool>::const_iterator ci = vb.begin(); ci != vb.end(); ++ci) {
                cout << *ci << endl;
        }
}

D:\Temp>cl /nologo /W4 /EHsc vectorbool.cpp
vectorbool.cpp

D:\Temp>vectorbool.exe
0
0
0
0
0
1
0
0
0
0

我们可以继续将std :: map用于所需的目的。

要检查地图中是否存在特定项(键类型),可以使用以下代码:

if (mapObj.count(item) != 0)
{
   // item exists
}

如前所述,std :: set也可以完成此工作。有趣的是,set和map在内部都表示为Trees。

如果我们真的只需要存在,甚至不需要命令,那么就需要一个unordered_set。可以从我们最喜欢的C ++ 0x供应商或者boost.org获得。

如果键是值,那么我们可能还会考虑使用" bloom过滤器",而不是集合。

我们可能应该查看stl :: set以了解所需的内容。 stl :: bitset是另一个选择。

这将取决于我们需要如何使用信息来定义哪种更好。 set是一种排序的数据结构,插入,查找和删除需要O(LOG N)时间。但是,如果我们需要遍历标记为"存在"的所有值,则可以使用" set"。

如果我们只需要标记和查找某物是集合成员的事实,那么" bitset"可能对我们更好。插入,查找和删除仅需O(1),但只能收集int值。对所有标记的值进行迭代将需要O(N),因为我们需要遍历整个集合以查找设置为true的成员。我们可以将其与stl :: map一起使用,以将我们拥有的值映射到" bitset"所需的数值。

查看需要使用集合中的值执行的操作,我们应该能够选择适当的数据结构