Использование boost :: lambda с контейнером STL - PullRequest
2 голосов
/ 05 ноября 2011

Полный код находится на https://gist.github.com/1341623

Я бы хотел отсортировать массив индекса (или вектор) для другого вектора, чтобы массив упорядочивался по индексу другого вектора.Однако тип vector :: at не может быть разрешен.

Я попытался сделать следующее:

Это нормально

sort(v.begin(), v.end());

Я бы хотел отсортироватьиндексы в соответствии с массивом, но заполнители не перегружают оператор []

sort(index,index+10, a[_1] < a[_2]);

Однако они перегружают оператор + и оператор *

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

Что я могу сделать для этогопроблема?Или я что-то неправильно понимаю?

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Помните, что указатели на функции-члены и указатели на свободные функции имеют разные типы. Пытаться: vector<int>::const_reference (vector<int>::*vector_int_at)(vector<int>::size_type) const = &vector<int>::at;

1 голос
/ 05 ноября 2011

Любая причина, почему вы не используете лямбду?

sort(index, index+10, [&a](int i, int j) { return a[i] < a[j]; });
1 голос
/ 05 ноября 2011

Я обычно просто объявляю функцию пересылки, чтобы избежать различных банок червя, связанных с такого рода вещами:

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