Re: STL and finding objects by name
Matthew Bucknall ha scritto:
class Thing
{
public:
Thing(const std::string& name):
m_name(name)
{}
std::string get_name() const { return m_name; }
bool operator< (const Thing& rhs) const
{
return m_name < rhs.m_name;
}
private:
const 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);
}
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.
Unfortunately, std::set is not very friendly in this scenario. The only
way to do proper lookup is to create an instance of Thing, for example
like this:
std::set<Thing>::iterator find_thing(const std::string& name)
{
return things.find(Thing(name));
}
If Thing is an heavy weight object, you could add a function set_name()
to change an object name, making it private to avoid involuntarily
breaking the std::set invariant, but making it a friend of find_thing so
that it can re-use one Thing instance:
std::set<Thing>::iterator find_thing(const std::string& name)
{
static Thing key;
key.set_name(name);
return things.find(key);
}
(not the most elegant code, I know.)
As a last resort, you could avoid using std::set entirely and rely on
smarter containers, for example Boost.MultiIndex
http://www.boost.org/doc/libs/1_35_0/libs/multi_index/doc/index.html
HTH,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]