我正在制作一张地图进行比较,看看一个单词的所有字母是否都是唯一的。当我创建这个地图时,我为相应的字符存储了值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
答案 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::sting
和std::set
,则可以将整个函数写为
bool unique(const std::string& word)
{
return std::set(word.begin(), word.end()).size() == word.size();
}
它的作用是从set
构建string
而set
具有相同的机制,因为它只允许使用唯一键。这意味着如果尺寸不同,那么至少有一个重复的字符。
答案 1 :(得分:0)
您可以使用带增量的默认值:
if (cmpr[word[i]]++ != 0)
// value was already present
这有额外的好处(取决于你如何看待它),你可以在添加数据后得到每个字符的出现次数。