rank
値と連続して格納できれば、そのような長さに移動する必要がないため、実際にはルートからの距離を意味していると思います。
この場合、比較述語が使用される回数からランクを推定できるため、「外部」で実行できると思います...
namespace detail
{
template <class Comparator>
class CounterComparator: Comparator
{
public:
CounterComparator(size_t& counter):
Comparator(), mCounter(&counter) {}
CounterComparator(Comparator comp, size_t& counter):
Comparator(comp), mCounter(&counter) {}
template <class T, class U>
bool operator()(T& lhs, U& rhs) const
{
++(*mCounter);
return this->Comparator::operator()(lhs,rhs);
}
private:
size_t* mCounter;
};
} // namespace detail
template <
class Key,
class Value,
class Cmp = std::less<Key>,
class Allocator = std::allocator< std::pair<const Key,Value> >
>
class SuperMap
{
typedef detail::CounterComparator<Cmp> Comparator;
public:
SuperMap(): mCounter(0), mData(Comparator(mCounter)) {}
Value& operator[](const Key& key) { return mData[key]; }
size_t rank(const Key& key) const
{
mCounter = 0; mData.find(key); return mCounter;
}
private:
typedef std::map<Key,Value, Comparator, Allocator> data_type;
mutable size_t mCounter;
data_type mData;
}; // class SuperMap
int main(int argc, char* argv[])
{
SuperMap<int,int> superMap;
superMap[1] = 42;
std::cout << superMap.rank(1) << std::endl;
}
// outputs
// 2
テストの数をカウントしますstd::map
が、正しいキーを取得するとすぐにテストを停止するため...大丈夫なはずです:)おそらく、代わりにランクを取得するためにそこに推測するオフセット(1または2)があります。
あなたがより良い定義を与えたなら、rank
私はもう少し働くかもしれませんが、間違った方向に多くの時間を費やしたくありません.