c – 如果我的钥匙是我价值的一部分,我应该使用地图还是套装?
作者:互联网
在C中,我有一个按名称排序的类,它是一个std :: string.我希望在std :: map或std :: set中每个唯一名称只有一个.
我可以使用std :: set,因为运算符<将按名称命令我的实例,但是,我需要按名称查找实例.使用键是名称的映射是直截了当的,但是,我也可以使用一个集合并构造一个我的类的虚拟实例,其名称我想查找以在集合中找到给定的类的实际实例名称. 我想我应该使用地图来直接编写代码,但是想知道是否可能有一种方法可以使用该集合,因为密钥实际上是我的对象的一部分,因此避免了一些冗余. 有没有办法使用该集合,并能够以干净的方式通过其键定位对象,或者我应该使用地图并完成它? 这是要插入的类(以草稿形式),并且在每个目录中都有一个节点或地图的节点键入节点的名称:
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;
};
解决方法:
我认为因为Node在构造期间需要对Directory的引用,所以使用虚拟节点按名称搜索你的set将使Node类更加混乱.
要使用set,您可能需要在某处创建一个静态Directory,并在新的伪构造函数Node(const std :: string&)中将其用作虚拟引用.如果您没有声明显式,则可以在调用set :: find时直接使用字符串.
您可以改为将类转换为使用指针……但这会改变其内部语义:Directory&始终有效,而目录*不一定有效.问问自己是否只是因为您偏好设置容器而不希望读者对语义不太清楚.
所以我的观点在这种情况下非常清楚……您可以选择:使用map并保持您的类清洁,或使用set并编写一些支持垃圾代码,这些代码对其他任何东西毫无用处. =)
标签:stdset,c,key,stdmap 来源: https://codeday.me/bug/20190901/1785248.html