C++面向对象编程分享06----20160404_李楚煌

来源:互联网 发布:淘宝助理6.0官方下载 编辑:程序博客网 时间:2024/06/05 14:11
#include <iostream>using namespace std;#include <vector>#include <iterator>#include <algorithm>#include <functional>int main(){int array[] = {0,0,30,20,0,0,0,0,10,0};vector<int>v(array, array + 10);vector<int>v2;//取 !=0 的数vector<int>::iterator it = find_if(v.begin(), v.end(),bind1st(not_equal_to<int>(), 0));int cx;// !=0 的个数cx = count_if(v.begin(), v.end(),bind1st(not_equal_to<int>(), 0));//放置 数字 进入 v2int k = 0;for (int i = 0; i < v.size(); i++){if (*it != 0){k++;v2.push_back(*it);}if (k == cx)break;it++;}//验证v2里的数for (int i = 0; i < v2.size();i++){cout << v2[i] << endl;}system("pause");return 0;}

这段代码意指:在[0, 0, 30, 20, 0, 0, 0, 0, 10, 0]这个数组中,找出不等于0的数,并复制到第二个数组。

基本上最值得分析的代码在这段:


在vector中,有个iterator迭代器,迭代器在这里有点类似巡视妃子的官员,看到这个颜值达到标准,咦,停在她眼前细细观赏,看到另一个可以的,

喜新厌旧,另迎新欢。事实上整个代码是有个小bug的,如果 放置数字 里的 *it != 0,是不能得到非零数组v2的。

而bind1st,我的理解是把第一个参数转为一元函数,并将第二个参数左置。

如图:


在C++ standard library也有写:


但此特性在这段代码体现不明显,来看看这个:


这时:


是没有结果的,因为在刚刚的[0, 0, 30, 20, 0, 0, 0, 0, 10, 0],是没有大于30的,选不到妃子。

如图:


再来论证一下:

在数组中加个32,看看


可以选到妃子了。



而bind2nd是将第二个参数右置:


实际上实现这个功能有个更苦的写法:

#include <vector>#include <functional>#include <algorithm>#include <iostream>using namespace std;int main(int argc, char** argv) {vector<int> v1{ 0, 0, 30, 20, 0, 0, 0, 0, 10, 0 };vector<int> v2(v1.size());const int FIND_NUM = 0;vector<int>::iterator it = copy_if(v1.begin(), v1.end(), v2.begin(), bind1st(not_equal_to<int>(), FIND_NUM));v2.resize(distance(v2.begin(), it));for (int i : v2) cout << i << endl;system("pause");return 0;}
在cppreference有关于copy_if的用法:



2 0
原创粉丝点击