簡體   English   中英

std :: stable_sort中operator <constness的要求

[英]Requirement of operator< constness in std::stable_sort

我對std :: sort和std :: stable_sort的operator< const限定符的要求差異感到有些困惑。 假設一個簡單的結構:

#include <vector>
#include <algorithm>

struct Custom {
    bool operator<(const Custom& custom) /* const */{
        return true;
    };
};

如果我們嘗試編譯並運行以下代碼,一切都會好的:

int main() {
    std::vector<Custom> values(3);
    std::sort(values.begin(), values.end());
    return 0;
}

但是此帶有std::stable_sort代碼無法編譯:

int main() {
    std::vector<Custom> values(3);
    std::sort(values.begin(), values.end());
    return 0;
}

這是一個錯誤堆棧跟蹤:

In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from temp.cpp:1:
/usr/include/c++/5/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Val_less_iter::operator()(_Value&, _Iterator) const [with _Value = const Custom; _Iterator = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >]’:
/usr/include/c++/5/bits/stl_algo.h:2050:14:   required from ‘_ForwardIterator std::__upper_bound(_ForwardIterator, _ForwardIterator, const _Tp&, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >; _Tp = Custom; _Compare = __gnu_cxx::__ops::_Val_less_iter]’
/usr/include/c++/5/bits/stl_algo.h:2522:26:   required from ‘void std::__merge_without_buffer(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator, _Distance, _Distance, _Compare) [with _BidirectionalIterator = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >; _Distance = long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/5/bits/stl_algo.h:2782:34:   required from ‘void std::__inplace_stable_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/5/bits/stl_algo.h:4863:28:   required from ‘void std::__stable_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/5/bits/stl_algo.h:4897:36:   required from ‘void std::stable_sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Custom*, std::vector<Custom> >]’
temp.cpp:15:45:   required from here
/usr/include/c++/5/bits/predefined_ops.h:71:22: error: no match for ‘operator<’ (operand types are ‘const Custom’ and ‘Custom’)
       { return __val < *__it; }

所以我的問題是:這僅僅是技術實施細節的結果還是存在一些支持這種行為的客觀論據?

[alg.sorting] / 2 Compare是功能對象類型(20.9)。 施加到類型的對象的函數調用操作的返回值Compare ,當上下文轉換為bool (第4章),產率true如果該呼叫的第一個參數是小於第二,和false否則。 假設有排序關系,在整個算法中都使用Compare comp 假定comp不會通過取消引用的迭代器應用任何非常數函數。

[alg.sorting] / 3對於所有采用Compare算法,都有一個使用operator<的版本。 也就是說, comp(*i, *j) != false默認為*i < *j != false

[res.on.functions] / 1在某些情況下(替換函數,處理函數,用於實例化標准庫模板組件的類型的操作),C ++標准庫取決於C ++程序提供的組件。 如果這些組件不符合要求,則本標准對實施沒有任何要求。

強調我的。 通過向標准庫函數提供不滿足該函數要求的組件,您的程序表現出未定義的行為。

順便說一句,clang拒絕std::sortstd::stable_sort

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM