如何在C++中实现更高效的重新插入集合的效率

las*_*igh 6 c++ stl insert set

我需要修改已经插入到集合中的对象.这不是一件容易的事,因为从插入单个对象返回的对中的迭代器是一个常量迭代器,不允许修改.因此,我的计划是,如果插入失败,我可以将该对象复制到临时变量中,从集合中删除它,在本地修改它然后插入我修改后的版本.

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);            
Run Code Online (Sandbox Code Playgroud)

}

这有效,但我想让我的插入更有效率.我尝试制作另一个迭代器并将其设置为与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);            
Run Code Online (Sandbox Code Playgroud)

}

但是,这会导致seg故障.我希望有人可以告诉我为什么这个插入失败或建议另一种方法来修改已经插入到集合中的对象.

完整的源代码可以在github上查看.

las*_*igh 2

我希望回答我自己的问题不是不好的形式,但我希望它在这里,以防其他人遇到这个问题。我的学术机器人给出了为什么我的尝试 seg 失败的答案,但这里是使这个工作与集合一起工作的解决方案。虽然我确实很欣赏其他答案并计划学习地图,但这个问题是关于有效地重新插入到 set

void modifySet(set<Peptide>::iterator someIter, Peptide::Peptide newPep) {
    if( someIter == someSet.begin() ) {
        Peptide tempPep = (*someIter);
        someSet.erase(someIter);
        // Modify tempPep - this does not modify the key
        someSet.insert(tempPep);   
    }
    else {
        Peptide tempPep = (*someIter);
        anotherIter = someIter;
        --anotherIter;
        someSet.erase(someIter);
        // Modify tempPep - this does not modify the key
        someSet.insert(anotherIter, tempPep); 
     }
}
Run Code Online (Sandbox Code Playgroud)

在我的程序中,这一更改使我的运行时间减少了约 15%,从 32 秒减少到 27 秒。我的更大的数据集目前正在运行,我祈祷 15% 的改进能够实现。