c – std :: map的同义词行为
作者:互联网
我有一个
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()显示12而它只迭代2个元素?
解决方法:
将比较功能更改为
bool operator<(const a &o) const
{
if ( c == o.c )
return d < o.d;
return c < o.c;
}
请注意,使其成为非成员函数通常更有用.
您的比较功能必须遵循以下规则:
If we define
equiv(a, b)
as!comp(a, b) && !comp(b, a)
, then the requirements are that comp
and equiv both be transitive relations:—
comp(a, b) && comp(b, c)
impliescomp(a, c)
—
equiv(a, b) && equiv(b, c)
impliesequiv(a, c)
地图使用比较函数生成其数据结构并对其进行迭代,因此如果您的函数错误,则可能发生任何事情.
标签:c,stdmap 来源: https://codeday.me/bug/20190830/1770674.html