Partial string search in boost::multi_index_container
- by user361699
I have a struct to store info about persons and multi_index_contaider to store such objects
struct person
{
    std::string m_first_name;
    std::string m_last_name;
    std::string m_third_name;
    std::string m_address;
    std::string m_phone;
    person();
    person(std::string f, std::string l, std::string t = "", std::string a = DEFAULT_ADDRESS, std::string p = DEFAULT_PHONE) : 
        m_first_name(f), m_last_name(l), m_third_name(t), m_address(a),
        m_phone(p) {}    
};
typedef multi_index_container ,
        ordered_non_unique,
                member,
                member
            
        
    
 persons_set;
operator< and operator<< implementation for person
bool operator<(const person &lhs, const person &rhs)
{
    if(lhs.m_last_name == rhs.m_last_name)
    {
        if(lhs.m_first_name == rhs.m_first_name)
            return (lhs.m_third_name < rhs.m_third_name);
    return (lhs.m_first_name < rhs.m_first_name);
}
    return (lhs.m_last_name < rhs.m_last_name);
}
std::ostream& operator<<(std::ostream &s, const person &rhs)
{
    s << "Person's last name: " << rhs.m_last_name << std::endl;
    s << "Person's name: " << rhs.m_first_name << std::endl;
    if (!rhs.m_third_name.empty())
        s << "Person's third name: " << rhs.m_third_name << std::endl;
    s << "Phone: " << rhs.m_phone << std::endl;
    s << "Address: " << rhs.m_address << std::endl;
    return s;
}
Add several persons into container:
person ("Alex", "Johnson", "Somename");
person ("Alex", "Goodspeed");
person ("Petr", "Parker");
person ("Petr", "Goodspeed");
Now I want to find person by lastname (the first member of the second index in multi_index_container)
persons_set::nth_index<1::type &names_index = my_set.get<1();
std::pair::type::const_iterator, 
        persons_set::nth_index<1::type::const_iterator 
        n_it = names_index.equal_range("Goodspeed");
std::copy(n_it.first ,n_it.second,
        std::ostream_iterator(std::cout));
It works great. Both 'Goodspeed' persons are found.
Now lets try to find person by a part of a last name:
std::pair::type::const_iterator, 
        persons_set::nth_index<1::type::const_iterator 
        n_it = names_index.equal_range("Good");
std::copy(n_it.first ,n_it.second,
       std::ostream_iterator(std::cout));
This returns nothing, but partial string search works as a charm in std::set.
So I can't realize what's the problem. I only wraped strings by a struct. May be operator< implementation?
Thanks in advance for any help.