如何在C ++中编写可以执行类似地图迭代器的Go代码?
typedef std::map<std::string, MyStruct> MyMap;
MyMap::iterator it = myMap.find("key");
if(it!=myMap.end()) {
it->v1 = something;
it->v2 = something;
}
答案 0 :(得分:8)
在go中,使用range子句迭代地图非常容易。
myMap := map[string]int {"one":1, "two":2}
for key, value := range myMap {
// Do something.
fmt.Println(key, value)
}
可以打印
one 1
two 2
请注意,您在地图上以未定义的顺序进行迭代,因为它由哈希表而不是树支持。
go language spec描述了范围子句返回的内容,您可以看到effective go页面以获取更多示例。
答案 1 :(得分:2)
如果您只想在地图中查找密钥,请使用以下内容:
package main
import (
"fmt"
)
type Point struct {
x, y int
}
func main() {
points := make(map[string]*Point)
p := &Point{1, 1}
points["one"] = p
if p1, found := points["one"]; found {
p1.x = 100
}
fmt.Println(p)
}
答案 2 :(得分:0)
例如,
package main
import "fmt"
type MyStruct struct {
v1 string
v2 int
}
type MyMap map[string]MyStruct
func main() {
m := MyMap{
"unum": MyStruct{"I", 1},
"duo": MyStruct{"II", 2},
}
fmt.Println("before:")
for k, v := range m {
fmt.Println(k, v)
}
var k string
k = "unum"
if v, ok := m[k]; ok {
v.v1 = "one"
v.v2 = 1
m[k] = v
}
k = "tria"
if v, ok := m[k]; ok {
v.v1 = "III"
v.v2 = 3
m[k] = v
}
fmt.Println("after:")
for k, v := range m {
fmt.Println(k, v)
}
}
输出:
before:
unum {I 1}
duo {II 2}
after:
unum {one 1}
duo {II 2}