5

boost :: multi_index_containerを使用して、要素のコレクションへのランダムアクセスとハッシュベースのアクセスを提供しています。ハッシュベースのインデックスを変更せずに、要素のランダムアクセスインデックスを変更したかったのです。

これがコードの一部です:

# include <string>
# include <boost/multi_index_container.hpp>
# include <boost/multi_index/random_access_index.hpp>
# include <boost/multi_index/hashed_index.hpp>
# include <boost/multi_index/member.hpp>

using namespace std ;
using namespace boost ;
using namespace boost::multi_index ;

// class representing my elements
class Element
{
    public :
      Element(const string & new_key) : key(new_key) {}
      string key ;      // the hash-based index in the multi_index_container
      // ... many stuff skipped
    private :
      // ... many stuff skipped
} ;

typedef multi_index_container<
            Element,
            indexed_by<
                random_access< >,
                hashed_unique<
                    member<Element, string, &Element::key>
                >
            >    
        > ElementContainer ;

typedef ElementContainer::nth_index<0>::type::iterator ElementRandomIter ;
typedef ElementContainer::nth_index<1>::type::iterator ElementHashedIter ;

int main(int, char*[])
{
    ElementContainer ec ;

    // insert some elements
    ec.push_back(Element("Alice")) ;       // random-access index = 0
    ec.push_back(Element("Bob")) ;         // random-access index = 1
    ec.push_back(Element("Carl")) ;        // random-access index = 2
    ec.push_back(Element("Denis")) ;       // random-access index = 3

    // Here I want to move "Denis" to position 1
    // The (bad looking) solution I found involves removing and inserting the element
    ElementRandomIter it = ec.get<0>().begin() + 3 ;
    Element e = *(it) ;                    // store a copy
    ec.get<0>().erase(it) ;                // remove the element
    it = ec.get<0>().begin() + 1 ;
    ec.get<0>().insert(it, e) ;            // insert the copy

    // Elements are now in the following order
    // random-access index 0 : Alice
    // random-access index 1 : Denis
    // random-access index 2 : Bob
    // random-access index 3 : Carl

    return 0 ;
}

multi_index_containerこの例でランダムアクセスイテレータのみを使用して要素を操作したとしても、オブジェクトのコピーに加えて、ハッシュは舞台裏で少なくとも2回発生することを知っています。これは、コストがかかる可能性があります。

boost::multi_indexコピーを保持しながらの高価な削除と挿入の醜さを必要とせずに、内部の要素のランダムアクセスインデックスを変更する方法はありますか?

multi_index_containerドキュメントを検索しましたが、何かが足りなかった可能性があります。アドバイスありがとうございます!

注:英語の間違いの可能性について申し訳ありません:)

4

2 に答える 2

5

使用relocate

http://www.boost.org/libs/multi_index/doc/reference/rnd_indices.html#rearrange_operations

于 2011-07-06T05:51:58.090 に答える
0

使ってmodify_keyみませんか?私の場合、インデックスはランダムアクセスではありませんでしたが、私は以前にこのようなことをしましたが、それはあなたにとってもうまくいくかもしれないと思います。

于 2011-07-06T00:53:16.320 に答える