And*_*eas 3 c++ arrays reference vector
我有以下问题.考虑这些课程
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; };
};
Run Code Online (Sandbox Code Playgroud)
显然,三角形和四边形将始终分别具有3和4个顶点.因此,我想用适当大小的std :: array交换std :: vector,以节省由std :: vector中的三个附加指针引起的开销.(这是因为我将拥有数以百万计的面孔......)现在,是否有机会在std :: array面前拥有一个公共访问函数,就像上面的std :: vector一样?使用标准C数组,我只需返回指向第一个数组条目及其大小的指针.是否有STL方式来做同样的事情或类似的事情?或者还有其他很好的方法来实现这个功能吗?
感谢阅读和可能的回答!! 安德烈亚斯
std::arrays不同大小的不同类型,所以我看不到任何方法做你想要的.但是,如果将begin()和end()const迭代器返回到内部容纳的容器或包含两者的小范围对象,该怎么办?这样您就可以将容器的大小与接口分离,并将其留给实现.
编辑:只是为了澄清,为了隐藏数据存储表示(在这种情况下,大小std::array),您将需要自己的迭代器类face.这很容易在指针方面实现,因为对于每个特化,face您都知道底层数据结构的大小,开始和结束.但显然你不能直接使用std::array's 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;
Run Code Online (Sandbox Code Playgroud)
};