我有以下代码
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;
};
现在我有一个简单的排序代码,我在其中根据另一个为double的向量对索引向量进行排序。 &#39; circle_fwd_vector&#39;是包含所有双打的向量。
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此外,我正在使用Xcode 3.2.6附带的GCC 4.2对其进行编译。
答案 0 :(得分:2)
此错误是由数据中的nan
值(位置1688)引起的。问题是当<
包含std::sort
时,nan
不再满足{{1}}所需的约束。有关所有比较器必须满足的“严格弱排序”的定义,请参阅标准25.4 / 4。