
Dan Larkin wrote:
Andrew Sutton wrote:
Maybe this approach allows too much freedom. I suppose you could also offer a method:
void update(iterator pos, const T& x); // *pos = x; update(pos);
That would prevent modifying operations in between updates.
This runs into the reference copying issue again. This assumes that T has a well-behaved and efficient copy-constructor, and does a full replacement of x rather than allowing for a partial update. I'm not convinced that the extra safety offers enough of a benefit over allowing the user to update it on their own:
*x = newValue; update(x);
Or, perhaps some more complex structure that would drive my point home a bit more effectively:
x->field[999] = newValue; update(x);
As long as the library is explicit about the fact that updating data will temporarily void the heap property until an update() call is made on the data in question, it should work much better this way.
Boost.MultiIndex uses the following interface "template<typename Modifier> bool modify(iterator position,Modifier mod); Requires: Modifier is a model of Unary Function accepting arguments of type value_type&. position is a valid dereferenceable iterator of the index..." http://www.boost.org/libs/multi_index/doc/reference/ord_indices.html#modifie... In Christ, Steven Watanabe