真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++開發(fā)EOS基礎(chǔ)指南:迭代器和Lambda表達(dá)式-創(chuàng)新互聯(lián)

讓我們來談?wù)劦?,它是一個非常有用的工具,在整個EOS代碼庫中大量使用。如果您來自JavaScript背景,您可能已經(jīng)熟悉迭代器,就像它們用于循環(huán)一樣。迭代器的關(guān)鍵概念是提供一種更好的方法來遍歷項集合。額外的好處是您可以為任何自定義類實現(xiàn)迭代器接口,使迭代器成為遍歷數(shù)據(jù)的通用方法。

“真誠服務(wù),讓網(wǎng)絡(luò)創(chuàng)造價值”是我們的服務(wù)理念,成都創(chuàng)新互聯(lián)團隊10多年如一日始終堅持在網(wǎng)站建設(shè)領(lǐng)域,為客戶提供優(yōu)質(zhì)服。不管你處于什么行業(yè),助你輕松跨入“互聯(lián)網(wǎng)+”時代,PC網(wǎng)站+手機網(wǎng)站+公眾號+微信平臺小程序開發(fā)。
// @url: https://repl.it/@MrToph/CPPBasics-Iterators
#include 
#include 

using namespace std;

int main()
{
  vector v{2, 3, 5, 8};
  // old way to iterate
  for (int i = 0; i < v.size(); i++)
  {
    cout << v[i] << "\n";
  }

  // using Iterators
  // begin() returns an iterator that points to the beginning of the vector
  // end() points to the end, can be compared using != operator
  // iterators are incremented by using the + operator thanks to operator-overloading
  for (vector::iterator i = v.begin(); i != v.end(); i++)
  {
    // iterators are dereferenced by * like pointers
    // returns the element the iterator is currently pointing to
    cout << *i << "\n";
  }

  // auto keyword allows you to not write the type yourself
  // instead C++ infers it from the return type of v.begin
  for (auto i = v.begin(); i != v.end(); i++)
  {
    cout << *i << "\n";
  }

  // can use arithmetic to "jump" to certain elements
  int thirdElement = *(v.begin() + 2);
  cout << "Third: " << thirdElement << "\n";
  // end is the iterator that points to the "past-the-end" element
  // The past-the-end element is the theoretical element that would follow the last element in the vector.
  // It does not point to any element, and thus shall not be dereferenced.
  int lastElement = *(v.end() - 1);
  cout << "Last: " << lastElement << "\n";

  // do not go out of bounds by iterating past the end() iterator
  // the behavior is undefined
  // BAD: v.end() + 1, v.begin() + 10
}

在現(xiàn)代C++中,迭代器是迭代元素集合(向量,列表,映射)的選方式。另外,auto關(guān)鍵字可以避免輸入word類型,但可能會導(dǎo)致代碼性能降低。

Lambda表達(dá)式

使用迭代器,我們可以開始研究現(xiàn)代C++的函數(shù)式編程概念。標(biāo)準(zhǔn)庫中的許多函數(shù)采用由兩個迭代器(開始和結(jié)束)和匿名函數(shù)(lambda函數(shù))表示的一系列元素作為參數(shù)。然后將此匿名函數(shù)應(yīng)用于范圍內(nèi)的每個元素。它們被稱為匿名函數(shù),因為它們不是綁定到變量,而是它們是短邏輯塊,作為內(nèi)聯(lián)參數(shù)傳遞給更高階函數(shù)。通常,它們對于傳遞給它們的函數(shù)是唯一的,因此不需要具有名稱(匿名)的整個開銷。

有了它,我們可以實現(xiàn)類似于排序,映射,過濾等的構(gòu)造,這些構(gòu)造在JavaScript等語言中很容易實現(xiàn):

[1,2,3,4].map(x => x*x).filter(x => x % 2 === 1).sort((a,b) => b - a)

C++中的代碼并不簡潔,但結(jié)構(gòu)相同。來自std庫的許多函數(shù)式編程助手以半開間隔運行,這意味著包括較低范圍,排除較高范圍。

// @url: https://repl.it/@MrToph/CPPBasics-Lambdas
#include 
#include 
// for sort, map, etc.
#include 

using namespace std;

int main()
{
  vector v{2, 1, 4, 3, 6, 5};
  // first two arguments are the range
  // v.begin() is included up until v.end() (excluded)
  // sorts ascending
  sort(v.begin(), v.end());

  // in C++, functions like sort mutate the container (in contrast to immutability and returning new arrays in other languages)
  for (auto i = v.begin(); i != v.end(); i++)
  {
    cout << *i << "\n";
  }

  // sort it again in descending order
  // third argument is a lambda function which is used as the comparison for the sort
  sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

  // functional for_each, can also use auto for type
  for_each(v.begin(), v.end(), [](int a) { cout << a << "\n"; });

  vector names{"Alice", "Bob", "Eve"};
  vector greetings(names.size());

  // transform is like a map in JavaScript
  // it applies a function to each element of a container
  // and writes the result to (possibly the same) container
  // first two arguments are range to iterate over
  // third argument is the beginning of where to write to
  transform(names.begin(), names.end(), greetings.begin(), [](const string &name) {
    return "Hello " + name + "\n";
  });
  // filter greetings by length of greeting
  auto new_end = std::remove_if(greetings.begin(), greetings.end(), [](const string &g) {
    return g.size() > 10;
  });
  // iterate up to the new filtered length
  for_each(greetings.begin(), new_end, [](const string &g) { cout << g; });
  // alternatively, really erase the filtered out elements from vector
  // so greetings.end() is the same as new_end
  // greetings.erase(new_end, greetings.end());

  // let's find Bob
  string search_name = "Bob";
  // we can use the search_name variable defined outside of the lambda scope
  // notice the [&] instead of [] which means that we want to do "variable capturing"
  // i.e. make all local variables available to use in the lambda function
  auto bob = find_if(names.begin(), names.end(), [&](const string &name) {
    return name == search_name;
  });
  // find_if returns an iterator referncing the found object or the past-the-end iterator if nothing was found
  if (bob != names.end())
    cout << "Found name " << *bob << "\n";
}

