英文:
Define map with keys with arbitrary dimension
问题
以下代码用于为每对float64创建一个计数器。
由于映射的键不能是切片,我必须使用数组作为键,这迫使我使用常量定义一个维度。
counter := make(map[[2]float64]int)
for _, comb := range combinations { // combinations是一个[n][2]float64
for _, row := range data {
counter[[...]float64{row[comb[0]], row[comb1]}]++
}
}
话虽如此,有没有办法使这个映射依赖于键的长度(取决于combinations的维度)?
我尝试使用结构体作为键,但据我记得(我可能记错了),它速度有点慢... 对于我的目的(将其应用于所有组合~n!),这不是理想的解决方案。
现在我只考虑大小为2和3的组合,并且我不得不将其拆分为两个单独的函数,这使得我的代码非常冗长且难以维护。
你能找到简化这个问题的方法,以便我可以将其扩展到更多维度吗?
感谢任何建议。
英文:
The following code serves to create a counter for each pair of float64.
Because the keys of a map cannot be a slice, I have to use arrays as keys, which forces me to to define a dimension with a constant.
counter := make( map[ [2]float64 ] int )
for _, comb := range combinations{ //combinations is a [n][2]float64
for _, row := range data{
counter[ [...]float64{ row[comb[0]] , row[comb[1]] } ]++
}
}
Having said that, is there a way to make this map dependent on the length of the keys (dependent on the dimensions of combinations?
I tried using a struct as key, but as far as I remember (I might be wrong), it was a bit slower... For my purposes (to apply this for all combinations ~n!) this is not the ideal solution.
Right now I'm only considering combinations of size 2 and 3, and I had to split this in two separate functions, which makes my code very verbose and harder to maintain.
Can you find a way to simplify this, so I can scale it to more dimensions?
Thanks for any input
答案1
得分: 1
为什么不使用切片的指针作为键?
你可以使用make创建一个容量足够大的切片,只要不超过其容量,指针就会保持不变。
在这里查看示例:https://play.golang.org/p/333tRMpBLv,它展示了我的建议。注意,只有在长度超过容量时,append才会创建一个新的切片,否则切片的指针不会改变。
英文:
Why not use the pointer to a slice as key?
You could create a slice with make with a big enough capacity, while you do not surpass it's capacity, the pointer will remain the same.
Take a look here https://play.golang.org/p/333tRMpBLv , it exemplifies my suggestion. see that while len < cap the pointer of the slice is not changed, append only creates a new slice when len exceeds cap.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论