【发布时间】:2011-04-22 15:27:12
【问题描述】:
我发现检查重复项的唯一方法是插入并检查std::pair.second 的false,但问题是如果密钥未使用,这仍然会插入一些东西,而我想要的是@987654324 @函数。
【问题讨论】:
我发现检查重复项的唯一方法是插入并检查std::pair.second 的false,但问题是如果密钥未使用,这仍然会插入一些东西,而我想要的是@987654324 @函数。
【问题讨论】:
使用my_map.count( key );它只能返回 0 或 1,这本质上是您想要的布尔结果。
或者my_map.find( key ) != my_map.end() 也可以。
【讨论】:
map::count 被实现为find(__x) == end() ? 0 : 1;。对于multimap,您可能有性能争论,但这不是 OP 的问题,我仍然更喜欢优雅。
has(k) / contains(k)。界面设计差。 find() 方法过于冗长,count(k) 方法在语义上与has(k) 绝对不一样。就此而言,find(k) 也不是。查看此问题的观看次数。
Potatoswatter 的回答没问题,但我更喜欢用find 或lower_bound 代替。 lower_bound 特别有用,因为返回的迭代器随后可用于提示插入,如果您希望插入具有相同键的内容。
map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) { // not found
// ...
my_map.insert(iter, make_pair(key, value)); // hinted insertion
} else {
// ... use iter->second here
}
【讨论】:
value的计算。
lower_bound 的解决方案是矫枉过正。我刚刚提到了我的回答“为了完整性”;就像我说的,你的完全足够了。 :-)
insert 替代方案的关系。实际上,如果使用multimap,还有另一个区别,lower_bound 方法插入等效范围的开头,而普通的insert 方法添加到范围的末尾。
【讨论】: