首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ STL bind1st/bind2nd 詳解與 remove_if 擦除惯用法

     編輯:關於C語言

bind1st/bind2nd 是 C++98 綁定器,將二元函數對象綁定一個參數轉為一元函數對象,配合 remove_if 實現條件刪除。本文詳解用法、ptr_fun 配合、not1 否定邏輯,並給出標準擦除慣用法。

1. 核心概念

  • bind1st(op, val):綁定第一個參數 → op(val, x)
  • bind2nd(op, val):綁定第二個參數 → op(x, val)

例:less<int>() 即 x < y

  • bind2nd(less<int>(), 100) → x < 100
  • bind1st(less<int>(), 100) → 100 < x 即 x > 100

2. 實戰:vector 條件刪除


vector<int> v = {1, 2, 100, 200};

// 刪除 < 100
v.erase(remove_if(v.begin(), v.end(), bind2nd(less<int>(), 100)), v.end());
// 刪除 > 100 (bind1st)
v.erase(remove_if(v.begin(), v.end(), bind1st(less<int>(), 100)), v.end());
// 刪除 > 100 (bind2nd + greater)
v.erase(remove_if(v.begin(), v.end(), bind2nd(greater<int>(), 100)), v.end());
// 刪除 <= 100 (not1 + bind2nd + greater)
v.erase(remove_if(v.begin(), v.end(), not1(bind2nd(greater<int>(), 100))), v.end());

3. 關鍵點:remove_if + erase 慣用法

remove_if 只移動元素、返回新邏輯末尾,不改變容器大小,需配合 erase 物理刪除:


v.erase(remove_if(v.begin(), v.end(), pred), v.end());

4. 綁定普通函數指針:ptr_fun

bind1st/bind2nd 要求參數為「適配函數對象」(含 first_argument_type 等 typedef)。普通函數需用 ptr_fun 包裝:


bool cmp(int a, int b) { return a > b; }
// 錯誤:bind1st(cmp, 2) // 無法推導類型
// 正確:
bind1st(ptr_fun(cmp), 2); // 返回 binder1st

5. C++11 現代替代:lambda / std::bind


// C++11 lambda (推薦,可讀、高效)
v.erase(remove_if(v.begin(), v.end(), [](int x){ return x < 100; }), v.end());

// std::bind (通用綁定器)
using namespace std::placeholders;
v.erase(remove_if(v.begin(), v.end(), bind(less<int>(), _1, 100)), v.end());

注意:bind1st/bind2nd/ptr_fun 在 C++11 棄用,C++17 移除。新代碼請用 lambda 或 std::bind。

6. 完整示例:查找字符串


vector<char*> v = {"Open", "up", "the", "pearly", "gates"};
auto it = find_if(v.begin(), v.end(), 
    not1(bind2nd(ptr_fun(strcmp), "pearly"))); // strcmp 返回 0 表示相等
if (it != v.end()) cout << "Found: " << *++it << endl;

總結

bind1st/bind2nd 是函數式編程在 C++98 的產物,理解其「綁定參數位置」語義是關鍵。配合 remove_if-erase 慣用法是 STL 算法修改容器的標準模式。現代 C++ 請拥抱 lambda,更直觀、無類型推導煩惱、性能不遜色。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved