在地图上找到钥匙
finding a key in a map
我有一个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
- 当我检查地图中不存在的键时,我得到值
0
,我如何才能可靠地找出地图中是否存在键? - 我正在使用映射来尝试找出两个集合是否不相交,并且同样我使用映射和两个向量来存储输入。这有什么寒酸吗?我应该用别的数据结构吗?
您可以使用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.
- 您可以使用
index.find(key) != index.end()
或index.count(key) > 0
- 根据索引项的范围,使用位图可能会更好(仅对可能的索引项的相当小的范围有意义)。将检查是否断开(超级容易和有效)或使用一个集合而不是一个地图(地图存储额外的不需要的bool)。一组还提供
count(key)
和find(key)
方法
1、使用index.count(y)
。它比index.find(y) != index.end()
更简洁,也更等效,除了它是一个整数1或0,而!=
当然给你一个bool值。
缺点是count
对multimap
的效率可能低于map
,因为它可能需要计算多个条目。因为你没有使用multimap
,所以没有问题。
2,你可以对两个向量进行排序并使用std::set_intersection
,但如果你只关心交集是否为空,那么它就不是一个完美的匹配。根据输入的来源,您可以摆脱这两个向量,并在从第一次输入加载开始时仅构建map
,然后根据它检查第二次输入加载的每个元素。最后,使用set
代替map
。
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 带钥匙的C 11地图定义了一个值范围
- 在不知道的情况下获取地图的钥匙
- 在地图上找到钥匙
- 地图:坏Ptr,即使找到了钥匙