地图值的地址

时间:2011-11-22 21:51:58

标签: c++ pointers map

我有一个存储在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);

有多错?我应该这样做吗?

3 个答案:

答案 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的地方。