golang map和C++ map有很多区别, 比如:
1. golang map是hash map, 而C++ map是red-black-tree map
2. golang map是无序的, 且每次遍历不稳定一致, 而C++ map是有序的, 且每次遍历稳定一致
现在看C++程序:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> m;
m["hello"] = 1;
cout << m.size() << endl; // 1
if (m["world"] == 1 ) // m["world"] is assigned to 0 automatically and m is changed
{
}
cout << m.size() << endl; // 2
return 0;
}
再来看golang程序:
package main
import (
"fmt"
)
func main(){
m := map[string]int {"hello": 1}
fmt.Println(len(m)) // 1
if m["world"] == 1 { // m["world"] is 0 but m is not changed actually
}
fmt.Println(len(m), m) // so len(m) is still 1
}
事实上, 上述这两种用map的方式都不正确, 无论是C++还是go, 在以m[xxx]这种方式取值之前, 一定要确保这个值是存在的。C++的做法是:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> m;
m["hello"] = 1;
cout << m.size() << endl; // 1
for (map<string, int>::iterator it = m.begin(); it != m.end(); ++it)
{
if (it->first == "world" && it->second == 1 ) // 这里it->second比m[xxx]好
{
}
}
cout << m.size() << endl; // 1
return 0;
}
golang的做法更是爽快:
package main
import (
"fmt"
)
func main(){
m := map[string]int {"hello": 1}
fmt.Println(len(m)) // 1
if v, ok := m["world"]; ok && v == 1 {
}
fmt.Println(len(m), m) // 1 map[hello:1]
}
简单。
最后, 我们来看一个问题, 在C++和golang, 怎么判断两个map是否相等呢? 思考一下, 很easy.
不多说。