Cli*_*int 2 c++ pointers stl map
我正在使用C++ std :: map来保存大量实体:
using std::map;
map {structureEntityID, classEntityRecord} tableEntityRecords; //(replace {}s with arrows)
Run Code Online (Sandbox Code Playgroud)
我会经常修改表格中的实体(每秒多次).通过指针修改这些记录是更好还是更好地制作本地副本,修改它,然后更新表?
例如...
通过指针:
classEntityRecord* getEntityRecord(structureEntityID entityID)
{
map {structureEntityID, classEntityRecord}::iterator iteratorEntityRecord;
iteratorEntityRecord = tableEntityRecords.find(entityID);
return &iteratorEntityRecord->second;
}
classEntityRecord *entityRecord;
entityRecord = getEntityRecord(entityID);
entityRecord->x = 15;
Run Code Online (Sandbox Code Playgroud)
通过复制/修改/更新:
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;
Run Code Online (Sandbox Code Playgroud)
我认为最好使用指针,但这是我第一次使用C++地图,所以我不完全了解它们是如何工作的.
我最担心的是,如果我指向表中的一个值,是否有可能重新排序C++映射并使该指针不再有效?该程序是多线程的,因此可以将实体添加到表中,而其他实体则被修改.
我很感激帮助!
你应该考虑引用(&)而不是指针(*).在它的情况下,你的getEntityRecord返回一个map元素值的副本,因此不会通过map看到对返回值的更改.如果更改此函数以返回引用,它将执行您想要的操作.
classEntityRecord& getEntityRecord(structureEntityID entityID)
Run Code Online (Sandbox Code Playgroud)
map::find返回一个iterator,其中的second字段包含对map成员值的引用.如果没有其他人删除该条目,您可以使用此引用安全地修改map成员值而不必担心map被修改.
Map具有重要的属性,即将新元素插入到映射中不会使指向现有元素的迭代器无效.从地图中删除元素也不会使任何迭代器无效,当然,除了实际指向正在被删除的元素的迭代器之外.