ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如果我的钥匙是我价值的一部分,我应该使用地图还是套装?

2019-09-01 19:07:50  阅读:189  来源: 互联网

标签:stdset c key stdmap


在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有