0

次のコードがあります

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 である別のベクトルに基づいてインデックス ベクトルをソートする単純なソート コードができました。'circle_fwd_vector' は、すべて double を含むベクトルです。

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

私はカスタムクラスを使用しておらず、並べ替えているベクトルは double のみに基づいているため、なぜこれが範囲外になるのかわかりません。double ベクトルに無限大がないことを確認しましたが、たとえあったとしても、 std::sort はインデックスから外れることなく、正しいソート済みインデックスを提供するべきではありませんか?

助けてくれてありがとう。

編集: 役立つ場合は、これが発生したときのベクトルのデータ ダンプを次に示します。 http://pastebin.com/7wLX63FJまた、Xcode 3.2.6 に同梱されている GCC 4.2 を使用してこれをコンパイルしています。

4

1 に答える 1

2

このエラーはnan、データの値 (位置 1688) が原因で発生します。問題は、が sを含めるときに<必要な制約を満たさなくなったことです。すべてのコンパレータが満たさなければならない「厳密な弱い順序付け」の定義については、標準 25.4/4 を参照してください。std::sortnan

于 2013-02-09T04:29:42.503 に答える