编程中的常识是,由于缓存命中,内存局部性会大大提高性能.我最近发现了boost::flat_map哪个是基于矢量的地图实现.它似乎并不像你的典型那样受欢迎map/ unordered_map因此我无法找到任何性能比较.它是如何比较的,它的最佳用例是什么?
谢谢!
我想创建一个大的HashMap,但put()性能不够好.有任何想法吗?
其他数据结构建议是受欢迎的,但我需要Java Map的查找功能:
map.get(key)
在我的情况下,我想创建一个包含2600万条目的地图.使用标准Java HashMap,在2-3百万次插入后,放置速率变得无法忍受.
此外,是否有人知道为密钥使用不同的哈希代码分发是否有帮助?
我的哈希码方法:
byte[] a = new byte[2];
byte[] b = new byte[3];
...
public int hashCode() {
int hash = 503;
hash = hash * 5381 + (a[0] + a[1]);
hash = hash * 5381 + (b[0] + b[1] + b[2]);
return hash;
}
Run Code Online (Sandbox Code Playgroud)
我使用add的associative属性来确保相等的对象具有相同的哈希码.数组是字节,其值在0到51之间.值只在一个数组中使用一次.如果a数组包含相同的值(按任意顺序),则对象相等,而b数组则相同.所以a = {0,1} b = {45,12,33}和a = {1,0} b = {33,45,12}是相等的.
编辑,一些说明:
一些人批评使用哈希映射或其他数据结构来存储2600万个条目.我不明白为什么这看起来很奇怪.它看起来像是一个经典的数据结构和算法问题.我有2600万个项目,我希望能够快速将它们插入并从数据结构中查找它们:给我数据结构和算法.
将默认Java HashMap的初始容量设置为2600万会降低性能.
有些人建议使用数据库,在某些其他情况下这绝对是明智的选择.但我真的在问一个数据结构和算法的问题,一个完整的数据库会比一个好的数据结构解决方案过度而且速度慢得多(毕竟数据库只是软件,但会有通信和可能的磁盘开销).
我正在研究类似文明的游戏,我正在寻找一种用于生成类似地球的世界地图的好算法.我已经尝试了一些替代方案,但尚未找到真正的赢家.
一种选择是使用Perlin噪声生成高度图,并在一定水平上添加水,以便世界上大约30%的土地是土地.虽然Perlin噪声(或类似的基于分形的技术)经常用于地形并且相当逼真,但它并没有提供太多控制结果的数量,大小和位置,我想从游戏角度来看.

第二种选择是从随机定位的单瓦种子开始(我正在处理瓷砖网格),确定大陆的所需大小,每个回合添加一个水平或垂直邻近现有大陆的图块,直到你达到了所需的大小.重复其他大陆.这种技术是文明4中使用的算法的一部分.问题在于,在放置前几个大陆之后,可以选择被其他大陆包围的起始位置,因此不适合新的大陆.此外,它有一种太靠近的地方产生大陆的趋势,导致看起来更像河流而不是大陆.

有没有人碰巧知道一个好的算法,用于在基于网格的地图上生成逼真的大陆,同时保持对其数量和相对大小的控制?
我只需要字典或关联数组string=> int.
这种情况有类型映射C++.
但我只需要一个map forall实例( - > static),这个地图不能改变( - > const);
我用boost库找到了这种方式
std::map<int, char> example =
boost::assign::map_list_of(1, 'a') (2, 'b') (3, 'c');
Run Code Online (Sandbox Code Playgroud)
没有这个lib还有其他解决方案吗?我尝试过类似的东西,但是地图初始化总是存在一些问题.
class myClass{
private:
static map<int,int> create_map()
{
map<int,int> m;
m[1] = 2;
m[3] = 4;
m[5] = 6;
return m;
}
static map<int,int> myMap = create_map();
};
Run Code Online (Sandbox Code Playgroud) 是否存在任何类似的List/Sequence map并提供元素的索引?
我的数据是以"密钥"格式组织的,而不是"键值".它就像一个HashMap,但我需要在两个方向上进行O(1)查找.这种类型的数据结构是否有名称,Java标准库中是否包含这样的名称?(或者可能是Apache Commons?)
我可以编写自己的类,基本上使用两个镜像映射,但我宁愿不重新发明轮子(如果这已经存在但我只是没有找到合适的术语).
上下文
我需要返回对我用于数据缓存的地图的引用,并且我想确保没有人可以修改它们的引用.
题
我在网上看过很多对UnmodifiableMap和ImmutableMap的引用,但我没有看到任何比较/对比它们的东西.我认为Google/Guava有一个很好的理由创建了他们自己的版本 - 有人可以告诉我它是什么吗?
我试图使用operator []访问const C++映射中的元素,但此方法失败.我也尝试用"at()"来做同样的事情.这次工作.但是,我找不到任何关于使用"at()"来访问const C++映射中的元素的引用."at()"是C++地图中新添加的函数吗?我在哪里可以找到更多关于此的信息?非常感谢你!
一个例子如下:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, char> A;
A[1] = 'b';
A[3] = 'c';
const map<int, char> B = A;
cout << B.at(3) << endl; // it works
cout << B[3] << endl; // it does not work
}
Run Code Online (Sandbox Code Playgroud)
对于使用"B [3]",它在编译期间返回以下错误:
t01.cpp:14:错误:将'const std :: map,std :: allocator >>'传递为'_Tp&std :: map <_Key,_Tp,_Compare,_Alloc> :: operator []的'this'参数( const _Key&)[with _Key = int,_Tp = char,_Compare = std :: less,_Alloc = std :: allocator>]'丢弃限定符
使用的编译器是g …
我的websocket服务器将接收和解组JSON数据.此数据将始终包含在具有键/值对的对象中.密钥字符串将充当值标识符,告诉Go服务器它是什么类型的值.通过知道什么类型的值,我可以继续JSON将值解组为正确的结构类型.
每个json对象可能包含多个键/值对.
示例JSON:
{
"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},
"say":"Hello"
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法使用"encoding/json"包来做到这一点?
package main
import (
"encoding/json"
"fmt"
)
// the struct for the value of a "sendMsg"-command
type sendMsg struct {
user string
msg string
}
// The type for the value of a "say"-command
type say string
func main(){
data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`)
// This won't work because json.MapObject([]byte) doesn't exist
objmap, err := json.MapObject(data)
// This is what I wish the objmap …Run Code Online (Sandbox Code Playgroud) 我正在考虑一种将带有重复键的元组列表转换[("a","b"),("c","d"),("a","f")]为映射的好方法("a" -> ["b", "f"], "c" -> ["d"]).通常(在python中),我会在列表上创建一个空映射和for循环,并检查重复键.但我在这里寻找更多scala-ish和聪明的解决方案.
顺便说一句,我在这里使用的实际键值类型是(Int, Node),我想变成一张地图(Int -> NodeSeq)