<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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] = ' '; 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 建立一個二維陣列。第一個維度中的元素數設定為 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', ' ', 'C', '+', '+', ' ', ' ', ' ' }; 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 陣列視為常數多維陣列。
到此這篇關於C++ Boost MultiArray簡化使用多維陣列庫的文章就介紹到這了,更多相關C++ Boost MultiArray內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45