加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在基类中引用不同大小的std :: array而不是std :: array

发布时间:2020-12-16 09:35:03 所属栏目:百科 来源:网络整理
导读:我有以下问题.考虑这些课程 class face { virtual std::vectorptr get_vertices(void) const = 0;};class triangle : public face {private: std::vectorptr vertices;public: std::vectorptr get_vertices(void) const { return vertices; };};class quadri
我有以下问题.考虑这些课程

class face {
    virtual std::vector<ptr>& get_vertices(void) const = 0;
};

class triangle : public face {
private:
    std::vector<ptr> vertices;
public:
    std::vector<ptr>& get_vertices(void) const { return vertices; };
};

class quadrilateral : public face {
private:
    std::vector<ptr> vertices;
public:
    std::vector<ptr>& get_vertices(void) const { return vertices; };
};

显然,三角形和四边形将始终分别具有3和4个顶点.
因此,我想用适当大小的std :: array交换std :: vector,以节省由std :: vector中的三个附加指针引起的开销. (这是因为我将拥有数以百万计的面孔……)现在,是否有机会在std :: array面前有一个公共访问函数,就像上面的std :: vector一样?
使用标准C数组,我只需返回指向第一个数组条目及其大小的指针.是否有STL方式来做同样的事情或类似的事情?或者还有其他很好的方法来实现这个功能吗?

感谢阅读和可能的回答!!
安德烈亚斯

解决方法

std ::不同大小的数组是不同的类型,所以我看不到任何你想要的方法.但是,如果将begin()和end()const迭代器返回到内部容纳的容器或包含两者的小范围对象,该怎么办?这样您就可以将容器的大小与接口分离,并将其留给实现.

编辑:只是为了澄清,为了隐藏数据存储表示(在这种情况下,std :: array的大小),您将需要自己的face迭代器类.这很容易在指针方面实现,因为对于每个面专业化,您都知道底层数据结构的大小,开始和结束.但是显然你不能直接在界面中使用std :: array的begin()和end().

例:

这是一个快速而肮脏的示例,说明如何使用指针实现部分正向迭代器行为.我使用虚拟基类和OP中的一个实现作为起点.我也省略了所有构造函数,赋值运算符等.它还假设一个类Edge(可能是2D或3D点?).

class face {

public:

  typedef Edge* iterator;
  typedef const Edge* const_iterator;

  virtual iterator begin() = 0;
  virtual const_iterator begin() const = 0;
  virtual iterator end() = 0;
  virtual const_iterator end() const = 0;
  virtual size_t size() const = 0;

  virtual ~face() {};

};

class triangle : public virtual face {

public :
  virtual iterator begin() {return m_edges.begin();}
  virtual const_iterator begin() const {return m_edges.begin();}
  virtual iterator end() {return m_edges.end();}
  virtual const_iterator end() const {return m_edges.end();}
  virtual size_t size() const {return m_edges.size();}

private:
    std::array<Edge,3> m_edges;

};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读