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
ドキュメントを検索しましたが、何かが足りなかった可能性があります。アドバイスありがとうございます!
注:英語の間違いの可能性について申し訳ありません:)