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

Posted

技术标签:

【中文标题】将迭代器强制转换为另一种类型【英文标题】:Cast an iterator to another type 【发布时间】:2013-10-08 15:15:14 【问题描述】:

我正在使用 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 个字节)。无法读取我的初始数据或用新数据更新它。

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

    我怎样才能做一些通用的事情(使用 unsigned int、char 和 short)? 如何在不复制的情况下遍历数组?

感谢您的宝贵时间!

【问题讨论】:

看来你的问题是你调用setIndices()时的演员阵容,而不是在使用矢量迭代器时! 【参考方案1】:

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

我怎样才能做一些通用的事情(使用 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);

如何在不复制的情况下遍历数组?

您不能在不复制数据的情况下更改数组的类型。为避免复制,您必须期待正确的数组类型。

【讨论】:

谢谢!但我不能这样做,因为我的类型变成了“int”,所以当我将索引发送到 OpenGL 时,类型是错误的,所以原语不会绘制。 (我的无符号字符变为无符号整数):/

以上是关于将迭代器强制转换为另一种类型的主要内容,如果未能解决你的问题,请参考以下文章

C语言强制类型转换

C 强制类型转换

无法从一种迭代器类型转换为另一种,但两者完全相同

SQL SERVER中强制类型转换cast和convert的区别

SQL SERVER中强制类型转换cast和convert的区别

详细理解javascript中的强制类型转换