匿名函數(shù)的語法是在C++中習(xí)慣的東西。它們由括號指定,后跟參數(shù)列表,如[](int a,int b) - > bool {return a> b; }。請注意,- > bool指定一個布爾返回值。通常,您可以避免表達(dá)返回類型,因為它可以從函數(shù)體中的返回類型推斷出來。

如果要使用lambda函數(shù)之外的作用域中定義的變量,則需要進行變量捕獲。還有可能通過引用或值將參數(shù)傳遞給您的函數(shù)。

  • 要通過引用傳遞,您需要使用字符啟動lambda(就像在函數(shù)中使用引用時一樣):[&]
  • 要傳遞值,請使用=字符:[=]

還可以通過值和參考來混合和匹配捕獲。

例如,[=,&foo]將為除foo之外的所有變量創(chuàng)建副本,這些變量通過引用捕獲。

它有助于理解使用lambdas時幕后發(fā)生的事情:

事實證明,lambdas的實現(xiàn)方式是創(chuàng)建一個小類;這個類重載了operator(),因此它就像一個函數(shù)一樣。lambda函數(shù)是這個類的一個實例;構(gòu)造類時,周圍環(huán)境中的任何變量都將傳遞給lambda函數(shù)類的構(gòu)造函數(shù)并保存為成員變量。事實上,這有點像已經(jīng)可能的仿函數(shù)的想法。C++ 11的好處是,這樣做變得非常簡單——所以你可以一直使用它,而不是僅僅在非常罕見的情況下編寫一個全新的類是有意義的。

Lambda函數(shù)在EOS智能合約中大量使用,因為它們提供了一種非常方便的方法來修改少量代碼中的數(shù)據(jù)。標(biāo)準(zhǔn)庫中有更多函數(shù),它們與我們在sorttransform,remove_iffind_if中看到的函數(shù)類似。它們都通過<algorithm>標(biāo)頭導(dǎo)出。

======================================================================

分享一些比特幣、以太坊、EOS等區(qū)塊鏈相關(guān)的交互式在線編程實戰(zhàn)教程:

  • EOS入門教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。
  • 深入淺出玩轉(zhuǎn)EOS錢包開發(fā),本課程以手機EOS錢包的完整開發(fā)過程為主線,深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開發(fā),課程內(nèi)容即涵蓋賬戶、計算資源、智能合約、動作與交易等EOS區(qū)塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發(fā)包訪問EOS區(qū)塊鏈,以及如何在React前端應(yīng)用中集成對EOS區(qū)塊鏈的支持。課程內(nèi)容深入淺出,非常適合前端工程師深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開發(fā)。
  • java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
  • php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
  • c#比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細(xì)講解如何在C#代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是C#工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
  • java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
  • 以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
  • 以太坊開發(fā)進階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn),適合進階。
  • ERC721以太坊通證實戰(zhàn),課程以一個數(shù)字藝術(shù)品創(chuàng)作與分享DApp的實戰(zhàn)開發(fā)為主線,深入講解以太坊非同質(zhì)化通證的概念、標(biāo)準(zhǔn)與開發(fā)方案。內(nèi)容包含ERC-721標(biāo)準(zhǔn)的自主實現(xiàn),講解OpenZeppelin合約代碼庫二次開發(fā),實戰(zhàn)項目采用Truffle,IPFS,實現(xiàn)了通證以及去中心化的通證交易所。
  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
  • Hyperledger Fabric 區(qū)塊鏈開發(fā)詳解,本課程面向初學(xué)者,內(nèi)容即包含Hyperledger Fabric的×××?xí)cMSP服務(wù)、權(quán)限策略、通道配置與啟動、鏈碼通信接口等核心概念,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計、nodejs鏈碼與應(yīng)用開發(fā)的操作實踐,是Nodejs工程師學(xué)習(xí)Fabric區(qū)塊鏈開發(fā)的最佳選擇。
  • Hyperledger Fabric java 區(qū)塊鏈開發(fā)詳解,課程面向初學(xué)者,內(nèi)容即包含Hyperledger Fabric的×××?xí)cMSP服務(wù)、權(quán)限策略、頻道配置與啟動、鏈碼通信接口等核心概念,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計、java鏈碼與應(yīng)用開發(fā)的操作實踐,是java工程師學(xué)習(xí)Fabric區(qū)塊鏈開發(fā)的最佳選擇。
  • tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開發(fā)模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態(tài)庫等,也包括代幣發(fā)行等豐富的實操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。

匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請標(biāo)明出處。這里是C++開發(fā)EOS基礎(chǔ)指南:迭代器和Lambda表達(dá)式

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


當(dāng)前文章:C++開發(fā)EOS基礎(chǔ)指南:迭代器和Lambda表達(dá)式-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/dgpjci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部