是否可以使用迭代器和加法/除法在向量中找到分隔符?

问题描述

我正在写一个快速排序,我需要在算法中找到一个数组分隔符:

template<typename Iter> 
void Q_sort(Iter left,Iter right) {
    auto separator = *(left + (left - right) / 2);
    auto t_left = left,t_right = right;
    while (t_left < t_right) {
        while (*t_left < separator) ++t_left;
        while (*t_right < separator) --t_right;
        if (t_left<=t_right) {
            std::swap(*t_left,*t_right);
            ++t_left;
            --t_right;
        }
        if (left < t_right) Q_sort(left,t_right + 1);
        if (t_left < right) Q_sort(t_left + 1,right);
    }
}

但是当我传递迭代器

std::vector<int> for_sort(10);
Q_sort(std::begin(for_sort),std::end(for_sort));

并尝试通过它们找到它,我得到调试断言失败Expression: cannot seek vector iterator before begin

我想可能是因为 right 指向一个超出向量边界的值,但是这样的调用

Q_sort(std::begin(for_sort),std::end(for_sort)-1);

给出相同的结果。然后我尝试编写辅助函数

template <typename T,typename Alloc>
inline T* begin_ptr(std::vector<T,Alloc>& vec) {
    return vec.empty() ? nullptr : &vec[0];
}

template <typename T,typename Alloc>
inline T* end_ptr(std::vector<T,Alloc>& vec) {
    return vec.empty() ? nullptr :begin_ptr(vec)+vec.size();
}

但是有了这样的调用

std::vector<int> for_sort(10);
Q_sort(begin_ptr(for_sort),end_ptr(for_sort)-1);

我知道随机填充向量时,分隔符始终等于 1。我很乐意帮助您找出问题所在,谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)