c++
map<int,int> map;
cout<<map[0];
output:
0
说明c++中访问不存在的键则会默认设置为0
map<int,int> map;
cout<< sizeof(map)<<endl;
cout<<map[0]<<endl;
int a;
cout<< sizeof(a);
output:
24
0
4
map声明的时候就分配了一段空间
python
dic = dict()
print(dic[0])
output
Traceback (most recent call last):
File "/Users/zhangpengfei/Documents/python_datastructure/brick.py", line 23, in <module>
print(dic[0])
KeyError: 0
dic = dict()
print(dic)
output
{}
虽然访问不存在的键会报错但是赋值不存在的键值是可以的
dic = dict()
dic[0] = 1
print(dic[0])
output
1
考虑使用collection
import collections
dic = collections.defaultdict(int)
print(dic[100])
output
0
java中的map也得先判断键值到底存不存在才可以进行赋值。
例题:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)
class Solution {
public:
int FirstNotRepeatingChar(string str) {
map<char, int> mp;
for(int i = 0; i < str.size(); ++i)
mp[str[i]]++;
for(int i = 0; i < str.size(); ++i){
if(mp[str[i]]==1)
return i;
}
return -1;
}
};
import java.util.*;//TreeMap在util包里面
public class Solution {
public int FirstNotRepeatingChar(String str) {
Map<Character, Integer> mp = new HashMap<>();
for(int i = 0; i < str.length(); ++i){
mp.put(str.charAt(i), mp.containsKey(str.charAt(i)) ? mp.get(str.charAt(i))+1 : 1); // 双目运算
}
for(int i = 0; i < str.length(); ++i){
if(mp.get(str.charAt(i))==1){
return i;
}
}
return -1;
}
}
总结:c++相对于Java的字符串访问和map的使用都是比较方便的。