t******r 发帖数: 209 | 1 常看到:
配接器bind2nd用作把二元变为一元判断式,常用在标准库带的函数对象上,
如:bind2nd(equal_to(),70)
小弟有个很初级的问题,
问什么标准库带的函数对象不能直接用70初始化,如:
equal_to(70);
恳请解答,谢谢。 |
|
z****e 发帖数: 2024 | 2 另外一个小问,
如果自己定义的function object超过3个参数的,bind2nd就没法用了,我就用一个
pair把后面两个绑起来,变成2个参数的function object,继续用bind2nd adaptor.
有没有好一点的,或者通用一点的方法呢? |
|
z****e 发帖数: 2024 | 3 auto_ptr > p=(new vector);
//do something...
transform( pnorm->begin(),pnorm->end(),pnorm->begin(),
bind2nd(shift_rescale(), make_pair(10.0,2.0))) ;
//shift_rescale的定义:
template
struct shift_rescale: public binary_function{
T operator()(const T& source, const pair& args) const{
return args.first+source*args.second;
}
};
transform那句话,巨长的编译报错一大堆,各种字符交相辉映,无法看懂。
肯定是bind2nd(shift_rescale(), make_pair(10.0, |
|
t****t 发帖数: 6806 | 4 No, you use auto to declare type when you have an initializer.
e.g.
int i=10;
====>
auto i=10;
Sounds useless huh? but sometimes it's useful--
auto add_one = bind2nd(plus(), 1.0);
transform(a.begin(), a.end(), a.begin(), add_one);
without auto, you will have to write
transform(a.begin(), a.end(), a.begin(), bind2nd(plus(), 1.0)));
This is an example, the real expression can be much more complex.
=====
but lambda expression is better in these cases:
for_each(a.begin(), a.end(), []... 阅读全帖 |
|
l*****g 发帖数: 685 | 5 为什么用remove_if? remove_if 会破坏原来的vector. 应该用 find_if 比较好
最简单的:
bool greaterThan50(int num)
{
return (num > 50);
}
find_if (v.begin(), v.end(), greaterThan50);
稍微改进一点:
template
bool greaterThanInt(T const &num)
{
return (T > i); // type T should be comparable to Int.
}
find_if(v.begin(), v.end(), greaterThan);
更灵活一点:
find_if(v.begin(), v.end(), bind2nd(Greater(), 50)); |
|
o*******p 发帖数: 722 | 6 bind is more general than bind2nd. You don't need to define your own
function.
vector myvector;
for (int i=1; i<20; i++) myvector.push_back(i*10);
for (vector::iterator results = myvector.begin(); results != myvector.
end(); results++)
{
results = find_if(results, myvector.end(), bind(std::greater(), _1,
50));
cout << *results <
} |
|
h*****g 发帖数: 944 | 7 g++总是说我的14行有错,为啥?
1 #include
2 #include
3 #include
4 #include
5
6 using namespace std;
7 int main(){
8 int numbers [] ={20, -30, 10, 40, 0};
9 vector five (numbers, numbers+5);
10 int cx = count_if(numbers, numbers+5, bind1st(greater_equal(),
15));
11 cout<<"There are "<
12 int dx = count_if(numbers, numbers+5, bind2nd(greater_equal(),
15));
13 c... 阅读全帖 |
|
t*******i 发帖数: 4960 | 8 攒点人品,回忆几道题
不用临时变量swap two int,用的是 ^ 操作
怎么同时往console和文件输出
函数的指针(类的函数)
constant pointer to constant value
memset
memcmp
func(p++)的结果,考的是传过去的值是 p 还是 p + 1
base class 只有一个带参数的ctor,derived class该怎么办
用什么函数把time_t变成字符串
std::remove_if用法
变量名 = new (...);
if (!变量名)
call a function; 我的答案是这个function永远不会被调用
bind2nd 出现了好几次,从来没用过的。
做题的感觉是脑子被驴踢了。 |
|
p*i 发帖数: 411 | 9 看c++ primer吧……
要考STL,例如bind1st bind2nd俺都被考到了,不考boost
说实话,题有点偏,但是看完c++ primer应该没啥大问题了~~
加油~ |
|
m*****m 发帖数: 242 | 10 std::vector items;
Referring to the sample code above, how do you remove all elements from the
items
collections that are greater than 50?
a. items.erase(std::remove_if(items.begin(), items.end(), std::bind2nd(std::
greater(), 50)), items.end());
b. std::remove_if(items.begin(), items.end(), std::greater(50));
c. items.erase(std::remove_if(items.begin(), items.end(), std::bindlst(std::
less_equal(), 50)), items.end());
d. items.remove_if(items.begin(), items.end(), std::bind2 |
|
z****e 发帖数: 2024 | 11 简短节说:
auto_ptr > p=(new vector);
//...something
transform( p->begin(),p->end(),p->begin(),
bind2nd(multiplies(), 10.0) );
//此处看看p.
问题1:发现p并没有失去 ownership,但是还是心虚,需要大牛confirm。
我知道auto_ptr不能作为容器元素,
问题2:但是auto_ptr作为函数参数的时候,往往会失去ownership是吗?
问题3:使用generic algorithm,什么时候auto_ptr会失去ownership 呢?
问题4:那么使用generic algorithm,auto_ptr结合, 例如上面的东东,需要注意什么
呢? |
|
j*****u 发帖数: 186 | 12 下面程序来自于essential C++ 3.6节,给定一个数组,输出比某个数小的所以元素。
main函数中用了back_inserter,按道理是不是应该include iterator头文件和
using std::back_inserter? 但是为什么把这两句注释掉程序也能跑呢?谢谢。
===================================================================
#include
#include
#include
#include
#include
//#include
using std::vector;
using std::cout;
using std::endl;
using std::less;
//using std::back_inserter;
template 阅读全帖 |
|
j*****u 发帖数: 186 | 13 下面程序来自于essential C++ 3.6节,给定一个数组,输出比某个数小的所以元素。
main函数中用了back_inserter,按道理是不是应该include iterator头文件和
using std::back_inserter? 但是为什么把这两句注释掉程序也能跑呢?谢谢。
===================================================================
#include
#include
#include
#include
#include
//#include
using std::vector;
using std::cout;
using std::endl;
using std::less;
//using std::back_inserter;
template 阅读全帖 |
|
s****i 发帖数: 150 | 14 简单
1) virtual table, virtual pointer
2) class的大小,比如
class A{
public:
virtual void print(){}
};
//...
这个占多少内存?
3) initialization list的顺序。比如 static member variable只能在
class 外面初始化,用classname::static_vari = blabla;
4) static & extern: 比如说,static variable不可以放在variable stack上,
要另外摆。
heap vs. stack:老话题了
new vs. malloc:超级老的话题了
5) unix的一些命令,grep, find, pipeline, blabla。
6) STL的基本概念.比如啥是vector, deque, set, map; STL有没有hashtable; set 为
啥比vector快;有哪几种iterator; bind2nd()的用法;sort的用法 (比如怎么sort 一
个a |
|