程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> bind2st for_each和transform

bind2st for_each和transform

編輯:關於C++

一天STL論壇上有個朋友問關於bind2st使用的問題,開始以為很簡單:

void print(int& a,const int b)
{
a+=b;
}
int main()
{
list<int> my_list;
.........
for_each(my_list.begin(),my_list.end(), bind2nd(print,3) );
}

目的是依次循環,每個節點加3

想通過bind2nd使函數的第二個值綁定為3

可是通過不了,這是錯在哪

如果要達到目的的話,應該怎麼改呢??

後來一調試,發現不是那麼容易。你能發現問題在哪兒嗎?

後來看了幫助文檔才解決,看看我的答復:

for_each 是需要使用functor , bind2st 的對象也是functor 而不是函數。

如果需要使用bind2st,那麼你需要從binary_function繼承.

for_each不會讓你修改元素, 因此你的要求是達不到的。

在STL編程手冊中就有說明:

for_each的 “UnaryFunction does not apply any non-constant operation through its argument”

如果要達到要求,你可以使用transform.

以下代碼就是一個例子:

struct printx: public binary_function<int, int, int>
{
 int operator()(int a, int b)const
 {
  cout<<a+b<<endl;
  return a+b;
 }
};
int main()
{
  vector<int> my;
  my.push_back(0);
  my.push_back(1);
  my.push_back(2);
  copy(my.begin(), my.end(), ostream_iterator<int>(cout, " "));
  cout<<"\n-----"<<endl;
  for_each(my.begin(),my.end(), bind2nd(printx() , 3) );
  cout<<"\n-----"<<endl;
  copy(my.begin(), my.end(), ostream_iterator<int>(cout, " "));
  cout<<"\n-----"<<endl;
  transform(my.begin(),my.end(),my.begin(), bind2nd(printx() , 3) );
  cout<<"\n-----"<<endl;
  copy(my.begin(), my.end(), ostream_iterator<int>(cout, " "));
  return 0;
}

看來不是那麼容易,STL在使用之初,確實不那麼容易,其編程思想很不錯,但是如果沒有習慣這種風格,非常容易出現問題,加上編譯錯誤提示信息不友好,也很難改正錯誤。因此,建議初學者盡量不要去使用一些麻煩的操作。多使用容器自帶的函數,一步一步來。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved