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