В C++ имам клас, който е подреден по името си, което е std::string
. Искам да имам само по един за всяко уникално име в std::map
или std::set
.
Бих могъл да използвам std::set
, тъй като operator<
ще подреди моите екземпляри по тяхното име, но трябва да потърся екземпляр по неговото име. Използването на карта, където ключът е името, е просто, но мога също да използвам набор и да създам фиктивен екземпляр на моя клас с името, което искам да търся, за да намеря в набора действителния екземпляр на класа за дадения име.
Предполагам, че трябва просто да отида с картата, за да направя кода право напред, но се чудя дали може да има начин да отида с набора, тъй като ключът така или иначе е ефективно част от моя обект и по този начин да избегна известна излишност.
Има ли начин да използвам набора и да мога да намирам обекти по техния ключ по чист начин или трябва просто да използвам карта и да приключа?
Ето класа, който трябва да бъде вмъкнат (в чернова форма) и във всяка директория има или набор, или карта на възел(и), записан от името на възела:
class Node {
public:
Node(Directory &parent, const std::string &name)
: _name(name),
_parent(&parent),
_isRoot(false) {
if (name.empty()) {
throw InvalidNodeNameError(name);
}
}
protected:
// This is only used for the root directory:
Node()
: _name(""),
_parent(0),
_isRoot(true) {
}
Node(const std::string &name)
: _name(name),
_parent(0),
isRoot(false) {
}
public:
virtual ~Node() {
if (parent()) {
parent()->remove(*this);
}
}
bool operator<(const Node &rhs) const {
return _name < rhs._name;
}
Directory *parent() const {
return _parent;
}
void setParent(Directory *parent) {
_parent = parent;
}
const std::string &name() const {
return _name;
}
bool isRoot() const {
return _isRoot;
}
std::string pathname() const {
std::ostringstream path;
if (parent()) {
path << parent()->pathname() << '/';
} else {
path << '/';
}
path << name();
return path.str();
}
private:
// Not defined:
Node(const Node &rhs);
Node &operator=(const Node &rhs);
private:
std::string _name;
Directory *_parent;
const bool _isRoot;
};
map
срещуunordered_map
. - person Joseph Mansfield   schedule 06.10.2012