Использование boost::lambda с контейнером STL

Полный код на 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)’ ...

Я попытался получить версию вектора:: 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 ответа

Решение

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

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

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

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

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));
Другие вопросы по тегам