作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要修改一个已经插入到集合中的对象。这不是微不足道的,因为从插入单个对象返回的对中的迭代器是 const 迭代器并且不允许修改。所以,我的计划是,如果插入失败,我可以将该对象复制到一个临时变量中,从集合中删除它,在本地修改它,然后插入我修改后的版本。
insertResult = mySet.insert(newPep);
if( insertResult.second == false )
modifySet(insertResult.first, newPep);
void modifySet(set<Peptide>::iterator someIter, Peptide::Peptide newPep) {
Peptide tempPep = (*someIter);
someSet.erase(someIter);
// Modify tempPep - this does not modify the key
someSet.insert(tempPep);
}
这行得通,但我想让我的插入更有效率。我尝试制作另一个迭代器并将其设置为等于 modifySet 中的 someIter。然后在删除 someIter 之后,我仍然会有一个指向集合中该位置的迭代器,我可以将其用作插入位置。
void modifySet(set<Peptide>::iterator someIter, Peptide::Peptide newPep) {
Peptide tempPep = (*someIter);
anotherIter = someIter;
someSet.erase(someIter);
// Modify tempPep - this does not modify the key
someSet.insert(anotherIter, tempPep);
}
但是,这会导致段错误。我希望有人能告诉我为什么这次插入失败或建议另一种方法来修改已经插入到集合中的对象。
完整的源代码可以在 github 查看。 .
最佳答案
我同意 Peter 的观点, map 可能是您正在做的事情的更好模型,特别是像 map<pep_key, Peptide::Peptide>
这样的模型。 ,会让你做类似的事情:
insertResult = myMap.insert(std::make_pair(newPep.keyField(), newPep));
if( insertResult.second == false )
insertResult.first->second = newPep;
要回答您的问题,插入段错误是因为删除会使迭代器无效,因此用它(或它的拷贝)插入类似于取消引用无效指针。我看到做你想做的唯一方法是使用 const_cast
insertResult = mySet.insert(newPep);
if( insertResult.second == false )
const_cast<Peptide::Peptide&>(*(insertResult.first)) = newPep;
const_cast 方法看起来适用于您正在做的事情,但通常不是一个好主意。
关于c++ - 如何在 C++ 中实现更好的重新插入到集合中的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088231/
我是一名优秀的程序员,十分优秀!