在地图上找到钥匙

finding a key in a map

本文关键字:钥匙 地图      更新时间:2023-10-16

我有一个map,我声明如下:

map<int, bool> index;

和I在映射中插入值:

int x; cin>>x;
index[x]=true;
然而,

cout<<index[y]; // for any number y not in索引gives me 0

  1. 当我检查地图中不存在的键时,我得到值0,我如何才能可靠地找出地图中是否存在键?
  2. 我正在使用映射来尝试找出两个集合是否不相交,并且同样我使用映射和两个向量来存储输入。这有什么寒酸吗?我应该用别的数据结构吗?

您可以使用if (index.find(key) == index.end())来确定是否存在一个键。使用index[key]默认构造一个新值(在本例中,调用bool(),并将其打印为0)。新构造的值也被插入到映射中(即index[key]在本例中等于index.insert(std::make_pair(key, bool()))

对于相同的数据使用两个数据结构是可以的。然而,是否有必要使用映射?在您的用例中,一个集合还不够吗?也就是说,如果他们的键是呈现,值为真,否则为假?

要找出两个集合(给定为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的算法,一旦你有一个共同的元素就停止:

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;
}

使用map::find.

  1. 您可以使用index.find(key) != index.end()index.count(key) > 0
  2. 根据索引项的范围,使用位图可能会更好(仅对可能的索引项的相当小的范围有意义)。将检查是否断开(超级容易和有效)或使用一个集合而不是一个地图(地图存储额外的不需要的bool)。一组还提供count(key)find(key)方法

1、使用index.count(y)。它比index.find(y) != index.end()更简洁,也更等效,除了它是一个整数1或0,而!=当然给你一个bool值。

缺点是countmultimap的效率可能低于map,因为它可能需要计算多个条目。因为你没有使用multimap,所以没有问题。

2,你可以对两个向量进行排序并使用std::set_intersection,但如果你只关心交集是否为空,那么它就不是一个完美的匹配。根据输入的来源,您可以摆脱这两个向量,并在从第一次输入加载开始时仅构建map,然后根据它检查第二次输入加载的每个元素。最后,使用set代替map