#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
// iterator check
template <typename It, typename T>
constexpr bool is = std::is_same<typename std::iterator_traits<It>::iterator_category, T>::value;
// quick sort
template <typename BidIt, typename Pred = typename std::less<typename std::iterator_traits<BidIt>::value_type>>
void qsort(BidIt first, BidIt last, Pred compare = {}) noexcept
{
static_assert(is<BidIt, std::bidirectional_iterator_tag> || is<BidIt, std::random_access_iterator_tag>,
"bidirectional iterator required");
auto size = std::distance(first, last);
if (size > 1) {
using content_type = typename std::iterator_traits<BidIt>::value_type;
content_type pivot = *first;
std::vector<content_type> left(size), right(size);
auto left_end = left.begin();
auto right_end = right.begin();
for (BidIt i = std::next(first); i != last; ++i) {
compare(*i, pivot) ? *left_end++ = *i : *right_end++ = *i;
}
qsort(left.begin(), left_end, compare);
qsort(right.begin(), right_end, compare);
std::copy(left.begin(), left_end, first);
*std::next(first, std::distance(left.begin(), left_end)) = pivot;
std::copy(right.begin(), right_end, std::next(first, std::distance(left.begin(), left_end) + 1));
}
}
struct integer
{
integer() = delete; //not default constructible
integer(int y):
x(y)
{}
int x;
};
bool operator<(const integer& lhs, const integer& rhs)
{
return lhs.x < rhs.x;
}
int main() {
std::vector<integer> v{1, 0, -1, 4, 2};
qsort(v.begin(), v.end());
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCi8vIGl0ZXJhdG9yIGNoZWNrCnRlbXBsYXRlIDx0eXBlbmFtZSBJdCwgdHlwZW5hbWUgVD4KY29uc3RleHByIGJvb2wgaXMgPSBzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXQ+OjppdGVyYXRvcl9jYXRlZ29yeSwgVD46OnZhbHVlOwoKCi8vIHF1aWNrIHNvcnQKdGVtcGxhdGUgPHR5cGVuYW1lIEJpZEl0LCB0eXBlbmFtZSBQcmVkID0gdHlwZW5hbWUgc3RkOjpsZXNzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEJpZEl0Pjo6dmFsdWVfdHlwZT4+CnZvaWQgcXNvcnQoQmlkSXQgZmlyc3QsIEJpZEl0IGxhc3QsIFByZWQgY29tcGFyZSA9IHt9KSBub2V4Y2VwdAp7CiAgICBzdGF0aWNfYXNzZXJ0KGlzPEJpZEl0LCBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnPiB8fCBpczxCaWRJdCwgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4sCiAgICAgICAgImJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZWQiKTsKCiAgICBhdXRvIHNpemUgPSBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KTsKCiAgICBpZiAoc2l6ZSA+IDEpIHsKICAgICAgICB1c2luZyBjb250ZW50X3R5cGUgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxCaWRJdD46OnZhbHVlX3R5cGU7CgogICAgICAgIGNvbnRlbnRfdHlwZSBwaXZvdCA9ICpmaXJzdDsKICAgICAgICBzdGQ6OnZlY3Rvcjxjb250ZW50X3R5cGU+IGxlZnQoc2l6ZSksIHJpZ2h0KHNpemUpOwogICAgICAgIGF1dG8gbGVmdF9lbmQgPSBsZWZ0LmJlZ2luKCk7CiAgICAgICAgYXV0byByaWdodF9lbmQgPSByaWdodC5iZWdpbigpOwoKICAgICAgICBmb3IgKEJpZEl0IGkgPSBzdGQ6Om5leHQoZmlyc3QpOyBpICE9IGxhc3Q7ICsraSkgewogICAgICAgICAgICBjb21wYXJlKCppLCBwaXZvdCkgPyAqbGVmdF9lbmQrKyA9ICppIDogKnJpZ2h0X2VuZCsrID0gKmk7CiAgICAgICAgfQoKICAgICAgICBxc29ydChsZWZ0LmJlZ2luKCksIGxlZnRfZW5kLCBjb21wYXJlKTsKICAgICAgICBxc29ydChyaWdodC5iZWdpbigpLCByaWdodF9lbmQsIGNvbXBhcmUpOwoKICAgICAgICBzdGQ6OmNvcHkobGVmdC5iZWdpbigpLCBsZWZ0X2VuZCwgZmlyc3QpOwogICAgICAgICpzdGQ6Om5leHQoZmlyc3QsIHN0ZDo6ZGlzdGFuY2UobGVmdC5iZWdpbigpLCBsZWZ0X2VuZCkpID0gcGl2b3Q7CiAgICAgICAgc3RkOjpjb3B5KHJpZ2h0LmJlZ2luKCksIHJpZ2h0X2VuZCwgc3RkOjpuZXh0KGZpcnN0LCBzdGQ6OmRpc3RhbmNlKGxlZnQuYmVnaW4oKSwgbGVmdF9lbmQpICsgMSkpOwogICAgfQp9CgpzdHJ1Y3QgaW50ZWdlcgp7CglpbnRlZ2VyKCkgPSBkZWxldGU7IC8vbm90IGRlZmF1bHQgY29uc3RydWN0aWJsZQoJaW50ZWdlcihpbnQgeSk6CgkJCQl4KHkpCgl7fQoJCglpbnQgeDsKfTsKCmJvb2wgb3BlcmF0b3I8KGNvbnN0IGludGVnZXImIGxocywgY29uc3QgaW50ZWdlciYgcmhzKQp7CglyZXR1cm4gbGhzLnggPCByaHMueDsKfQoKaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxpbnRlZ2VyPiB2ezEsIDAsIC0xLCA0LCAyfTsKCXFzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSk7Cn0=
In file included from /usr/include/c++/6/vector:63:0,
from prog.cpp:1:
/usr/include/c++/6/bits/stl_uninitialized.h: In instantiation of ‘static _ForwardIterator std::__uninitialized_default_n_1<true>::__uninit_default_n(_ForwardIterator, _Size) [with _ForwardIterator = integer*; _Size = long unsigned int]’:
/usr/include/c++/6/bits/stl_uninitialized.h:575:20: required from ‘_ForwardIterator std::__uninitialized_default_n(_ForwardIterator, _Size) [with _ForwardIterator = integer*; _Size = long unsigned int]’
/usr/include/c++/6/bits/stl_uninitialized.h:637:44: required from ‘_ForwardIterator std::__uninitialized_default_n_a(_ForwardIterator, _Size, std::allocator<_Tp>&) [with _ForwardIterator = integer*; _Size = long unsigned int; _Tp = integer]’
/usr/include/c++/6/bits/stl_vector.h:1309:36: required from ‘void std::vector<_Tp, _Alloc>::_M_default_initialize(std::vector<_Tp, _Alloc>::size_type) [with _Tp = integer; _Alloc = std::allocator<integer>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
/usr/include/c++/6/bits/stl_vector.h:281:30: required from ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = integer; _Alloc = std::allocator<integer>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<integer>]’
prog.cpp:24:44: required from ‘void qsort(BidIt, BidIt, Pred) [with BidIt = __gnu_cxx::__normal_iterator<integer*, std::vector<integer> >; Pred = std::less<integer>]’
prog.cpp:58:26: required from here
/usr/include/c++/6/bits/stl_uninitialized.h:540:37: error: use of deleted function ‘integer::integer()’
return std::fill_n(__first, __n, _ValueType());
^~~~~~~~~~~~
prog.cpp:43:2: note: declared here
integer() = delete; //not default constructible
^~~~~~~