C++ 允许复制的地图?

C++ 允许复制的地图?,c++,dictionary,C++,Dictionary,有人能帮我理解吗 我已经从二维字符数组中创建了一个字符字符串作为key和int作为值的映射。我看到地图上插入了重复的条目 为了进一步测试,我向一个映射添加了两个相同值的字符字符串(同样在代码中,注释),并且只添加了其中一个 void countstr(char words[][NUM_OF_STR]) { map<char*, int> mwords; cout<<"ORIG"<<endl; for(int i = 0; i <

有人能帮我理解吗

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

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

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;
}

如果你比较
单词[0]
单词[3]
你会发现它们不一样。这是因为它们是指针,所以操作符
==
如果你比较
单词[0]
单词[3]
,你会发现它们不一样。这是因为它们是指针,所以运算符
==
可选,
std::string\u view
。假设真实代码中没有生命周期问题。对于傻笑,还可以使用
std::less
作为比较器。@Deduplicator好主意!因此,如果编译器决定将它们视为两个单独的字符串(即使它们的内容相同),也可以允许使用带有文字“abc”字符串的注释映射插入语句。@RakeshMhasawade停止考虑字符串,你没有字符串,你有指针。问题在于编译器是否对具有相同内容的两个字符串文本使用相同的指针。当然,简单的答案是开始使用真正的字符串
map mwords
@RakeshMhasawade是。可选,
std::string\u视图
。假设真实代码中没有生命周期问题。对于傻笑,还可以使用
std::less
作为比较器。@Deduplicator好主意!因此,如果编译器决定将它们视为两个单独的字符串(即使它们的内容相同),也可以允许使用带有文字“abc”字符串的注释映射插入语句。@RakeshMhasawade停止考虑字符串,你没有字符串,你有指针。问题在于编译器是否对具有相同内容的两个字符串文本使用相同的指针。当然,简单的答案是开始使用真正的字符串
map mwords
@RakeshMhasawade Yes.“允许重复的映射”-这将是一个
std::multimap
(或一个
std::Map
持有一个有一个坏
操作符的类型的
允许重复的映射”-这将是一个
std::multimap
(或一个
std::Map
持有一个有坏
操作符的类型的映射)
ORIG
abc
1
pqr
2
xyz
3
abc
4
pqr
5

MAP
abc     0
pqr     0
xyz     0
abc     0
pqr     0