У меня есть multi_index с несколькими индексами hashed_unique indixes (A, B, C).
Не все вставки в хеш содержат информацию для всех индексов. Некоторые из индексов могут быть пустыми. А некоторые могут содержать все записи.
Я определил их hashed_unique, потому что если он не пустой, он уникален.
Я мог бы определить его как hashed_non_unique и поместить каждый ключ в оболочку, которая сообщает, является ли ключ пустым, как предложено в Повышение Multi_Index Вопрос
Но тогда мне нужно будет искать каждый ключ, прежде чем пытаться вставить / изменить / заменить, чтобы избежать случая использования не-уникальных ключей, что не является хорошим решением для повышения производительности.
Есть ли лучшее решение?
Если я определил все индексы как hashed_unique, он не допустит вставку более одного пустого значения в индекс.
Например:
(11,6,8)
(10,3,empty)
(empty,4,empty)
(empty,empty,1)
Я использую Boost 1.49, и мульти индекс находится в общей памяти.
Вы можете использовать следующую обертку:
#include <boost/variant.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/functional/hash.hpp>
template<typename T>
class maybe
{
public:
maybe():impl(boost::make_shared<int>(0)){}
maybe(const T& t):impl(t){}
bool empty()const{return impl.which()==0;}
T& get(){return boost::get<T>(impl);}
const T& get()const{return boost::get<T>(impl);}
friend bool operator==(const maybe& x,const maybe& y){return x.impl==y.impl;}
friend std::size_t hash_value(const maybe& x){return boost::hash<impl_type>()(x.impl);}
private:
typedef boost::variant<boost::shared_ptr<void>,T> impl_type;
impl_type impl;
};
...
maybe<int> x=5;
maybe<int> y; // empty
maybe<int> z; // empty
Хорошая вещь о maybe
является то, что пустые значения разные (то есть, !(y==z)
в примере), так что вы можете сохранить свои индексы Boost.MultiIndex уникальными.
Других решений пока нет …