C ++には、。という名前で並べ替えられたクラスがありstd::string
ます。std::map
aまたは。のいずれかで一意の名前ごとに1つだけにしたい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;
};