将boost :: lambda与STL容器一起使用

时间:2011-11-05 15:16:42

标签: c++ boost boost-lambda

完整代码位于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 ::的版本,但转换似乎失败了。

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)’ ...

我可以为这个问题做些什么?或者我误解了什么?

3 个答案:

答案 0 :(得分:2)

请记住,指向成员函数的指针和指向自由函数的指针具有不同的类型。尝试: vector<int>::const_reference (vector<int>::*vector_int_at)(vector<int>::size_type) const = &vector<int>::at;

答案 1 :(得分:1)

我通常只是声明一个转发函数,以避免与此类事物相关的各种蠕虫病毒:

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));

答案 2 :(得分:1)

你为什么不使用lambda?

sort(index, index+10, [&a](int i, int j) { return a[i] < a[j]; });