multi_index::composite_key with char[]
Hi,All: When I use the multi_index::composite_key with char[],I meet a error,when find a element。It seems to the make_tuple can't support the char[].Because the char[] more faster the std::string。So our project choose char[] as the column instead of std::string.So How should I do -- View this message in context: http://boost.2283326.n4.nabble.com/multi-index-composite-key-with-char-tp467... Sent from the Boost - Users mailing list archive at Nabble.com.
leyiliu <595657419 <at> qq.com> writes:
Hi,All: When I use the multi_index::composite_key with char[],I meet a error,when find a element。It seems to the make_tuple can't support the char[].Because the char[] more faster the std::string。So our project choose char[] as the column instead of std::string.So How should I do
Hi leyiliu, I'm not totally sure I'm getting your question, so allow to me to make a guess: I assume you have something like struct X { int x; char str[20]; }; using multi_index_t=multi_index_container< X, indexed_by< ordered_unique< composite_key< X, member<X,int,&X::x>, member<X,char[20],&X::str> > > > >; ... multi_index_t m=...; auto it=m.lower_bound(std::make_tuple(1,"hello")); which fails with error: no match for call to '(const std::less<char [20]>) (const char* const&, const char [20]) because std::less<char[20]> won't accept a const char* (the type of "hello") as an argument. There's two dixes for this: 1. Provide a comparison for str that does the work using multi_index_t=multi_index_container< X, indexed_by< ordered_unique< composite_key< X, member<X,int,&X::x>, member<X,char[20],&X::str> >, composite_key_compare< std::less<int>, std::less<const char*> > > > >; std::less<const char*> works equally well for const char* and char[20] (technically, the latter *decays* to const char* when passed to std::less::operator()). 2. Provide a key extractor that returns a const char* rather than a reference to char[20]: inline const char* get_str(const X& x){return x.str;} using multi_index_t=multi_index_container< X, indexed_by< ordered_unique< composite_key< X, member<X,int,&X::x>, global_fun<const X&,const char*,get_str> > > > >; Please report back whether this is your problem and any of 1,2 solves it. Best regards, Joaquín M López Muñoz Telefónica
CoreStruct.h <http://boost.2283326.n4.nabble.com/file/n4679888/CoreStruct.h> TypeDef.h <http://boost.2283326.n4.nabble.com/file/n4679888/TypeDef.h> this is my code file t_ac_client_basic_set testSet; pk_t_ac_client_basic_Index test = testSet.get<pk_t_ac_client_basic>; test.find(std::make_tuple("KS", "1")); How can I modify to right -- View this message in context: http://boost.2283326.n4.nabble.com/multi-index-composite-key-with-char-tp467... Sent from the Boost - Users mailing list archive at Nabble.com.
leyiliu <595657419 <at> qq.com> writes:
CoreStruct.h <http://boost.2283326.n4.nabble.com/file/n4679888/ CoreStruct.h> TypeDef.h <http://boost.2283326.n4.nabble.com/file/n4679888/TypeDef.h>
this is my code file
t_ac_client_basic_set testSet; pk_t_ac_client_basic_Index test = testSet.get<pk_t_ac_client_basic>; test.find(std::make_tuple("KS", "1"));
How can I modify to right
Hi leyiliu, I'd suggest you don't remove the conversation context when replying to the list, so that the conversation can be more easily followed by potential reades. Useful info on posting guidelines at http://www.boost.org/community/policy.html As for your question, I've reviewed the code you provide and seemingly you're taking my advice of providing ad-hoc hash and equality functors taking const char* rather than char[21], so in principle everything looks right. What exact problem/error are you getting? PS: the line pk_t_ac_client_basic_Index test = testSet.get<pk_t_ac_client_basic> should be pk_t_ac_client_basic_Index& test = testSet.get<pk_t_ac_client_basic> (note the &). Is this related to your problem? Joaquín M López Muñoz Telefónica
Joaquin M LópezMuñoz wrote
leyiliu <595657419 <at> qq.com> writes:
CoreStruct.h <http://boost.2283326.n4.nabble.com/file/n4679888/
> CoreStruct.h>
TypeDef.h <http://boost.2283326.n4.nabble.com/file/n4679888/TypeDef.h>
this is my code file
t_ac_client_basic_set testSet; pk_t_ac_client_basic_Index test = testSet.get <pk_t_ac_client_basic> ; test.find(std::make_tuple("KS", "1"));
How can I modify to right
Hi leyiliu,
I'd suggest you don't remove the conversation context when replying to the list, so that the conversation can be more easily followed by potential reades. Useful info on posting guidelines at
http://www.boost.org/community/policy.html
As for your question, I've reviewed the code you provide and seemingly you're taking my advice of providing ad-hoc hash and equality functors taking const char* rather than char[21], so in principle everything looks right. What exact problem/error are you getting?
PS: the line
pk_t_ac_client_basic_Index test = testSet.get <pk_t_ac_client_basic> should be
pk_t_ac_client_basic_Index& test = testSet.get <pk_t_ac_client_basic> (note the &). Is this related to your problem?
Joaquín M López Muñoz Telefónica _______________________________________________ Boost-users mailing list
Boost-users@.boost
I follow your suggest,define the set like this: typedef boost::multi_index_container< t_ac_client_basic, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique< boost::multi_index::tag<pk_t_ac_client_basic>, boost::multi_index::composite_key< t_ac_client_basic, boost::multi_index::member<t_ac_client_basic, char[21], &t_ac_client_basic::LCcode >, boost::multi_index::member<t_ac_client_basic, char[21], &t_ac_client_basic::ClientID > >, boost::multi_index::composite_key_compare< std::less<const char*>, std::less<const char*> > > > > t_ac_client_basic_set; I get a error,when add this code pk_t_ac_client_basic_Index& test = testSet.get<pk_t_ac_client_basic>; : error C3867: “boost::multi_index::multi_index_container<ZYSystem::t_ac_client_basic,boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::tag<ZYSystem::pk_t_ac_client_basic,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<ZYSystem::t_ac_client_basic,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x0)>,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x15)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_compare<std::less<const char *>,std::less<const char *>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>::get”: 函数调用缺少参数列表;请使用“&boost::multi_index::multi_index_container<ZYSystem::t_ac_client_basic,boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::tag<ZYSystem::pk_t_ac_client_basic,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<ZYSystem::t_ac_client_basic,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x0)>,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x15)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_compare<std::less<const char *>,std::less<const char *>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>::get”创建指向成员的指针 when I use the hash index,like my code file,I get a error: error C3867: “boost::multi_index::multi_index_container<ZYSystem::t_ac_client_basic,boost::multi_index::indexed_by<boost::multi_index::hashed_non_unique<boost::multi_index::tag<ZYSystem::pk_t_ac_client_basic,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<ZYSystem::t_ac_client_basic,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x0)>,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x15)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_hash<ZYSystem::CharHasher,ZYSystem::CharHasher,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_equal_to<ZYSystem::CharEqualTo,ZYSystem::CharEqualTo,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>::get”: 函数调用缺少参数列表;请使用“&boost::multi_index::multi_index_container<ZYSystem::t_ac_client_basic,boost::multi_index::indexed_by<boost::multi_index::hashed_non_unique<boost::multi_index::tag<ZYSystem::pk_t_ac_client_basic,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::composite_key<ZYSystem::t_ac_client_basic,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x0)>,boost::multi_index::member<ZYSystem::t_ac_client_basic,char [21],pointer-to-member(0x15)>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_hash<ZYSystem::CharHasher,ZYSystem::CharHasher,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,boost::multi_index::composite_key_equal_to<ZYSystem::CharEqualTo,ZYSystem::CharEqualTo,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>::get”创建指向成员的指针 -- View this message in context: http://boost.2283326.n4.nabble.com/multi-index-composite-key-with-char-tp467... Sent from the Boost - Users mailing list archive at Nabble.com.
leyiliu <595657419 <at> qq.com> writes:
I follow your suggest,define the set like this:
typedef boost::multi_index_container< t_ac_client_basic, boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique< boost::multi_index::tag<pk_t_ac_client_basic>, boost::multi_index::composite_key< t_ac_client_basic, boost::multi_index::member<t_ac_client_basic, char[21], &t_ac_client_basic::LCcode >, boost::multi_index::member<t_ac_client_basic, char[21], &t_ac_client_basic::ClientID > >, boost::multi_index::composite_key_compare< std::less<const char*>, std::less<const char*> > > >
t_ac_client_basic_set;
I get a error,when add this code pk_t_ac_client_basic_Index& test = testSet.get<pk_t_ac_client_basic>; : error C3867: “boost::multi_index::multi_index_container [...] ::get”: 函数调用缺少参数列表;请使 [...]
I can't read Chinese, but Google Translate suggests the compiler is complaining about missing args to get, which is indeed the problem: testSet.get<pk_t_ac_client_basic>; should be testSet.get<pk_t_ac_client_basic>(); Joaquín M López Muñoz Telefónica
Joaquín M López Munoz wrote
leyiliu <595657419 <at> qq.com> writes:
I follow your suggest,define the set like this:
typedef boost::multi_index_container< t_ac_client_basic, boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique< boost::multi_index::tag <pk_t_ac_client_basic> , boost::multi_index::composite_key< t_ac_client_basic, boost::multi_index::member<t_ac_client_basic, char[21], > &t_ac_client_basic::LCcode >, boost::multi_index::member<t_ac_client_basic, char[21], > &t_ac_client_basic::ClientID > >, boost::multi_index::composite_key_compare< std::less <const char*> , std::less <const char*> > > >
t_ac_client_basic_set;
I get a error,when add this code pk_t_ac_client_basic_Index& test = testSet.get <pk_t_ac_client_basic> ; : error C3867: “boost::multi_index::multi_index_container [...] ::get”: 函数调用缺少参数列表;请使 [...]
I can't read Chinese, but Google Translate suggests the compiler is complaining about missing args to get, which is indeed the problem:
testSet.get <pk_t_ac_client_basic> ;
should be
testSet.get <pk_t_ac_client_basic> ();
Joaquín M López Muñoz Telefónica _______________________________________________ Boost-users mailing list
Boost-users@.boost
Sorry,Long time no see. Follow you suggest,I can insert element into the container.But the find() is also a problem. *test.find(std::make_tuple("KS", "1")); *. thanks a lot -- View this message in context: http://boost.2283326.n4.nabble.com/multi-index-composite-key-with-char-tp467... Sent from the Boost - Users mailing list archive at Nabble.com.
leyiliu <595657419 <at> qq.com> writes:
leyiliu <595657419 <at> qq.com> writes:
I follow your suggest,define the set like this:
typedef boost::multi_index_container< t_ac_client_basic, boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique< boost::multi_index::tag <pk_t_ac_client_basic> , boost::multi_index::composite_key< t_ac_client_basic, boost::multi_index::member<t_ac_client_basic, char[21], > &t_ac_client_basic::LCcode >, boost::multi_index::member<t_ac_client_basic, char[21], > &t_ac_client_basic::ClientID > >, boost::multi_index::composite_key_compare< std::less <const char*> , std::less <const char*> > > >
t_ac_client_basic_set;
Sorry,Long time no see. Follow you suggest,I can insert element into the container.But the find() is also a problem. *test.find(std::make_tuple("KS", "1")); *.
thanks a lot
Oh, my bad. std::less<const char*> does not work here, as it compares pointers rather than the contents they point to. So you need to provide your own comparator like: struct less_str { bool operator()(const char* p1,const char* p2)const { return std::strcmp(p1,p2)<0; } }; I've tried this in the example above and the thing works, please report back your results. Joaquín M López Muñoz Telefónica #include <boost/multi_index_container.hpp> #include <boost/multi_index/member.hpp> #include <boost/multi_index/composite_key.hpp> #include <boost/multi_index/ordered_index.hpp> #include <cstring> #include <iostream> struct X { X(const char* p1,const char* p2) { std::strncpy(str1,p1,20); std::strncpy(str2,p2,20); } char str1[20]; char str2[20]; }; using namespace boost::multi_index; struct less_str { bool operator()(const char* p1,const char* p2)const { return std::strcmp(p1,p2)<0; } }; using multi_index_t=multi_index_container< X, indexed_by< ordered_unique< composite_key< X, member<X,char[20],&X::str1>, member<X,char[20],&X::str2> >, composite_key_compare< less_str, less_str > > > >; int main() { multi_index_t test{{"KS","1"},{"AB","0"},{"GE","2"}}; auto it=test.find(std::make_tuple("KS","1")); std::cout<<it->str1<<","<<it->str2<<"\n"; }
participants (3)
-
Joaquin M López Muñoz
-
Joaquín M López Munoz
-
leyiliu