将迭代器转换为另一种类型

时间:2013-10-08 15:15:15

标签: c++ arrays architecture vector

我正在使用OpenGL处理​​渲染器。

我有头等舱,几何:

class Geometry
{
 public:

    void setIndices( const unsigned int* indices, int indicesCount );

 private:
    std::vector<unsigned char> colors;
    std::vector<float>         positions;
    std::vector<unsigned int>  indices;
};

有时,我的几何图形需要为不同类型的索引存储,数据可以是:

1. std::vector<unsigned char> 
2. std::vector<short> 
3. std::vector<int>

// I've already think about std::vector<void>, but it sound dirty :/.

目前,我在任何地方使用 unsigned int ,当我想将其设置为几何体时,我会投射数据:

const char* indices = { 0, 1, 2, 3 };
geometry.setIndices( (const unsigned int*) indices, 4 );

后来,我想在运行期间更新或读取这个数组(有时候数组可以存储超过60000个索引),所以我做了类似的事情:

std::vector<unsigned int>* indices = geometry.getIndices();
indices->resize(newIndicesCount);

std::vector<unsigned int>::iterator it = indices->begin();

问题是我的迭代器循环在 unsigned int 数组上,所以迭代器转到4个字节到4个字节,我的初始数据可以是char(所以1个字节到1个字节)。无法读取我的初始数据或使用新数据更新它。

当我想要更新我的向量时,我唯一的解决方案是创建一个新数组,用数据填充它,然后将它转换为无符号的int数组,我想迭代我的索引指针。

  1. 我如何做一些通用的东西(使用unsigned int,char和short)?
  2. 如何在不复制的情况下迭代数组?
  3. 谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

转换为错误的指针类型会产生未定义的行为,如果此类型的大小错误,肯定会失败。

  

我如何做一些通用的东西(使用unsigned int,char和short)?

模板将是制作该通用的最简单方法:

template <typename InputIterator>
void setIndices(InputIterator begin, InputIterator end) {
    indices.assign(begin, end);
}

用法(更正示例以使用数组而不是指针):

const char indices[] = { 0, 1, 2, 3 };
geometry.setIndices(std::begin(indices), std::end(indices));

您可能会考虑直接获取容器,数组和其他范围类型的方便过载:

template <typename Range>
void setIndices(Range const & range) {
    setIndices(std::begin(range), std::end(range));
}

const char indices[] = { 0, 1, 2, 3 };
geometry.setIndices(indices);
  

如何在没有复制的情况下迭代数组?

如果不复制数据,则无法更改数组的类型。为避免副本,您必须期望正确的数组类型。