網站首頁 編程語言 正文
一、介紹Boost.MultiArray
Boost.MultiArray
Boost.MultiArray 是一個簡化使用多維數組的庫。最重要的優點是多維數組可以像標準庫中的容器一樣使用。例如,有一些成員函數,例如 begin() 和 end(),讓您可以通過迭代器訪問多維數組中的元素。迭代器比通常用于 C 數組的指針更易于使用,尤其是對于具有多個維度的數組。
二、示例
示例 19.1。帶有 boost::multi_array 的一維數組
#include <boost/multi_array.hpp>
#include <iostream>
int main()
{
boost::multi_array<char, 1> a{boost::extents[6]};
a[0] = 'B';
a[1] = 'o';
a[2] = 'o';
a[3] = 's';
a[4] = 't';
a[5] = '\0';
std::cout << a.origin() << '\n';
}
Boost.MultiArray 提供類 boost::multi_array 來創建數組。這是提供的最重要的類。它在 boost/multi_array.hpp 中定義。
boost::multi_array 是一個需要兩個參數的模板:第一個參數是要存儲在數組中的元素的類型。第二個參數確定數組應該有多少維。
第二個參數只設置維度的數量,而不是每個維度中的元素數量。因此,在示例 19.1 中,a 是一維數組。
維度中的元素數量是在運行時設置的。示例 19.1 使用全局對象 boost::extents 來設置維度大小。該對象被傳遞給 a 的構造函數。
boost::multi_array 類型的對象可以像普通的 C 數組一樣使用。通過將索引傳遞給 operator[] 來訪問元素。示例 19.1 將五個字母和一個空字符存儲在 a - 一個包含六個元素的一維數組中。 origin() 返回指向第一個元素的指針。該示例使用此指針將存儲在數組中的單詞 -Boost - 寫入標準輸出。
與標準庫中的容器不同,operator[] 檢查索引是否有效。如果索引無效,程序將使用 std::abort() 退出。如果您不想檢查索引的有效性,請在包含 boost/multi_array.hpp 之前定義宏 BOOST_DISABLE_ASSERTS。
示例 19.2。二維數組的視圖和子數組
#include <boost/multi_array.hpp>
#include <algorithm>
#include <iostream>
#include <cstring>
int main()
{
boost::multi_array<char, 2> a{boost::extents[2][6]};
typedef boost::multi_array<char, 2>::array_view<1>::type array_view;
typedef boost::multi_array_types::index_range range;
array_view view = a[boost::indices[0][range{0, 5}]];
std::memcpy(view.origin(), "tsooB", 6);
std::reverse(view.begin(), view.end());
std::cout << view.origin() << '\n';
boost::multi_array<char, 2>::reference subarray = a[1];
std::memcpy(subarray.origin(), "C++", 4);
std::cout << subarray.origin() << '\n';
}
Example19.2
example19.2 創建一個二維數組。第一個維度中的元素數設置為 2,第二個維度中的元素數設置為 6。將數組視為具有兩行六列的表。
表的第一行將包含單詞 Boost。由于這個詞只需要存儲五個字母,因此創建了一個視圖,該視圖正好跨越數組的五個元素。
基于類 boost::multi_array::array_view 的視圖允許您訪問數組的一部分并將該部分視為單獨的數組。
boost::multi_array::array_view 是一個模板,它將視圖中的維數作為模板參數。在示例 19.2 中,視圖的維數為 1。由于數組 a 有兩個維度,因此忽略了一個維度。為了省去Boost這個詞,一維數組就足夠了;更多的維度會令人困惑。
與 boost::multi_array 一樣,維數作為模板參數傳入,每個維的大小在運行時設置。但是,對于 boost::multi_array::array_view,這不是通過 boost::extents 完成的。相反,它是通過 boost::indices 完成的,這是 Boost.MultiArray 提供的另一個全局對象。
與 boost::extents 一樣,索引必須傳遞給 boost::indices。雖然只能將數字傳遞給 boost::extents,但 boost::indices 也接受范圍。這些是使用 boost::multi_array_types::index_range 定義的。
在示例 19.2 中,傳遞給 boost::indices 的第一個參數不是范圍,而是數字 0。傳遞數字時,您不能使用 boost::multi_array_types::index_range。在示例中,視圖將采用 a 的第一個維度——索引為 0 的維度。
對于第二個參數,boost::multi_array_types::index_range 用于定義范圍。通過將 0 和 5 傳遞給構造函數,a 的第一個維度的前五個元素可用。范圍從索引 0 開始,到索引 5 結束——不包括索引 5 處的元素。第一維中的第六個元素被忽略。
因此,視圖是一個由五個元素組成的一維數組——a 的第一行中的前五個元素。當訪問視圖以使用 std::memcpy() 復制字符串并使用 std::reverse() 反轉元素時,這種關系無關緊要。創建視圖后,它就像一個具有五個元素的獨立數組。
當對 boost::multi_array 類型的數組調用 operator[] 時,返回值取決于
方面。在示例 19.1 中,運算符返回 char 元素,因為訪問的數組是一維的。
在示例 19.2 中,a 是一個二維數組。因此,operator[] 返回子數組而不是 char 元素。因為子數組的類型不是公開的,所以必須使用 boost::multi_array::reference。此類型與 boost::multi_array::array_view 不同,即使子數組的行為類似于視圖。視圖必須明確定義并且可以跨越數組的任意部分,而子數組由 operator[] 自動返回并跨越每個維度中的所有元素。
示例 19.3。使用 boost::multi_array_ref 包裝 C 數組
#include <boost/multi_array.hpp>
#include <algorithm>
#include <iostream>
#include <cstring>
int main()
{
char c[12] =
{
't', 's', 'o', 'o', 'B', '\0',
'C', '+', '+', '\0', '\0', '\0'
};
boost::multi_array_ref<char, 2> a{c, boost::extents[2][6]};
typedef boost::multi_array<char, 2>::array_view<1>::type array_view;
typedef boost::multi_array_types::index_range range;
array_view view = a[boost::indices[0][range{0, 5}]];
std::reverse(view.begin(), view.end());
std::cout << view.origin() << '\n';
boost::multi_array<char, 2>::reference subarray = a[1];
std::cout << subarray.origin() << '\n';
}
類 boost::multi_array_ref 包裝了一個現有的 C 數組。在示例 19.3 中,a 提供與 boost::multi_array 相同的接口,但不分配內存。使用 boost::multi_array_ref,一個 C 數組——不管它有多少維——都可以被視為一個 boost::multi_array 類型的多維數組。 C 數組只需要作為附加參數添加到構造函數中。
Boost.MultiArray 還提供了 boost::const_multi_array_ref 類,它將 C 數組視為常量多維數組。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127416977
相關推薦
- 2022-06-22 Android開發保存QQ密碼功能_Android
- 2023-07-08 qt報錯***Fault tolerant heap shim applied to current
- 2022-11-10 C++在多線程中使用condition_variable實現wait_C 語言
- 2022-08-01 flask上使用websocket的方法示例_python
- 2023-07-03 react之自定義hooks
- 2022-07-27 SQL解決未能刪除約束問題drop?constraint_MsSql
- 2022-07-02 一個Python優雅的數據分塊方法詳解_python
- 2023-05-30 Pandas中DataFrame對象轉置(交換行列)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支