我有一个
std::map<a,std::vector<b>> m;
a是一个结构
struct a
{
std::string c,d;
bool operator<(const a &o)
{ return !(c==o.c && d==o.d);}
}
我用这种方式填充地图
for(/*blah blah*/)
{
m[A].push_back(B)
}
在填充后,我正在打印一些东西
std::cout << "Size:" << m.size() << std::endl;
int i=0;
for(std::map<a,std::vector<b>>::iterator it = m.begin(); it != m.end();i++,it++)
{
std::cout << "[" <<i <<"] " << it->second.size() << std::endl;
}
我得到的输出是
Size: 12
[0] 1
[1] 3
有人可以解释为什么map :: size()在仅对2个元素进行迭代时显示12吗?
将比较功能更改为
bool operator<(const a &o) const
{
if ( c == o.c )
return d < o.d;
return c < o.c;
}
请注意,使其成为非成员函数通常更有用。
您的比较功能必须遵循以下规则:
如果我们将定义
equiv(a, b)
为!comp(a, b) && !comp(b, a)
,则要求comp和equiv均为传递关系:-
comp(a, b) && comp(b, c)
暗示comp(a, c)
-
equiv(a, b) && equiv(b, c)
暗示equiv(a, c)
映射使用比较函数生成其数据结构并对其进行迭代,因此,如果您的函数错误,则可能会发生任何事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句