Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

容器概念

向量

描述

向量描述了稠密、 packed 和稀疏向量的共同方面。

精化自

DefaultConstructible, 向量表达式 [1]

关联类型

除了 向量表达式 定义的类型之外

公共基类 vector_container<V> V 必须从此公共基类派生。
存储数组 V::array_type 仅限稠密向量。用于存储元素的基础存储数组的类型。 array_type 必须建模 存储 概念。

符号

V 作为向量模型的类型
v V 类型的对象
n, i 可转换为 size_type 类型的对象
t 可转换为 value_type 类型的对象
p 可转换为 bool 类型的对象

定义

有效表达式

除了 DefaultConstructible, 向量表达式 中定义的表达式之外,以下表达式也必须有效。

名称 表达式 类型要求 返回类型
尺寸构造函数 V v (n)   V
插入 v.insert_element (i, t) v 是可变的。 void
擦除 v.erase_element (i) v 是可变的。 void
清除 v.clear () v 是可变的。 void
调整大小 v.resize (n)
v.resize (n, p)
v 是可变的。 void
存储 v.data() v 是可变的且稠密的。 如果 v 是可变的,则为 array_type&,否则为 const array_type&

表达式语义

表达式的语义仅在与 向量表达式 中定义的语义不同或未定义时才定义。

名称 表达式 先决条件 语义 后置条件
尺寸构造函数 V v (n) n >= 0 分配一个包含 n 个元素的向量。 v.size () == n.
元素访问 [2] v[n] 0<n>v.size() 返回 v 中的第 n 个元素  
插入 v.insert_element (i, t) 0 <= i < v.size (). v (i) 处插入一个值为 t 的元素。向量的存储需求可能会增加。 v (i) 等于 t
擦除 v.erase_element (i) 0 <= i < v.size () 销毁 v (i) 处的元素,并将其替换为默认的 value_type ()。向量的存储需求可能会减少。 v (i) 等于 value_type ()
清除 v.clear ()   等效于
for (i = 0; i < v.size (); ++ i)
  v.erase_element (i);
 
调整大小 v.resize (n)
v.resize (n, p)
  重新分配向量,使其可以容纳 n 个元素。
擦除或附加元素以使向量达到规定的尺寸。附加的元素是 value_type() 的副本。
p == false 时,现有元素不会被保留,并且元素不会像正常情况下那样附加。相反,向量的状态与等效尺寸构造函数后的状态相同。
v.size () == n.
存储 v.data() 返回对底层稠密存储的引用。  

复杂度保证

尺寸构造函数的运行时复杂度与向量的大小呈线性关系。

insert_element 和 erase_element 的运行时复杂度对于向量模型是特定的,并且取决于存储需求的增加/减少。

resize 的运行时复杂度与向量的大小呈线性关系。

不变式

模型

注释

[1] 作为用户,您无需关心向量是向量表达式的精化。作为向量表达式的精化仅对模板表达式引擎重要,对用户不重要。

[2] 添加 operator[] 纯粹是为了方便和与 std::vector 的兼容性。然而,在 uBLAS 中,通常使用 operator() 进行索引,因为这可以用于向量和矩阵。


矩阵

描述

矩阵描述了稠密、 packed 和稀疏矩阵的共同方面。

精化自

DefaultConstructible, 矩阵表达式 [1]

关联类型

除了 矩阵表达式 定义的类型之外

公共基类 matrix_container<M> M 必须从此公共基类派生。
存储数组 M::array_type 仅限稠密矩阵。用于存储元素的基础存储数组的类型。 array_type 必须建模 存储 概念。

符号

M 作为矩阵模型的类型
m M 类型的对象
n1, n2, i, j 可转换为 size_type 类型的对象
t 可转换为 value_type 类型的对象
p 可转换为 bool 类型的对象

定义

有效表达式

除了 矩阵表达式 中定义的表达式之外,以下表达式也必须有效。

名称 表达式 类型要求 返回类型
尺寸构造函数 M m (n1, n2)   M
插入 m.insert_element (i, j, t) m 是可变的。 void
擦除 m.erase_element (i, j) m 是可变的。 void
清除 m.clear () m 是可变的。 void
调整大小 m.resize (n1, n2)
m.resize (n1, n2, p)
m 是可变的。 void
存储 m.data() m 是可变的且稠密的。 如果 m 是可变的,则为 array_type&,否则为 const array_type&

表达式语义

表达式的语义仅在与 矩阵表达式 中定义的语义不同或未定义时才定义。

名称 表达式 先决条件 语义 后置条件
尺寸构造函数 M m (n1, n2) n1 >= 0n2 >= 0 分配一个包含 n1 行和 n2 列的矩阵。 m.size1 () == n1m.size2 () == n2
插入 m.insert_element (i, j, t) 0 <= i < m.size1 (),
0 <= j < m.size2 ().
m (i, j) 处插入一个值为 t 的元素。矩阵的存储需求可能会增加。 m (i, j) 等于 t
擦除 m.erase_element (i, j) 0 <= i < m.size1 ()
0 <= j < m.size2
销毁 m (i, j) 处的元素,并将其替换为默认的 value_type ()。矩阵的存储需求可能会减少。 m (i, j) 等于 value_type ()
清除 m.clear ()   等效于
for (i = 0; i < m.size1 (); ++ i)
  for (j = 0; j < m.size2 (); ++ j)
    m.erase_element (i, j);
 
