如何更改地图中的默认整数值?

时间:2017-01-16 18:13:10

标签: c++ dictionary hashmap

我正在制作一张地图进行比较,看看一个单词的所有字母是否都是唯一的。当我创建这个地图时,我为相应的字符存储了值1。问题是,当我从字符键打印地图的值时,我只收到所有值的零。

在尝试研究这个时,有人告诉我这是由于地图的所有值都默认为零,我的整数必须初始化才能改变。我不完全清楚它们对整数的意义是什么需要初始化,因为我应该能够传入一个字面整数值,对吗?

以下是我目前的代码,因为您将看到我尝试传入1中的单词字符,我的代码会检查字符是否已经存在于地图中:

    #include <iostream>
    #include <map>
    using namespace std;
    bool unique(char const* word)
      {
       map<char,int> cmpr;

       for(int i =0; word[i]!='\0';i++)
       {
         if(cmpr[word[i]])
         {
           cout<<"Not all unique";
           return false;
         }
    else
        {
             cmpr.insert(pair<char,int>(word[i],1));
        }
            cout<<cmpr[char(word[i])];
    }
    for(map<char,int>::iterator it = cmpr.begin(); it != cmpr.end();it++)
    {

        cout<<it->first<<" and "<<it->second<<endl;


    }
    return true;
}
int main()

{
    unique("hello");
}

我的输出结果(尝试打印地图节点的第一个和第二个值时):

    e and 0 
    h and 0
    l and 0
    o and 0

2 个答案:

答案 0 :(得分:2)

这里的问题是

if(cmpr[word[i]])

如果元素不存在,则将元素插入到地图中。这意味着

cmpr.insert(pair<char,int>(word[i],1));

由于密钥word[i]已经存在,因此无法执行任何操作。

您可以做的是将条件更改为

if(cmpr.find(word[i]) != cmpr.end())

因为find不会插入元素或更改

cmpr.insert(pair<char,int>(word[i],1));

cmpr[word[i]] = 1;

让它发挥作用

请注意,这些都不是必需的。如果您使用std::stingstd::set,则可以将整个函数写为

bool unique(const std::string& word)
{
    return std::set(word.begin(), word.end()).size() == word.size();
}

它的作用是从set构建stringset具有相同的机制,因为它只允许使用唯一键。这意味着如果尺寸不同,那么至少有一个重复的字符。

答案 1 :(得分:0)

您可以使用带增量的默认值:

if (cmpr[word[i]]++ != 0)
    // value was already present

这有额外的好处(取决于你如何看待它),你可以在添加数据后得到每个字符的出现次数。