c++ - 为什么 vector 迭代器指向越界?

标签 c++ algorithm c++11 recursion mergesort

我正在研究一种递归合并排序算法,一个迭代器越界。我很肯定我的问题的根源是我的算法有缺陷,但我花了好几天时间研究它,我就是看不到我的失误。我不知道该往哪个方向走。比我更有经验/更聪明的人可以看看吗? (带驱动程序的完整程序可在 Github here 上获得。)

输出是:

before: 50 5 40 10 30 15 20 20 10 25 
after : -1808873259 5 10 10 15 20 20 25 30 40 50 
/*      ^  
 *      Extra recursive call, and out-of-bounds.
 */

明确地说,我只能返回一个 T 类型的 vector ,在本例中为 int,但我从 this post 了解到使用 void 函数更好。

template <typename T>
vector<T> mergesort(typename vector<T>::iterator begin, typename vector<T>::iterator end){
    vector<T> newVector;
    if (begin!=end){
        vector<T> tmp1;
        vector<T> tmp2;
        typename vector<T>::iterator mid1 = begin;
        typename vector<T>::iterator mid2 = begin;

        long origDistance = distance(begin,end);
        long endOfRange1 = origDistance/2;
        long begOfRange2 = endOfRange1+1;

        advance(mid1,endOfRange1);
        advance(mid2,begOfRange2);

        tmp1 = mergesort<T>(begin,mid1);
        tmp2 = mergesort<T>(mid2,end);

        //"merge()" is from the STL, link in comments. 
        merge(tmp1.begin(),tmp1.end(),tmp2.begin(),tmp2.end(), back_inserter(newVector));

    } else {
        newVector.push_back(*begin);
    }
    return newVector;
}

最佳答案

begin == end 时,您取消引用 begin。那是未定义的行为。可能您需要 if (origDistance == 1) 然后 push_back 单个元素并返回。

关于c++ - 为什么 vector 迭代器指向越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37129327/

相关文章:

c++ - 安全分割功能

c++ - 检测到任何使用 OpenProcess 的程序?

algorithm - 如何确保在三消游戏关卡中目标进球不是不可能的?

c++ - 在编译时确定 Eigen3 矩阵的存储顺序

c++ - 带有移动端的前向迭代器()

c++ - 错误 : assignment of member ‘x::x’ in read-only object

c++ - 使用 python 正则表达式从 C++ 源中提取命名空间

java - 数据结构设计设计

c++ - 高效的子阵列 (2D) 访问

c++ - cpp 文件中的部分特化不是 "well-formed"