【问题标题】:Map allowing duplicates? [duplicate]地图允许重复? [复制]
【发布时间】:2019-01-15 18:27:22
【问题描述】:

有人可以帮我理解一下吗?

我创建了一个 char 字符串映射作为键和 int 作为二维 char 数组中的值。我看到地图中插入了重复的条目!

为了进一步测试,我在映射中添加了两个相同值的字符字符串(也在代码中,注释了),并且只添加了其中一个。

void countstr(char words[][NUM_OF_STR])
{
    map<char*, int> mwords;

    cout<<"ORIG"<<endl;
    for(int i = 0; i < NUM_OF_STR; i ++)
    {
        cout<<words[i]<<endl;
        mwords.insert(pair<char*, int>(words[i], 0));
        cout<<mwords.size()<<endl;
    }

    map<char*, int>::iterator itr;

    cout<<endl<<"MAP"<<endl;
    for(auto i = mwords.begin(); i != mwords.end(); i ++)
    {
        cout<<i->first<<"\t"<<i->second<<endl;
    }

    return;
}

int main()
{
    char words[NUM_OF_STR][5] = { "abc", "pqr", "xyz", "abc", "pqr" };

    /*map<char*, int> mwords;
    mwords.insert(pair<char*, int>("abc", 1));
    cout<<mwords.size()<<endl;
    mwords.insert(pair<char*, int>("abc", 2));
    cout<<mwords.size()<<endl;*/

    countstr(words);
    return 0;
}

输出:

ORIG
abc
1
pqr
2
xyz
3
abc
4
pqr
5

MAP
abc     0
pqr     0
xyz     0
abc     0
pqr     0

【问题讨论】:

  • “允许重复的地图” - 那将是一个 std::multimap一个 std::map 持有一个带有损坏的 operator&lt; 的类型 - 记住,你的 tyoes 需要为map 实施严格的弱排序以做正确的事)。

标签: c++ dictionary


【解决方案1】:

如果您比较words[0]words[3],您会发现它们并不相同。那是因为它们是指针,所以运算符 ==&lt; 等将查看 C 字符串的地址,而不是内容。

由于它们的内容相同,it is possible — but not guaranteed — that their addresses will be the same too(这是字符串文字的生活事实)。在您的情况下,它们并不相同,因此键在逻辑上是不同的,并且两个元素都被接受。

指针不是容器。

您可以通过提供自定义比较器来make the map use strcmp instead,或者您可以只使用std::string(或std::string_view)作为您的密钥。 :)

【讨论】:

  • 替代,std::string_view。假设实际代码中没有生命周期问题。对于咯咯笑,也可以使用std::less&lt;std::string_view&gt; 作为比较器。
  • @Deduplicator 好主意!
  • 那么,如果编译器决定将它们视为两个单独的字符串(即使它们的内容相同),也可以允许带有文字“abc”字符串的注释映射插入语句?
  • @RakeshMhasawade 别再想字符串了,你没有字符串,你有指针。问题是编译器是否对具有相同内容的两个字符串文字使用相同的指针。简单的答案当然是开始使用真正的字符串map&lt;string, int&gt; mwords;
  • @RakeshMhasawade 是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多