У меня есть следующий код
template<typename T>
bool GenericCompare(T lhs, T rhs)
{
return lhs < rhs;
}template<typename T>
class SortOrder
{
public:
SortOrder(const std::vector<T> *_sortArray,
bool (*_comparator)(T,T) = GenericCompare) :
sortArray(_sortArray) , comparator (_comparator) , customOperator(true) {;}
bool operator()(int lhs=0, int rhs=0) const
{
bool res;
try {
sortArray->at(lhs);
}
catch (std::out_of_range& oor) {
std::cout << "LHS Out of range: " << lhs << " : " << rhs
<< " " << oor.what() << std::endl;
}
try {
sortArray->at(rhs);
}
catch (std::out_of_range& oor) {
std::cout << "RHS Out of range: " << lhs << " : "<< rhs << " "<< oor.what() << std::endl;
}
// Always needs comparator
res = comparator(sortArray->at(lhs),sortArray->at(rhs));
return res;
}
private:
const std::vector<T> *sortArray;
bool (*comparator)(T,T);
bool customOperator;
};
Теперь у меня есть простой код сортировки, в котором я сортирую индексный вектор на основе другого вектора, который является двойным. ‘circle_fwd_vector’ — это вектор, содержащий все двойники.
for (int i=0;i<circle_fwd_vector.size();i++) {
circle_index_vector.push_back(i);
}
try {
std::sort(circle_index_vector.begin(),circle_index_vector.end(),
SortOrder<double>(&circle_fwd_vector));
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
Теперь в консоли я получаю такой результат:
RHS Out of range: 1711 : 1079615151 vector::_M_range_check
Так как я не использую какой-либо пользовательский класс, а вектор, который я сортирую, основан на двойных числах, я не уверен, почему я получаю это вне диапазона. Я удостоверился, что в двойном векторе нет бесконечностей, но даже если они есть, разве std :: sort все равно не даст мне правильный отсортированный индекс без выхода из индекса?
Спасибо за любую помощь.
Изменить: Если это помогает, вот дамп данных вектора, когда это происходит.
http://pastebin.com/7wLX63FJ Кроме того, я компилирую это, используя GCC 4.2, который поставляется с Xcode 3.2.6.
Эта ошибка вызвана nan
значение в ваших данных (позиция 1688). Проблема в том, что <
больше не удовлетворяет ограничениям, требуемым std::sort
когда вы включаете nan
s. См. Стандарт 25.4 / 4 для определения «строгого слабого порядка», которому должны соответствовать все компараторы.
Других решений пока нет …