boost库,Multi_Index的组合索引使用字符串数组

魔界卧龙 发布于 2015/09/06 16:04
阅读 506
收藏 0

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

  ///@brief 声明字符比较
  struct CharCompareLess
    {
      static inline int compare(const char* left, const char* right)
        {
          return strcmp(left, right);
        }
          inline bool operator()(const char* left, const char* right) const
        {
          return compare(left, right)<0;
        }
    };
  ///@brief 声明字符HASH
  struct CharHasher
    {
      std::size_t operator()(const char *str)const
        {
          std::size_t seed = 0;
          for (; *str; ++str)boost::hash_combine(seed, *str);
               return seed;
        }
    };
  ///@brief 声明字符相等
  struct CharEqualTo
    {
        bool operator()(const char *str1, const char *str2)const
        {
          return std::strcmp(str1, str2) == 0;
        }
    };

///@brief 声明t_client加载数据库数据的结构
 struct t_client_db{
 otext* LCcode;
 otext* ClientID;
 other info

 };
///@brief 声明t_client判断数据非空的结构
 struct t_client_idx{
 boolean LCcode;
 boolean ClientID;
 other info

 };
///@brief 声明t_client多索引容器的结构
 struct t_client{
 tp_LCcode  LCcode;
 tp_ClientID  ClientID;
 other info;
t_client(t_client_db &db,t_client_idx &idx)
{

if (idx.LCcode) {
 memcpy(LCcode, db.LCcode, sizeof db.LCcode);

}

if (idx.ClientID) {
 memcpy(ClientID, db.ClientID, sizeof db.ClientID);
}
other info
}

 };

///@brief 声明t_client多索引容器的索引标签

struct pk_t_client {};


///@brief 声明t_client多索引容器
typedef boost::multi_index_container<
  t_client,
  boost::multi_index::indexed_by<

boost::multi_index::hashed_non_unique<
boost::multi_index::tag<pk_t_client>,
boost::multi_index::composite_key<
t_client,
boost::multi_index::member<t_client, char[21],&t_client::LCcode >,
boost::multi_index::member<t_client, char[21],&t_client::ClientID >
                >,
boost::multi_index::composite_key_hash<

CharHasher,
CharHasher>,
boost::multi_index::composite_key_equal_to<

CharEqualTo,
CharEqualTo
    >
  >
 
  >
> t_client_set;
///@brief 声明t_client索引

typedef t_client_set::index<pk_t_client>::type pk_t_client_Index;

以上为多索引集合的声明,我项目用c++的开源库OCILIB加载Oracle的数据,用字符串数组的时候,100w数据只需要16s,用std::string要用100s。而boost库的multi_index对字符串数据组支持不是很好,在用组合索引查找的时候,用了std::tuple,而tuple不支持字符串数组,请问各位大牛,有没有使用multi_index的经验,我需要使用字符串数组,因为处理数组快。        

加载中
返回顶部
顶部