如何編寫可以在C++中執行類似迭代器的Go代碼?Go是否有迭代器數據類型?
typedef std::map<std::string, MyStruct> MyMap;
MyMap::iterator it = myMap.find("key");
if(it!=myMap.end()) {
it->v1 = something;
it->v2 = something;
}
如何編寫可以在C++中執行類似迭代器的Go代碼?Go是否有迭代器數據類型?
typedef std::map<std::string, MyStruct> MyMap;
MyMap::iterator it = myMap.find("key");
if(it!=myMap.end()) {
it->v1 = something;
it->v2 = something;
}
例如,
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}
我知道這些代碼可以工作。但我認爲它比C++慢。因爲它有兩次搜索算法。 golang有像C++一樣的「refrence datatype」或「iterator datatype」嗎? – jinchao
在去,這是很容易迭代使用範圍子句的地圖。
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頁面以獲取更多示例。
謝謝你的回答! – jinchao
如果它回答你的問題,請接受它:)(如果沒有,請澄清,我會盡力幫助!) –
如果你只是試圖找到在地圖中的鍵,然後使用以下命令:
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)
}
你們是不是要重複的進行中的值寫訪問的地圖嗎? –
Go中沒有迭代器數據類型,您不應該嘗試*在Go *中編寫C++,而應該考慮您想要執行的操作並將Go的特性應用於當前的任務。這就是爲什麼lazy1的答案可能是正確的,但是你想完成的並不是完全明顯的。 – macbirdie