c++ - 如何在 C++ 中实现更好的重新插入到集合中的效率

标签 c++ stl insert set

我需要修改一个已经插入到集合中的对象。这不是微不足道的,因为从插入单个对象返回的对中的迭代器是 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/

相关文章:

string - Qt creator 调试字符串(显示内容)

MySQL 选择计数

java - 如何使用 Java Persistence API 创建简单的插入到 SQL Server

c++ - 两个语法错误 : Error C2143 syntax error: missing ';' before '*'

c++ - 纯虚类,只有1个派生类,还是vtable?

C++虚拟类基础题

vb.net - vb.net(在Visual Studio 2013中制造)和Access DB的几个问题

c++ - Lua C++ lib sethook : Gives error with hook function arg

c++ - Windows 与 Linux 内存分配/std::list 构造函数性能

C++ - std::list header 中 _List_node_base 的成员函数的实现在哪里