地图计数确实很重要,或者只是检查是否存在
Map count really counts or just checks existence
在CPP入门或其他网站上,我发现count
(来自STLmap
(定义的语言非常模糊和误导:
在容器中搜索键等效于 k 的元素,并返回匹配项数
到目前为止,我所研究的是key
是奇异的,映射值也是奇异的 - 映射值可以通过赋值来更改。
那么它不只返回容器是否包含密钥吗?而不是伯爵?我在理解这个概念时哪里错了?
std::map
的count
(( 将始终返回 0 或 1。
但是C++库还有其他关联容器,这些容器很可能具有同一键的多个值。喜欢std::multimap
和std::multiset
.幸运的是,他们还有一个count()
方法,实际上可能返回大于 1 的值。
但这允许您做的是通过开发可以使用任何关联容器的模板进行元编程,这些模板可能是唯一的,也可能不是唯一的。您的模板需要做的就是使用count()
来确定具有给定键的容器中存在多少个值,最终结果可以与std::map
或std::multimap
一起使用。它丝毫不会在乎。在这两种情况下,您的模板都将获得正确的答案:具有给定键的容器中的值数。
根据 cplusplus.com
由于映射容器中的所有元素都是唯一的,因此该函数只能返回 1(如果找到元素(或零(否则(。
虽然前面的答案在count
重载方面是正确的,但这需要类型std::map::key_type
的参数,它们没有解决另一个需要模板化键的重载:
template< class K >
size_type count( const K& x ) const;
如此处所述,此重载"返回与 key 比较等效值 x 的元素数"。 这可以通过使用定义与自定义类型进行比较的自定义比较器返回大于 1 的值。
在下面的示例中,我编写了一个比较器,用于定义结构StartsWithK
的比较。这允许我将结构的实例作为键传递。
#include <map>
#include <string>
#include <iostream>
// Type for key argument
struct StartsWithK {};
// Custom comparator
struct Comp{
using is_transparent = void;
bool operator()(std::string lhs, std::string rhs) const {
return lhs.compare(rhs) < 0;
}
bool operator()(std::string lhs, StartsWithK rhs) const {
return tolower(lhs[0]) < 'k';
}
bool operator()(StartsWithK lhs, std::string rhs) const {
return 'k' < tolower(rhs[0]);
}
};
int main() {
// Pass custom comparator as template argument
typedef std::map<std::string,bool,Comp> IntMap;
IntMap map;
// Some dummy entries, note that there are four keys that start with k
map.emplace("army",true);
map.emplace("knight",true);
map.emplace("key",true);
map.emplace("kilogram",true);
map.emplace("robot",true);
map.emplace("karma",true);
map.emplace("sale",true);
// Display the results of std::map::equal_range and std::map::count
IntMap::const_iterator it1;
IntMap::const_iterator it2;
std::tie(it1,it2) = map.equal_range(StartsWithK());
std::cout << it1->first << " " << it2->first << std::endl;
std::cout << map.count(StartsWithK()) << std::endl;
}
控制台输出为:
karma robot
4
我已经尝试过这个,我发现如下:
- 匹配的键必须直接按照
std::map
的键顺序相互跟随
匹配键 - 前面的键必须低于匹配键 匹配键
- 后面的键必须大于匹配键的比较
换句话说,上面的示例之所以有效,是因为所有以字母 k 开头的键都已经按顺序排列,因为std::map
按字母顺序对其键进行排序。相反,我尝试实现一个带有int
键的映射,使用count
来查找偶数键的数量,但这不起作用,因为奇数和偶数交替出现。
我对幕后发生的事情的猜测是,std::map
在内部运行lower_bound(key)
和upper_bound(key)
,然后返回返回迭代器之间的距离作为结果。从我的测试中,我可以判断出count
不会单独检查每个键的等效性。
我还没有在网上找到任何使用自定义比较器的示例,而且文档很少,可能是错误的。
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 地图计数确实很重要,或者只是检查是否存在
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分
- 要检查它是完整的二叉树还是完全二叉树,或者两者都不是
- 当 what() != T 时,我如何使 boost::variant 返回 T(),或者我如何检查 T==what()
- 读取前检查boost::asio套接字上的数据?或者我应该使用async_read()
- 如果可能,尝试对字符串执行静态断言,或者在不是时回退到运行时检查
- dynamic_cast是否检查被查询对象的type_info对象,或者递归地检查
- 在线编译器工具是否执行所有操作,或者它们只是检查是否编译
- 是否执行decltype内的表达式,或者只是检查是否验证