调整大小 m.resize (n1, n2)
m.resize (n1, n2, p)
  重新分配矩阵,使其可以容纳 n1 行和 n2 列。
擦除或附加元素以使矩阵达到规定的尺寸。附加的元素是 value_type() 副本。
p == false 时,现有元素不会被保留,并且元素不会像正常情况下那样附加。相反,矩阵的状态与等效尺寸构造函数后的状态相同。
m.size1 () == n1m.size2 () == n2
存储 m.data() 返回对底层稠密存储的引用。  

复杂度保证

尺寸构造函数的运行时复杂度与矩阵的大小呈二次关系。

insert_element 和 erase_element 的运行时复杂度对于矩阵模型是特定的,并且取决于存储需求的增加/减少。

resize 的运行时复杂度与矩阵的大小呈二次关系。

不变式

模型

注释

[1] 作为用户,您无需关心矩阵是矩阵表达式的精化。作为矩阵表达式的精化仅对模板表达式引擎重要,对用户不重要。


张量

描述

张量描述了稠密多维数组的共同方面。

精化自

DefaultConstructible, 张量表达式 [1]

关联类型

除了 张量表达式 定义的类型之外

公共基类 tensor_container<tensor_t> tensor_t 必须从此公共基类派生。
存储数组 tensor_t::array_type 仅限稠密张量。用于存储元素的基础存储数组的类型。 array_type 必须建模 存储 概念。

符号

tensor_t 作为张量模型的类型
t tensor_t 类型的对象
n1, n2, np, m1, m2, mq 可转换为 size_type 类型的维度对象
i1, i2, ip, j, k 可转换为 size_type 类型的索引对象
v 可转换为 value_type 类型的对象

定义

有效表达式

除了 张量表达式 中定义的表达式之外,以下表达式也必须有效。

名称 表达式 类型要求 返回类型
尺寸构造函数 T t(n1, n2, ..., np)   T
写入 t.at(i1, i2, ..., ip) t 是可变的。 void
读取 t.at(i1, i2, ..., ip) t 是可变的。 v
清除 t.clear () t 是可变的。 void
调整大小 t.resize(m1, m2, ... , mq) t 是可变的。 void
存储 t.data() t 是可变的且稠密的。 如果 t 是可变的,则为 pointer,否则为 const_pointer

表达式语义

表达式的语义仅在与 张量表达式 中定义的语义不同或未定义时才定义。

名称 表达式 先决条件 语义 后置条件
尺寸构造函数 T t(n1, n2, ..., np) $n_r \geq 1$ for $1\leq 1 \leq p $ 分配一个 p 阶张量,其维度范围为 $n_1,n_2,\dots,n_p$。 t.size(r)==nr for $1\leq r \leq p$。
写入 t.at(i1,i2,...,ip)=v $0 \leq i_r < n_r$ for $1 \leq r \leq p$。 在多索引位置 $i_1,i_2,\dots,i_p$ 写入一个值为 v 的元素。 t(i1,i2,...,ip) 等于 v
读取 v=t.at(i1,i2,...,ip) $0 \leq i_r < n_r$ for $1 \leq r \leq p$。 读取多索引位置 $(i_1,i2_,\dots,i_p)$ 处的元素,并返回一个值 v t(i1,i2,...,ip) 等于 v
清除 t.clear()   从容器中移除所有元素。  
调整大小 t.resize(m1, m2, ..., mq) $m_r \geq 1$ for $1\leq 1 \leq q $ 重新分配矩阵,使其可以容纳 $m_1\times m_2\times \cdots \times m_q$ 个元素。
擦除或附加元素以使矩阵达到规定的尺寸。附加的元素是 value_type() 副本。
t.size(r) == mr for $1\leq r \leq q$。
存储 m.data() 返回对底层稠密存储的引用。  

复杂度保证

构造函数的运行时复杂度与张量的大小 $n_1 \times n_2 \times \cdots \times n_p$ 呈线性关系。

write()read() 的运行时复杂度与张量的阶数呈线性关系。

resize 的运行时复杂度最多与张量的大小 $m_1 \times m_2 \times \cdots \times n_q$ 呈线性关系。

不变式

模型

注释

[1] 作为用户,您无需关心张量是张量表达式的精化。作为张量表达式的精化仅对模板表达式引擎重要,对用户不重要。


版权 (©) 2000-2002 Joerg Walter, Mathias Koch
版权 (©) 2018 Cem Bassoy
使用、修改和分发受 Boost 软件许可 1.0 版的约束。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)。