【问题标题】:Am I using std::map's find function correctly? Want to access class data我是否正确使用 std::map 查找功能?想要访问类数据
【发布时间】:2014-05-15 14:15:51
【问题描述】:

所以下面的代码可以编译,但我不确定它是否在做我想要它做的事情...... (VS2010供参考)

// Declarations

typedef std::map<unsigned int, QGF6::GameObject*> localMap;
localMap lMap;

// Code in a function that I might be using with the wrong logic:

lMap.find(p.id)->second->getPhysics()->setLinearVelocity(linVel);

预期逻辑:

map 中找到等于p.id(另一个无符号整数)的unsigned int 值,然后找到map 的该成员,访问它的第二种数据类型(GameObject*)并执行操作。


所以问题是这是否应该“按预期”工作?它可以编译,但由于我遇到速度错误,我认为这可能是对 std::map 类的误解。

【问题讨论】:

  • UB 如果元素 (p.id) 未找到。

标签: c++ stl c++98


【解决方案1】:

只有当搜索的项目实际存在于map 中时,这才有效。否则使用它会导致未定义的行为。你应该使用类似下面的东西

 std::map<unsigned int, QGF6::GameObject*>::iterator itr = lMap.find(p.id);
 if(itr!= lMap.end()){ //found
  //use it
 }

或者,

 QGF6::GameObject* obj = lMap[p.id];
 if( obj!=nulptr){
  //use it
 }

【讨论】:

  • 注意:它不会返回null,而是lMap.end()。两者都是未定义的行为,但后者往往不会像确定性那样崩溃。
  • lMap[p.id] 会返回 NULL
  • @crashmstr,实际上我用这种方式长时间使用Qt map,这就是错误的原因。
  • 太棒了,说得通 :) 因为它是一个从服务器下载地图数据的客户端,它应该总是正确的,但这对意外行为检查有很大帮助。
  • 注意lMap[p.id]修改lMap(通过插入默认元素)当没有找到与map::find相反的元素时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多