c++ - Is it possible to erase modified element from std::set? -


i need sorted collection elements can modified. safe erase element after modification? sorting key can modified.

auto it=s.find(e) modify(e) s.erase(it) 

i have made tests in vs2010, , worked. think erase(it) not need search element, there no need call compare on element being erased.

it hard modify whole program remove elements before modification, why looking alternative solution.

edit: adding working sample make more clear

#include <iostream> #include <algorithm> #include <set>  template <typename t> struct ptrcmp {     bool operator()(const t* x, const t* y) const     {         return *x<*y;     } };  int main() {     std::set<int*, ptrcmp<int>> aset;     int t[]={1,2,3,4};     for(int i=0;i<4;++i)     aset.insert(&t[i]);      auto it=aset.find(&t[2]);     t[2]=5;     aset.erase(it);      for(auto it=aset.begin(); it!=aset.end(); ++it)         std::cout<<**it<<std::endl; } 

in example t[2]=5; modifies value used in comparator used e.g. rebalancing tree data structure behind set container. therefore such modification not safe because balanced-tree algorithm may fail in case factual key @ node changed, therefore not match expectation tree node. erase operation trigger tree rebalancing, , how undefined behavior. modification of value used in comparator factually break balancedness of tree behind set container.


Comments

Popular posts from this blog

Rendering JButton to get the JCheckBox behavior in a JTable by using images does not update my table -

javascript - Using jquery append to add option values into a select element not working -

Android soft keyboard reverts to default keyboard on orientation change -