|
Boost Users : |
Subject: [Boost-users] Multi Index Container - find() not working with std::string, kind of stuck...
From: Steve Hibbert (hiblet_at_[hidden])
Date: 2011-07-08 12:54:28
Hi,
I've hit a snag with the Boost Multi Index Container, and I'd really appreciate some help. I've set up a container and I am using it to store shared pointers to custom objects. The custom objects are just data collections effectively, including std::strings, chars, ints etc.
The problem is that when I try to find a string in the MIC, the find function sometimes succeeds, and sometimes returns the same iterator as .end(), indicating a failure to find. Yet, if I iterate through the container testing the strings, the string is always found. I've done something wrong, but I do not know what it is.
Here's the container definition...
typedef boost::multi_index::multi_index_container
<
spExchOrder,
boost::multi_index::indexed_by
< boost::multi_index::ordered_unique // 0 index - shared pointer index
< boost::multi_index::identity<spExchOrder> > ,
boost::multi_index::ordered_unique // 1 index - Exchange ID eg "ORD-WIDGET-Timestamp"
< boost::multi_index::const_mem_fun< FC::ExchOrder, std::string, &FC::ExchOrder::ID > > ,
boost::multi_index::ordered_unique // 2 index - OrigDetails eg "CLIENTA|ORDER00123"
< boost::multi_index::const_mem_fun< FC::ExchOrder, std::string, &FC::ExchOrder::origDetails > >
>
> OrderReg;
The spExchOrder typedef is just a std::tr1 shared pointer to an FC::ExchOrder object.
This object has member functions that return the ID and origDetails member variable data as std::string type. Both are guaranteed unique.
I'm searching the MIC using this kind of code:
std::string sExchID = "Passed in Exchange ID";
OrderReg::nth_index<1>::type::iterator i = m_regOrders.get<1>().find( sExchID );
OrderReg::nth_index<1>::type::iterator iEnd = m_regOrders.get<1>().end();
if ( i != iEnd )
{ // Found, do what needs to be done }
I add shared pointers to the MIC like this:
m_regOrders.insert(spOrder);
When needed, shared pointers are deleted like this:
OrderReg::nth_index<0>::type& indexSP = m_regOrders.get<0>();
iDelCount = indexSP.erase(spOrder);
Any help with this would be greatly appreciated. Multi Index Containers have sorted out a number of problems for me, but I can't get past this issue.
Thanks in advance,
Steve
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net