C++ std::valarray 用法實例詳解
std::valarray 是 C++ 標準庫中專門用于數(shù)值數(shù)組計算的容器,定義在 <valarray> 頭文件中。它的設計目標是提供高性能的向量化運算,讓你能夠像操作單個數(shù)值一樣對整個數(shù)組進行數(shù)學運算,無需手動編寫循環(huán)。
一、核心特性
| 特性 | 說明 |
|---|---|
| 元素級運算 | 支持對整個數(shù)組統(tǒng)一進行數(shù)學運算 |
| 性能優(yōu)化 | 類似 restrict 關鍵字,減少別名干擾,便于編譯器優(yōu)化 |
| 子集訪問 | 提供切片(slice)、掩碼(mask)等靈活的數(shù)組子集提取方式 |
| 數(shù)學函數(shù)支持 | 提供 sin、cos、exp 等豐富的數(shù)學函數(shù) |
二、基礎用法
1. 構(gòu)造和初始化
#include <valarray>
#include <iostream>
int main() {
// 默認構(gòu)造
std::valarray<int> v1;
std::cout << v1.size() << std::endl; // 0[citation:1]
// 指定大小
std::valarray<int> v2(100); // 100個元素,默認初始化[citation:1]
// 指定大小和初始值(注意:第一個參數(shù)是值,第二個是數(shù)量)
std::valarray<int> v3(5, 20); // 20個5,注意順序與vector相反[citation:1]
// 從數(shù)組構(gòu)造
int arr[] = {2, 3, 5, 7, 11};
std::valarray<int> v4(arr, 5); // 從數(shù)組拷貝[citation:2][citation:6]
// C++11:初始化列表
std::valarray<int> v5{2, 3, 5, 7, 11}; // 直接初始化[citation:1]
// 改變大?。ㄔ袛?shù)據(jù)會丟失)
v5.resize(10); // 大小變?yōu)?0,所有元素重置[citation:1][citation:6]
}2. 元素訪問
std::valarray<int> v{1, 2, 3, 4, 5};
// operator[] 訪問單個元素
v[2] = 10; // 修改第3個元素[citation:2]
// size() 獲取元素數(shù)量
std::cout << v.size() << std::endl; // 5[citation:1]三、運算操作
1. 元素級算術(shù)運算
這是 valarray 最強大的特性——運算符直接作用于整個數(shù)組:
std::valarray<int> a{1, 2, 3};
std::valarray<int> b{4, 5, 6};
// 數(shù)組加法(逐個元素相加)
std::valarray<int> c = a + b; // {5, 7, 9}[citation:7]
// 數(shù)組與標量運算
std::valarray<int> d = a * 2; // {2, 4, 6}
// 一元運算
std::valarray<int> e = -a; // {-1, -2, -3}[citation:2]2. 復合賦值運算符
std::valarray<int> v1(1, 3); // {1, 1, 1}
std::valarray<int> v2(2, 3); // {2, 2, 2}
v1 += v2; // {3, 3, 3}
v2 += 2; // {4, 4, 4}[citation:9]支持的復合賦值運算符包括:+=, -=, *=, /=, %=, ^=, &=, |=, <<=, >>=。
3. 數(shù)學函數(shù)
#include <cmath>
#include <valarray>
std::valarray<double> v{0, 0.25, 0.5, 0.75, 1};
// 對每個元素應用數(shù)學函數(shù)
std::valarray<double> s = std::sin(v * std::numbers::pi);
// 結(jié)果: {0, 0.707, 1, 0.707, 0}[citation:4]
// 其他支持的函數(shù):cos, tan, exp, log, sqrt, abs 等[citation:3][citation:5]四、進階特性:子集訪問
valarray 提供了四種方式來訪問和操作數(shù)組的子集,這被認為是它的一個主要創(chuàng)新。
1. Slice(切片)
從數(shù)組中提取按固定步長選取的元素序列。
std::valarray<int> all{1, 2, 3, 4, 5, 6, 7, 8, 9};
// slice(start, length, stride): 從索引0開始,選5個元素,步長為2
std::slice sl(0, 5, 2);
std::valarray<int> odd = all[sl]; // {1, 3, 5, 7, 9}[citation:2]2. gslice(通用切片)
支持多維數(shù)組操作,適合矩陣計算。
// 創(chuàng)建類似3D數(shù)組的結(jié)構(gòu)
size_t lengths[] = {3, 3};
size_t strides[] = {3, 1};
std::valarray<size_t> len(lengths, 2);
std::valarray<size_t> str(strides, 2);
std::valarray<int> v(27); // 27個元素的數(shù)組
// 使用gslice提取特定子集
// v[gslice(0, len, str)] 提取前9個元素[citation:2]3. 掩碼數(shù)組(Mask Array)
使用布爾數(shù)組選擇元素:
bool b[] = {true, false, true, false, true, false, true, false, true};
std::valarray<bool> mask(b, 9);
std::valarray<int> all{1, 2, 3, 4, 5, 6, 7, 8, 9};
std::valarray<int> odd = all[mask]; // {1, 3, 5, 7, 9}[citation:2]4. 間接數(shù)組(Indirect Array)
使用索引數(shù)組選擇元素:
size_t idx[] = {0, 2, 4, 6, 8};
std::valarray<size_t> indices(idx, 5);
std::valarray<int> all{1, 2, 3, 4, 5, 6, 7, 8, 9};
std::valarray<int> odd = all[indices]; // {1, 3, 5, 7, 9}[citation:2]5. 子集的賦值操作
選中的子集也可以作為左值進行修改:
std::valarray<int> v{1, 2, 3, 4, 5};
std::slice sl(1, 3, 1);
v[sl] = 0; // v變成 {1, 0, 0, 0, 5}6. 其他實用方法
std::valarray<int> v{3, 1, 4, 1, 5};
int sum = v.sum(); // 總和:14[citation:6]
int min = v.min(); // 最小值:1[citation:3]
int max = v.max(); // 最大值:5[citation:3]
// 移位
std::valarray<int> v2 = v.shift(2); // {4, 1, 5, 0, 0} 左移,空位補0[citation:6]
std::valarray<int> v3 = v.cshift(2); // {4, 1, 5, 3, 1} 循環(huán)左移[citation:6]
// apply:將函數(shù)應用到每個元素
auto result = v.apply([](int x) { return x * x; }); // {9, 1, 16, 1, 25}[citation:8]五、使用建議
雖然 valarray 設計用于高性能數(shù)值計算,但實際使用情況是:
- GCC和LLVM 使用表達式模板技術(shù)實現(xiàn)了高效的
valarray運算 - Intel編譯器 通過集成IPP(Intel Performance Primitives)提供了專門優(yōu)化
不過,許多現(xiàn)代數(shù)值庫(如 Eigen、Blaze)更傾向于使用表達式模板直接優(yōu)化普通容器,因此
valarray的應用不如其他庫廣泛
如果你的項目需要簡單、直接的數(shù)組運算,valarray 是不錯的選擇。但如果需要更復雜的矩陣運算(如乘法、轉(zhuǎn)置等),建議考慮專門的線性代數(shù)庫(如 Eigen)。
到此這篇關于C++ std::valarray 用法實例詳解的文章就介紹到這了,更多相關C++ std::valarray 用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Trae+Qt+MSVC環(huán)境配置的實現(xiàn)示例
本文主要介紹了Trae+Qt+MSVC環(huán)境配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03
詳解C語言結(jié)構(gòu)體中的char數(shù)組如何賦值
這篇文章主要給大家介紹了關于C語言結(jié)構(gòu)體中的char數(shù)組如何賦值的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03

