Мне нужно изменить объект, который уже был вставлен в набор. Это не тривиально, потому что итератор в паре, возвращенной после вставки одного объекта, является константным итератором и не допускает изменений. Итак, мой план состоял в том, чтобы в случае неудачной вставки я мог скопировать этот объект во временную переменную, удалить его из набора, изменить его локально, а затем вставить свою измененную версию.
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);
}
Это работает, но я хочу сделать мою вставку более эффективной. Я попытался сделать другой итератор и установить его равным someIter в modifySet. Затем, после удаления 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 .