【问题标题】:std::out_of_range during std::sort with custom comparator在 std::sort 期间使用自定义比较器进行 std::out_of_range
【发布时间】:2013-02-09 02:17:10
【问题描述】:

我有以下代码

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 另外,我正在使用 Xcode 3.2.6 附带的 GCC 4.2 进行编译。

【问题讨论】:

  • circle_fwd_vector 不是空的,是吗?顺便说一句,您是否有理由将circle_index_vector 的最后一个元素排除在外?您知道标准算法适用于半开范围,对吗?
  • 抱歉,已更正代码。即使最后一个元素是否被遗漏,它也会产生相同的结果。另外,我确保向量不为空。结果还是一样。
  • 请查看问题中的编辑。如果有帮助,我还在向量中添加了数据。
  • 我非常努力,但无法重现您看到的问题(诚然,我使用随机数而不是您的,但我认为这没有什么不同)。您能否向我们展示一个最小的main(),包括上面始终重现该行为的第二个 sn-p 代码?
  • @rwb 您是否看到您的数据中有nan

标签: c++ sorting stl stl-algorithm


【解决方案1】:

此错误是由数据中的 nan 值(位置 1688)引起的。问题是当您包含nans 时,&lt; 不再满足std::sort 所需的约束。有关所有比较器必须满足的“严格弱排序”的定义,请参见标准 25.4/4。

【讨论】:

  • 是的!那解决了它!我不知道 nan 失败了
猜你喜欢
  • 1970-01-01
  • 2021-01-11
  • 2020-10-02
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多