On Mon, Oct 24, 2016 at 6:35 AM, Ram <sourceopen@gmail.com> wrote:

I have a boost::multiindex container which has an index as follows :

boost::multi_index::hashed_non_unique<

            boost::multi_index::tag<IndexByNonUniqueId>,

            boost::multi_index::const_mem_fun<StoredObj, std::string,     &StoredObj::getNonUniqueIdString> 

        >

This ID comes in as ""(empty string) when I initially get the object. I add it to the multiindex at this point. But later in the course of the program the ID gets populated using its "setNonUniqueId" method. At this point of time inside "setNonUniqueId" I would like to update the index to the object(in the multiindex) as well(while the ID is being updated from "" to something concrete). How do I do this? How do I locate the specific object and update the index


You must notify the BMI of the change, or more exactly, you must do the change
via the index's modify() [1] method. Don't update the field first, since that changes the hash
behind the BMI's back, breaking its invariants. While working on this code, you may want
to set this define [3] in debug builds to catch such invariant-breaking mistakes.
Update the field via the functors you pass to the index's modify() method.
 
You do need an iterator to pass to modify(), and for that you typically use one of your unique indexes,
which you then project() [2] into the non-unique index you want to update. --DD

[1] http://www.boost.org/doc/libs/1_62_0/libs/multi_index/doc/reference/hash_indices.html#modifiers 
[2] http://www.boost.org/doc/libs/1_62_0/libs/multi_index/doc/reference/multi_index_container.html#projection
[3] http://www.boost.org/doc/libs/1_62_0/libs/multi_index/doc/tutorial/debug.html#invariant_check