C ++中的存在性映射

时间:2008-09-24 01:54:57

标签: c++ stl map

我想要像std::map之类的东西,但我只想查看该项是否存在,我实际上并不需要键和值。我该怎么用?

7 个答案:

答案 0 :(得分:23)

您似乎需要std::set

答案 1 :(得分:7)

如果您想要与std::map相同类型的行为,那么您需要std::set

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

答案 2 :(得分:4)

如果你真的只需要存在,甚至不需要订单,你需要一个unordered_set。它可以从您最喜欢的C ++ 0x供应商或boost.org获得。

答案 3 :(得分:2)

如果您的数据是数字的,您可以使用针对空间优化的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

答案 4 :(得分:2)

你应该看看stl::set你需要什么。 stl::bitset是另一种选择。

这取决于您需要如何使用定义哪些更好的信息。 set是排序数据结构,插入,查找和删除需要O(LOG N)时间。但是,如果您需要迭代覆盖您标记为“存在”的所有值,那么set就是您的选择。

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

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

答案 5 :(得分:1)

您可以继续使用std :: map达到预期目的。

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

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

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

答案 6 :(得分:1)

如果键是值,那么您可能还会考虑“布隆过滤器”而不是集合。

相关问题