OpenSubdiv.OPENSUBDIV_VERSION.Bfr
OpenSubdiv.OPENSUBDIV_VERSION.Far
OpenSubdiv.OPENSUBDIV_VERSION.Osd
OpenSubdiv.OPENSUBDIV_VERSION.Sdc
OpenSubdiv.OPENSUBDIV_VERSION.Vtr

OpenSubdiv.OPENSUBDIV_VERSION.Vtr.Array

简介

OpenSubdiv 的 Vtr.Array 是一种灵活的动态数组,可用于存储和管理 Vtr 顶点框架中的元素,包括顶点、边和面。它支持高效的随机访问和插入/删除操作,并具有附加元数据的能力。

类定义

template <typename T, int U = 4>
class Array {

public:
    // 构造函数和析构函数
    Array();
    ~Array();
  
    // 拷贝和移动构造函数和赋值操作符
    Array(Array&& src);
    Array(const Array& src);
    Array& operator=(Array&& src);
    Array& operator=(const Array& src);
  
    // 元素访问
    const T& operator[](Index idx) const;
    T& operator[](Index idx);
    
    // 插入和删除操作
    void clear();
    void resize(Index size);
    void resize(Index size, const T& value);
    void reserve(Index capacity);
    void append(const T& value);
    void insert(const T& value, Index beforeIndex);
    void remove(Index index);
    
    // 容量和大小相关的函数
    Index size() const;
    Index capacity() const;
    bool empty() const;
    void shrink_to_fit();
    
    // 其他操作
    int find(const T& value) const;
    void sort(bool reverseOrder = false);
};

成员变量

T* _array;
Index _size;
Index _capacity;
  • _array:指向数组的首个元素的指针
  • _size:数组中的元素数
  • _capacity:数组的当前容量

成员函数

Array() 构造函数

创建一个空的数组。

~Array() 析构函数

销毁数组并释放内存。

Array(const Array& src) 拷贝构造函数

使用给定的源数组创建一个新的数组。

Array(Array&& src) 移动构造函数

以源数组为基础创建一个新的数组,同时销毁源数组。

Array& operator=(const Array& src) 拷贝赋值操作符

将当前数组的内容替换为给定源数组的内容,并返回当前数组的引用。

Array& operator=(Array&& src) 移动赋值操作符

以源数组为基础,用其替换当前数组的内容,并返回当前数组的引用。

const T& operator[](Index idx) const 常量元素访问函数

返回位于给定索引 idx 处的元素,并不会对数组进行修改。

T& operator[](Index idx) 非常量元素访问函数

返回位于给定索引 idx 处的元素,并可能对数组进行修改。

void clear() 清空数组

从数组中移除所有元素并释放内存。

void resize(Index size) 修改数组大小

将数组的大小调整为给定的大小,并重新分配内存。如果 size 大于当前容量,则分配更多内存。

void resize(Index size, const T& value) 修改数组大小并设置元素值

resize(size) 相同,但还会将新插入的元素设置为 value

void reserve(Index capacity) 修改数组容量

将数组容量调整为给定的大小。

void append(const T& value) 追加元素

将元素 value 添加到数组的末尾。如果当前大小等于容量,则自动扩容。

void insert(const T& value, Index beforeIndex) 插入元素

将元素 value 插入到给定索引 beforeIndex 处,并将其余所有元素向右移动一位。如果当前大小等于容量,则自动扩容。

void remove(Index index) 移除元素

将给定索引 Index 处的元素从数组中移除,并将其余所有元素向左移动一位。如果当前大小小于容量,则自动缩小。

Index size() const 返回数组大小

返回当前数组中的元素数量。

Index capacity() const 返回数组容量

返回当前数组的容量。

bool empty() const 返回数组是否为空

返回当前数组是否为空。

void shrink_to_fit() 缩减数组容量

将数组容量调整为当前大小。

int find(const T& value) const 查找元素

在数组中查找给定的元素 value。如果找到该元素,则返回其索引;否则返回 -1。

void sort(bool reverseOrder = false) 排序元素

根据元素类型,对数组中的所有元素进行排序。如果给定 reverseOrder 为 true,则按相反顺序进行排序。

使用限制

  • Vtr.Array 只支持 POD 数据类型(Plain Old Data)和无法复制的类(例如 std::unique_ptr 等)。
  • 如果您在任何时候想要将 Vtr.Array 用于非 POD 类型,则需要扩展 Vtr.Array 以提供它们的构造函数,拷贝构造函数、移动构造函数、析构函数和赋值操作符等。