我有一个存储在std::map
中的设置。例如,有WorldTime
个键值,用于更新每个主循环迭代。我不想在我需要时从地图上读取它(它也在每帧处理),我认为它根本不快。那么,我可以获得指向地图值的指针并访问它吗?代码是:
std::map<std::string, int> mSettings;
// Somewhere in cycle:
mSettings["WorldTime"] += 10; // ms
// Somewhere in another place, also called in cycle
DrawText(mSettings["WorldTime"]); // Is slow to call each frame
所以这个想法是这样的:
int *time = &mSettings["WorldTime"];
// In cycle:
DrawText(&time);
有多错?我应该这样做吗?
答案 0 :(得分:5)
最好使用参考:
int & time = mSettings["WorldTime"];
如果密钥尚不存在,[]
- 访问权限将创建元素(并对映射值进行值初始化,即0
的{{1}}。或者(如果密钥已经存在):
int
顺便说一句:如果你有成千上万的字符串键或者按字符串键使用查找很多,你可能会发现int & time = *mSettings.find("WorldTime");
提供了更好的结果(但总是在决定之前进行配置)。这两张地图的界面几乎相同。
答案 1 :(得分:3)
根据this answer on StackOverflow,存储指向地图元素的指针是完全可以的,因为在删除元素之前它不会失效(参见注释3)。
答案 2 :(得分:1)
如果您对性能非常担心,那么为什么要使用字符串键呢?如果你有一个枚举怎么办?像这样:
enum Settings
{
WorldTime,
...
};
然后你的地图将使用整数而不是字符串。它必须在键之间进行比较,因为我相信std :: map是作为平衡树实现的。 int之间的比较比字符串之间的比较要快得多。
此外,如果你使用枚举作为键,你可以只使用数组,因为枚举IS本质上是从某种符号(即WorldTime)到整数的映射,从零开始。那么这样做:
enum Settings
{
WorldTime,
...
NumSettings
};
然后将mSettings声明为数组:
int mSettings[NumSettings];
与std :: map相比,查找时间更快。这样参考:
DrawText(mSettings[WorldTime]);
因为你基本上只是访问一个数组中的值而不是访问一个映射,所以这会快得多,你不必担心你在第一次尝试做的指针/引用hack的地方。