亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ Boost Bind庫示例分析使用

 更新時間:2022年11月14日 17:09:02   作者:無水先生  
Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱

一、說明Boost.Bind

Boost.Bind 是一個庫,它簡化和概括了最初需要 std::bind1st() 和 std::bind2nd() 的功能。這兩個函數(shù)被添加到 C++ 98 的標準庫中,即使它們的簽名不兼容,也可以連接函數(shù)。

二、庫應(yīng)用示范

Boost.Bind 被添加到 C++ 11 的標準庫中。如果你的開發(fā)環(huán)境支持C++ 11,你會在頭文件中找到函數(shù)std::bind()。根據(jù)用例,使用 lambda 函數(shù)或 Boost.Phoenix 可能比 std :: bind () 或 Boost.Bind 更好。

例 41.1。 std::for_each() 具有兼容功能

#include <vector>
#include <algorithm>
#include <iostream>
void print(int i)
{
  std::cout << i << '\n';
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), print);
}

std::for_each() 的第三個參數(shù)是一個函數(shù)或函數(shù)對象,它需要一個唯一的參數(shù)。在示例 41.1 中,std :: for_each () 將容器 v 中的數(shù)字作為唯一參數(shù)一個接一個地傳遞給 print()。

如果你需要傳入一個簽名不符合算法要求的函數(shù),那就更難了。例如,如果您希望 print() 接受一個輸出流作為附加參數(shù),則不能再將其與 std::for_each() 原樣使用。

例 41.2。 std :: for_each () 與 std :: bind1st ()

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
class print : public std::binary_function<std::ostream*, int, void>
{
public:
  void operator()(std::ostream *os, int i) const
  {
    *os << i << '\n';
  }
};
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), std::bind1st(print{}, &std::cout));
}

與示例 41.1 一樣,示例 41.2 將 v 中的所有數(shù)字寫入標準輸出。但是,這一次,輸出流作為參數(shù)傳遞給 print()。為此,函數(shù) print() 被定義為從 std::binary_function 派生的函數(shù)對象。

使用 Boost.Bind,您無需將 print() 從函數(shù)轉(zhuǎn)換為函數(shù)對象。相反,您使用在 boost/bind.hpp 中定義的函數(shù)模板 boost::bind()。

例 41.3。 std :: for_each () 與 boost :: bind ()

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
void print(std::ostream *os, int i)
{
  *os << i << '\n';
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), boost::bind(print, &std::cout, _1));
}

Example41.3

示例 41.3 使用 print() 作為函數(shù),而不是作為函數(shù)對象。因為 print() 需要兩個參數(shù),所以函數(shù)不能直接傳遞給 std::for_each()。相反,boost::bind() 被傳遞給 std::for_each() 并且 print() 作為第一個參數(shù)被傳遞給 boost::bind()。

由于 print() 需要兩個參數(shù),所以這兩個參數(shù)也必須傳遞給 boost::bind()。它們是指向 std :: cout 和 _1 的指針。

_1 是占位符。 Boost.Bind 定義了從 _1 到 _9 的占位符。這些占位符告訴 boost::bind() 返回一個函數(shù)對象,該對象期望與具有最大數(shù)量的占位符一樣多的參數(shù)。如果像示例 41.3 中一樣,僅使用占位符 _1,則 boost :: bind () 返回一個一元函數(shù)對象 - 一個需要唯一參數(shù)的函數(shù)對象。在這種情況下這是必需的,因為 std :: for_each () 只傳遞一個參數(shù)。

std::for_each() 調(diào)用一元函數(shù)對象。傳遞給函數(shù)對象的值 - 來自容器 v 的數(shù)字 - 占據(jù)占位符 _1 的位置。 boost :: bind () 獲取數(shù)字和指向 std :: cout 的指針并將它們轉(zhuǎn)發(fā)給 print ()。

請注意 boost::bind() 和 std::bind1st() 和 std::bind2nd() 一樣,都是按值取參數(shù)的。為了防止調(diào)用程序試圖復制 std::cout,print() 需要一個指向流的指針。 Boost.Ref 提供了一個允許您通過引用傳遞參數(shù)的函數(shù)。

示例 41.4 說明了如何使用 boost::bind() 定義二進制函數(shù)對象。它使用算法std :: sort (),它期望一個二進制函數(shù)作為它的第三個參數(shù)。

