在 C++ 中,我有一个按其名称排序的类,即std::string
. 我希望在 astd::map
或std::set
.
我可以使用 a 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;
};