我正在创建一个地图来比较和看看一个单词的所有字母是否都是唯一的。当我创建这个映射时,我存储对应字符的值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发布于 2017-01-16 18:21:26
这里的问题是
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();
}这样做的目的是从string构造一个string,并且set具有相同的机制,如果它只允许唯一的键。这意味着,如果大小不一样,那么至少有一个重复的字符在那里。
发布于 2017-01-16 18:32:28
可以将默认值与增量一起使用:
if (cmpr[word[i]]++ != 0)
// value was already present这有一个额外的好处(取决于您如何看待它),您可以获得每个字符在数据添加后出现的次数。
https://stackoverflow.com/questions/41682589
复制相似问题