c++ - map 允许重复?

标签 c++ dictionary

<分区>

有人能帮我理解一下吗?

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

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

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

最佳答案

如果比较words[0]words[3]你会发现它们不一样。那是因为它们是指针,所以运算符 == , < etc 将查看您的 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 )为你的 key 。 :)

关于c++ - map 允许重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204837/

相关文章:

c++ - 如何从调用的函数获取返回值,该函数在 TBB 的另一个线程中执行?

c++ - std::string 实现是否符合 's.c_str() + s.size()' 不一定与 '&s[s.size()]' 相同?

vb.net - 无法在字典上使用 LINQ 中的 .Count()

python - 使用 for 循环从列表中删除字典

c++ - 是否可以检查接口(interface)是否在 pcap 中激活?

c++ - 已初始化静态变量的警告 C26495

c++ - 将 vector 地址转换为 native 指针是否安全?

python - 删除具有空白值的键

java - 如何在 Hashmap 中使用扩展 Jackson MapSerializer

c# - 如何创建仅存在于 ResourceDictionary 上下文中的样式