我有一张地图,我已声明如下:
map<int, bool> index;
我将值插入地图中:
int x; cin>>x;
index[x]=true;
然而,
cout<<index[y]; // for any number y not in
{索引{1}}
gives me 0
,我怎样才能可靠地找出地图中是否存在密钥?答案 0 :(得分:8)
您可以使用if (index.find(key) == index.end())
来确定是否存在密钥。使用index[key]
默认构造一个新值(在这种情况下,您调用bool()
,并将其打印为0
。)新构造的值也会插入到地图中(即在这种情况下,index[key]
与index.insert(std::make_pair(key, bool())
相同。)
对同一数据使用两个数据结构是可以的。但是,是否需要使用地图,在您的用例中是不是已经足够了?即如果他们的密钥是礼物,则值为true,否则为false?
答案 1 :(得分:2)
要查找两个集合(给定为std::set
)是否不相交,您可以简单地计算它们的交集:
std::set<T> X, Y; // populate
std::set<T> I;
std::set_difference(X.begin(), X.end(), y.begin(), y.end(), std::back_inserter(I));
const bool disjoint = I.empty();
如果您的容器不是std::set
,则必须确保订购范围。
如果您想提高效率,可以为set_intersection
实施algorithm,并在拥有共同元素后停止:
template <typename Iter1, typename Iter2>
bool disjoint(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2)
{
while (first1 != last1 && first2 != last2)
{
if (*first1 < *first2) ++first1;
else if (*first2 < *first1) ++first2;
else { return false; }
}
return true;
}
答案 2 :(得分:1)
使用map::find。
答案 3 :(得分:1)
1,使用index.count(y)
。它比index.find(y) != index.end()
更简洁,等同于它是一个整数1或0的事实,而当然!=
给你一个布尔。
缺点是count
multimap
的效率可能低于map
,因为它可能需要计算多个条目。由于您没有使用multimap
,因此没问题。
2,你可以对两个向量进行排序并使用std::set_intersection
,但如果你关心的是交叉点是否为空,那么这不是一个完美的选择。根据输入的来源,您可以摆脱两个向量,只需从第一次输入加载时构造map
,然后检查第二个输入加载的每个元素。最后,使用set
代替map
。
答案 4 :(得分:1)
index.find(key) != index.end()
或index.count(key) > 0
count(key)
和find(key)