微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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 举报,一经查实,本站将立刻删除。