【发布时间】:2011-04-20 21:12:20
【问题描述】:
我正在使用 C++ std::map 来保存大量实体:
using std::map;
map {structureEntityID, classEntityRecord} tableEntityRecords; //(replace {}s with arrows)
我会经常修改表中的实体(每秒多次)。是通过指针修改这些记录更好,还是制作本地副本,修改它,然后更新表更好?
例如...
通过指针:
classEntityRecord* getEntityRecord(structureEntityID entityID)
{
map {structureEntityID, classEntityRecord}::iterator iteratorEntityRecord;
iteratorEntityRecord = tableEntityRecords.find(entityID);
return &iteratorEntityRecord->second;
}
classEntityRecord *entityRecord;
entityRecord = getEntityRecord(entityID);
entityRecord->x = 15;
通过复制/修改/更新:
classEntityRecord getEntityRecord(structureEntityID entityID)
{
map {structureEntityID, classEntityRecord}::iterator iteratorEntityRecord;
iteratorEntityRecord = tableEntityRecords.find(entityID);
return iteratorEntityRecord->second;
}
classEntityRecord entityRecord;
entityRecord = getEntityRecord(entityID);
entityRecord.x = 15;
tableEntityRecords[entityID] = entityRecord;
我认为使用指针会更好,但这是我第一次使用 C++ 映射,所以我不完全了解它们是如何工作的。
我最担心的是,如果我将指针指向表中的某个值,C++ 映射是否可能被重新排序并且该指针不再有效?该程序是多线程的,因此可以在修改其他实体的同时将实体添加到表中。
感谢您的帮助!
【问题讨论】:
-
当查询到的实体没有找到时,
find()返回map<..,..>::endl()。你也应该处理这种情况。 -
同意,我有一个附加功能,可以在检索记录之前检查记录是否存在(未显示)。