Использование 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));