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
- C++面向对象编程分享06----20160404_李楚煌
- C++面向对象编程分享----20160301_李楚煌
- C++面向对象编程分享02----20160311_李楚煌
- C++面向对象编程分享03----20160317_李楚煌
- C++面向对象编程分享04----20160322_李楚煌
- C++面向对象编程分享05----20160326_李楚煌
- C++面向对象编程分享07----20160407_李楚煌
- C++面向对象编程分享08----20160422_李楚煌
- C++面向对象编程分享09----20160429_设计模式_李楚煌
- 面向对象_链式编程
- 013_《Delphi面向对象编程思想》
- 黑马程序员_面向对象编程初步
- 黑马程序员_面向对象编程
- 黑马程序员:Java编程_面向对象
- 学习笔记_面向对象编程
- python基础八_面向对象编程
- C语言面向对象编程
- C语言面向对象编程
- 4Sum
- 白话讲MyIsam和InnoDB的区别
- poj 1195(二维线段树||二维树状数组)
- spring、mybatis整合
- 栈的压入、弹出序列 java实现
- C++面向对象编程分享06----20160404_李楚煌
- 绘图(二,跟随路径变化的Text)
- 正则表达式示例
- 【FZU 2215】Simple Polynomial Problem
- 【day0404 C++】类的成员函数
- JavaScript反选-全选-全不选代码
- 线性表的
- 分布式计算——远程对象和远程方法的调用
- KNN算法