C++ 如何更改地图中的默认整数值?
我正在创建一个地图来比较一个单词的所有字母是否都是唯一的。当我创建此贴图时,我为相应的角色存储值1。问题是,当我从字符键打印贴图的值时,我只收到所有值的零 在试图研究这一点时,有人告诉我这是因为映射的所有值都默认为零,我的整数必须初始化才能更改。我不完全清楚他们所说的需要初始化的整数是什么意思,因为我应该能够传入一个文本整数值,对吗 以下是我当前拥有的代码,正如您将看到的,我正在尝试为单词的字符传入1,并且我的代码检查该字符是否已存在于地图中:C++ 如何更改地图中的默认整数值?,c++,dictionary,hashmap,C++,Dictionary,Hashmap,我正在创建一个地图来比较一个单词的所有字母是否都是唯一的。当我创建此贴图时,我为相应的角色存储值1。问题是,当我从字符键打印贴图的值时,我只收到所有值的零 在试图研究这一点时,有人告诉我这是因为映射的所有值都默认为零,我的整数必须初始化才能更改。我不完全清楚他们所说的需要初始化的整数是什么意思,因为我应该能够传入一个文本整数值,对吗 以下是我当前拥有的代码,正如您将看到的,我正在尝试为单词的字符传入1,并且我的代码检查该字符是否已存在于地图中: #include <iostream
#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");
}
这里的问题是
if(cmpr[word[i]])
如果一个元素不存在(此处不存在),则将其插入到映射中。也就是说
cmpr.insert(pair<char,int>(word[i],1));
因为find
不会插入元素或更改
cmpr.insert(pair<char,int>(word[i],1));
让它发挥作用
但请注意,这些都不是真正必要的。如果使用
std::sting
和std::set
则整个函数可以写成
bool unique(const std::string& word)
{
return std::set(word.begin(), word.end()).size() == word.size();
}
它的作用是从
字符串
构造一个集
,而集
具有相同的机制,只要它只允许唯一的键。这意味着,如果大小不相同,则其中至少有一个重复字符。您可以使用带有增量的默认值:
if (cmpr[word[i]]++ != 0)
// value was already present
这增加了额外的好处(取决于您如何看待它),您可以在添加数据后获得每个字符的出现次数。更喜欢使用
std::string
而不是字符数组指针。字符数组的一个常见问题是比较指针的顺序而不是目标字符串。搜索映射
时,更喜欢使用查找
,而不是[]
。find
不会插入新键。或者修复条件以检查元素是否存在而不插入一个(map::find()
成员函数)@BenVoigt Wow。真不敢相信我竟然忘了。再次感谢。
cmpr[word[i]] = 1;
bool unique(const std::string& word)
{
return std::set(word.begin(), word.end()).size() == word.size();
}
if (cmpr[word[i]]++ != 0)
// value was already present