を書きました。
【例】
#include <string> #include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/member.hpp> struct id_name { int id; std::string name; id_name(int id, const std::string& name) : id(id), name(name) {} }; using namespace boost::multi_index; typedef multi_index_container< id_name, indexed_by< ordered_unique<member<id_name, int, &id_name::id> > > > container; int main() { container c; c.insert(id_name(3, "a")); c.insert(id_name(1, "b")); c.insert(id_name(4, "c")); assert(c.at(1).name == "b"); try { c.at(99); } catch (std::out_of_range&) { } }
【提案】
std::map/boost::unordered_mapと異なり、ordered_index/hashed_indexにはoperator()とat()メンバ関数が用意されていないため、要素を参照するためにfind()メンバ関数を使用するしかなく、これは不便であった。
そこで、ordered_index/hashed_indexへat()メンバ関数を追加するパッチを作成した。
operator()については、random_accessとの競合を防ぐために作成していない。
MultiIndexの設計に従い、at()メンバ関数はconst版のみを作成し、破壊的な変更を許可する非const版は用意していない。
また、例外ではなくboost::optionalでエラー処理を行うoptional_at()メンバ関数も必要と考えるが、MultiIndexの設計上、Boost.Optionalでのエラーポリシーが規定されていないため、この提案には含めない。
TODO : あとで英文に訳す。
【Ordered indices/Hashed indices】
template<implementation defined: dependent on types Value, Allocator, TagList, KeyFromValue, Compare> class name is implementation defined { public: ... // set operations: template<typename CompatibleKey> typename std::iterator_traits<iterator>::value_type const& at(const CompatibleKey& x)const; ... };
【説明】
Requires: CompatibleKey is compatible key of key_compare
Effects: Returns a reference to an element whose key is equivalent to x.
Throws: An exception object of type out_of_range if no such element is present.
Complexity: O(log(n)).
【ソース】
boost/multi_index/hashed_index.hpp
boost/multi_index/ordered_index.hpp
【パッチ】
【テスト】