在地图中找到一把钥匙

时间:2011-07-27 17:47:46

标签: c++ algorithm stl

我有一张地图,我已声明如下:

map<int, bool> index;

我将值插入地图中:

int x; cin>>x;
index[x]=true;

然而,

cout<<index[y]; // for any number y not in {索引{1}}

  1. 当我检查地图中不存在的密钥时,我得到值gives me 0,我怎样才能可靠地找出地图中是否存在密钥?
  2. 我正在使用地图试图找出两组是否不相交,同时我使用的是地图,还有两个向量来存储输入。这有点破旧吗?我应该使用其他一些数据结构吗?

5 个答案:

答案 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)

  1. 您可以使用index.find(key) != index.end()index.count(key) > 0
  2. 根据索引项的范围,使用位图可能会很好(只对合理的小范围的可能索引项有意义。将检查不相交的超级简单和高效)或使用a set而不是地图(地图存储其他不需要的bool)。一组还提供方法count(key)find(key)