Boost logo

Boost Users :

Subject: [Boost-users] [multi_index] modify_key with an iterator to composite_key
From: Christian Holmquist (c.holmquist_at_[hidden])
Date: 2010-01-27 07:10:53


Hi,

>From what I've found on the net (here:
http://groups.google.com/group/boost-list/browse_thread/thread/687ce9662a4c1c68?pli=1),
about this problem, Joaquin explains that modify_key on a composite_key
isn't supported.

Relevant part from that thread is:

When you use modify_key, you modifier functor is passed
> *the key* rather than the whole element as is the case
> with modify. In this particular situation, the key is
> a composite key; so the key object (defined privately
> by composite_key) is some entity that somehow references
> entry::m_x and entry::m_y. This object is not exposed
> to the public and you're not supposed to try to use
> it or modify it, hence the problems you're seeing.
> In short, when using composite_key you cannot use
> modify_key.

The alternative must be to use modify() instead, so I'd like to know how to
get the best performance in the following scenario:

My index is specified as.

    namespace bmi = boost::multi_index;

    struct Index : boost::mpl::vector2
    <
        bmi::hashed_unique<bmi::member<Entry, std::string, &Entry::m_Name>
>,
        bmi::ordered_non_unique
        <
            bmi::composite_key
            <
                Entry,
                bmi::member<Entry, int, &Entry::m_State>,
                bmi::member<Entry, int, &Entry::m_Timestamp>
>
>
>
    {};

I frequently updated Entry::m_State and Entry::m_Timestamp, but never
Entry::m_Name during the lifetime of an entry, thus I expected modify_key to
be faster since the expensive hash index don't need to be updated.
Since I cannot tell modify() which parts of the Entry I'm about to update, I
don't see how I can avoid the rehashing.
Maybe there's a better way to configure the index? I'm using Entry::m_State
for an equal_range() search, while Entry::m_Timestamp is only for ordering
(I bump the timestamp everytime I change m_State).

I am using boost.1.35 btw

Any response much appreciated,

Christian



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net