Re: STL and finding objects by name
On Apr 4, 9:37 pm, Matthew Bucknall <m...@mattbucknall.com> wrote:
Hello,
Apologies if the answer to this is obvious, I have spent quite some time
trying to come up with a solution. I would like to use some sorted STL
container (maybe a set ?) to hold a bunch of named objects, that is,
objects that posses their own name. I then want to search for objects in
the container by name. Here is an example:
class Thing
{
public:
Thing(const std::string& name):
m_name(name)
{}
std::string get_name() const { return m_name; }
// return const reference to avoiding copying.
std::string const& get_name() const { return m_name; }
bool operator< (const Thing& rhs) const
{
return m_name < rhs.m_name;
}
// provide operator== to meet the requirement of set
bool operator== (Thing const& rhs) const { return m_name ==
rhs.m_name; }
private:
const std::string m_name;
// remove const, to make Thing Assignable to meet the
requirement for container.
// as long as you don't provide modifier, the class remains
immutable.
std::string m_name;
};
std::set<Thing> things;
std::set<Thing>::iterator find_thing(const std::string& name)
{
// this won't work of course, but this hopefully illustrates
// what I want to do
return things.find(name);
}
a test case
#include <iostream>
int main()
{
things.insert(Thing("hello"));
things.insert(Thing("world"));
std::set<Thing>::iterator i = find_thing("hello");
if (i != things.end())
std::cout << i->get_name() << std::endl;
}
output:
hello
My question is, how can named objects (such as Thing) be stored in an
STL container such that they can then be efficiently found by name?
Note, I want named objects to have direct access to their name so
storing objects in a std::map<std::string, Thing> is no good IMHO
because items contained in the map don't have access to their keys.
I guess you meant bidirectional map,
check out Boost.Bimap, which is newly added into boost_1.35.0
HTH.
--
Best Regards
Barry
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]