[英]Using boost::lambda with an STL container
完整的代码位于https://gist.github.com/1341623
我想对另一个向量的索引数组(或向量)进行排序,以使该数组按另一个向量的索引排序。 但是,无法解析vector :: at的类型。
还行吧
sort(v.begin(), v.end());
我想根据数组对索引进行排序,但是占位符不会重载operator []
sort(index,index+10, a[_1] < a[_2]);
但是,它们会重载operator +和operator *
sort(index,index+10, *(a+_1) < *(a+_2));
我想根据向量对索引进行排序,但是编译器无法解析“ vector :: at”的类型。
sort(index,index+10,
bind(&(vector<int>::at), &v, _1) < bind(&(vector<int>::at), &v, _2));
// error: no matching function for call
// to ‘bind(<unresolved overloaded function type>, ...
在网上搜索后,我发现必须指定重载的方法类型,但是编译器仍然表示无法解析该类型。
sort(index,index+10,
bind(&static_cast<const int (*)(size_t)>(vector<int>::at), &v, _1)
< bind(&static_cast<const int (*)(size_t)>(vector<int>::at), &v, _2));
// error: invalid static_cast from type ‘<unresolved overloaded function type>’
// to type ‘const int (*)(size_t)’ ...
我尝试获取vector :: at的版本,但转换似乎失败了。
vector<int>::const_reference (*vector_int_at)(vector<int>::size_type)(vector<int>::at);
sort(index,index+10,
bind(&vector_int_at, &v, _1) < bind(&vector_int_at, &v, _2));
// error: no matches converting function ‘at’ to type ‘const int& (*)(size_t)’ ...
我该怎么办? 还是我误会了什么?
请记住,指向成员函数的指针和指向自由函数的指针具有不同的类型。 试试: vector<int>::const_reference (vector<int>::*vector_int_at)(vector<int>::size_type) const = &vector<int>::at;
我通常只是声明一个转发函数,以避免与这种情况相关的各种蠕虫病毒:
int vector_at(vector<int> const * v, size_t index) { return v->at(index); }
...
sort(index, index+10, bind(vector_at, &v, _1) < bind(vector_at, &v, _2));
为什么不使用lambda?
sort(index, index+10, [&a](int i, int j) { return a[i] < a[j]; });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.