您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++20中的std::span怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++20中的std::span怎么使用”吧!
span就是一個(gè)連續(xù)對(duì)象存儲(chǔ)的觀察者。類(lèi)似std::string_view是string的觀察者。
連續(xù)的存儲(chǔ),不一定是數(shù)組。例如:
zero(char (&arr) [10]); //10個(gè)元素的數(shù)組, sizeof(arr)==10*sizeof(char)==10 zero(char arr[]); //arr退化為指針, sizeof(arr)==sizeof(char*) zero(char *arr, size_t n); //處理任意含n個(gè)char的連續(xù)內(nèi)存 void main(){ char* pc = new char[10]; zero(pc,10); //連續(xù)內(nèi)存,但不是數(shù)組 }
為了程序的復(fù)用性,我們一般使用zero(char* arr, size_t n);這種函數(shù)簽名。
template<size_t N> void zero(char (&arr)[N]) ;
這種模板形式雖然比只能處理char[10]這種類(lèi)型的zero函數(shù),適用性大一些,但是它仍不能處理廣義上的連續(xù)char內(nèi)存。
zero(char*arr, sizr_t n)的靈活性是有了,問(wèn)題是用戶(hù)(調(diào)用者)可能把n填錯(cuò)。例如:
char aa[10]; zero(aa,20);
為了解決這個(gè)問(wèn)題,我們需要寫(xiě)很繁瑣的代碼:
char aa[10]; std::array<char,10> bb; zero(aa,sizeof(aa)/sizeof(aa[0])); zero(bb.data(),bb.size());
有了std::span, 我們可以:
void zero( std::span<char> sp ){ size_t n = sp.size(); sp[n-1]=0; //當(dāng)數(shù)組越界時(shí),仍可能引發(fā)事故。 } char aa[10]; std::array<char,10> bb; zero(aa); zero(bb); //簡(jiǎn)化,統(tǒng)一
我們可以手工粗陋的制作一個(gè)span類(lèi),雖然它不符合STL容器規(guī)范,但是可以看出主要核心骨架
// This file is a "Hello, world!" in C++ language by GCC for wandbox. #include <iostream> #include <cstdlib> #include <array> template<class T> class span{ public: template<size_t N> span(T (&arr)[N]){ arr_ = arr; n_ = N; } template<size_t N> span(std::array<T,N>& arr){ arr_ = arr.data(); n_ = N; } span(T* arr,size_t n){ arr_ = arr; n_ = n; } T* data(){ return arr_;} size_t size(){ return n_;} private: T* arr_; size_t n_; }; void zero( span<char> sp ){ char* arr = sp.data(); size_t n = sp.size(); arr[n-1]=0; } int main() { char aa[10]; std::array<char,10> bb; size_t n=10; char* pc = new char[n]; zero(aa); zero(bb); zero({pc,n}); }
感謝各位的閱讀,以上就是“C++20中的std::span怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++20中的std::span怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。