我应该通过指针操作C++地图的值还是更新记录?

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++映射并使该指针不再有效?该程序是多线程的,因此可以将实体添加到表中,而其他实体则被修改.

我很感激帮助!

Ste*_*end 6

你应该考虑引用(&)而不是指针(*).在它的情况下,你的getEntityRecord返回一个map元素值的副本,因此不会通过map看到对返回值的更改.如果更改此函数以返回引用,它将执行您想要的操作.

classEntityRecord& getEntityRecord(structureEntityID entityID)
Run Code Online (Sandbox Code Playgroud)

map::find返回一个iterator,其中的second字段包含对map成员值的引用.如果没有其他人删除该条目,您可以使用此引用安全地修改map成员值而不必担心map被修改.

来自SGI STL地图文档

Map具有重要的属性,即将新元素插入到映射中不会使指向现有元素的迭代器无效.从地图中删除元素也不会使任何迭代器无效,当然,除了实际指向正在被删除的元素的迭代器之外.