例 41.4。 std :: sort () 與 boost :: bind ()

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
bool compare(int i, int j)
{
  return i > j;
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::sort(v.begin(), v.end(), boost::bind(compare, _1, _2));
  for (int i : v)
    std::cout << i << '\n';
}

在示例 41.4 中,創(chuàng)建了一個二進制函數(shù)對象,因為使用了占位符 _2。算法 std::sort() 從容器 v 調(diào)用這個二進制函數(shù)對象,并用兩個值計算返回值以對容器進行排序。函數(shù) compare() 被定義為對 v 進行降序排序。 由于 compare() 是二進制函數(shù),所以可以直接傳給 std::sort()。但是,使用 boost :: bind () 仍然有意義,因為它允許您更改參數(shù)的順序。

例如,如果您想對容器進行升序排序但不想更改 compare(),則可以使用 boost::bind()。

例 41.5。 std :: sort () 與 boost :: bind () 并更改了占位符的順序

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
bool compare(int i, int j)
{
  return i > j;
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::sort(v.begin(), v.end(), boost::bind(compare, _2, _1));
  for (int i : v)
    std::cout << i << '\n';
}

Example41.5

示例 41.5 簡單地通過交換占位符對 v 進行升序排序:首先傳遞 _2,然后傳遞 _1。

到此這篇關(guān)于C++ Boost Bind庫示例分析使用的文章就介紹到這了,更多相關(guān)C++ Boost Bind內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    這篇文章主要介紹了C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于malloc與free函數(shù)的實現(xiàn)代碼及分析

    基于malloc與free函數(shù)的實現(xiàn)代碼及分析

    本篇文章介紹了malloc與free函數(shù)的實現(xiàn)代碼及分析。需要的朋友參考下
    2013-05-05
  • C語言程序環(huán)境中的預(yù)處理詳解

    C語言程序環(huán)境中的預(yù)處理詳解

    這篇文章主要為大家詳細介紹了C語言程序環(huán)境中的預(yù)處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C?++迭代器iterator在string中使用方法介紹

    C?++迭代器iterator在string中使用方法介紹

    迭代器是一種檢查容器內(nèi)元素并遍歷元素的數(shù)據(jù)類型。迭代器是一個變量,提供對一個容器中的對象的(間接)訪問方法,并且定義了容器中對象的范圍。迭代器可以指向容器中的某個元素,通過迭代器就可以對非數(shù)組(存儲空間不連續(xù))的數(shù)據(jù)結(jié)構(gòu)進行遍歷
    2022-10-10
  • 新手向超詳細的C語言實現(xiàn)動態(tài)順序表

    新手向超詳細的C語言實現(xiàn)動態(tài)順序表

    本文主要介紹了C語言實現(xiàn)動態(tài)順序表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • c語言 malloc函數(shù)詳解

    c語言 malloc函數(shù)詳解

    這篇文章主要介紹了c語言 malloc函數(shù)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • C++實現(xiàn)鄰接表頂點的刪除

    C++實現(xiàn)鄰接表頂點的刪除

    這篇文章主要為大家詳細介紹了C++實現(xiàn)鄰接表頂點的刪除,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 一文搞懂C++11萬能引用和右值引用

    一文搞懂C++11萬能引用和右值引用

    本文主要介紹了C++11萬能引用和右值引用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言通過三步翻轉(zhuǎn)法實現(xiàn)單詞倒置詳解

    C語言通過三步翻轉(zhuǎn)法實現(xiàn)單詞倒置詳解

    這篇文章主要為大家分享了用三步翻轉(zhuǎn)法將一句話的單詞進行倒置的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • 淺析C++中的函數(shù)重載

    淺析C++中的函數(shù)重載

    這篇文章主要介紹了淺析C++中的函數(shù)重載,在C++中,可以為兩個或兩個以上的函數(shù)提供相同的函數(shù)名稱,只要參數(shù)類型不同,或者參數(shù)類型相同而參數(shù)個數(shù)不同,又或者參數(shù)類型參數(shù)個數(shù)相同,參數(shù)次序不同,稱為函數(shù)重載,需要的朋友可以參考下
    2023-08-08

最新評論