其他分享
首页 > 其他分享> > c – std :: map的同义词行为

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) implies comp(a, c)

equiv(a, b) && equiv(b, c) implies equiv(a, c)

地图使用比较函数生成其数据结构并对其进行迭代,因此如果您的函数错误,则可能发生任何事情.

标签:c,stdmap
来源: https://codeday.me/bug/20190830/1770674.html