Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ vector.push_back不会导致正确的值被推回_C++_Vector_Push Back - Fatal编程技术网

C++ vector.push_back不会导致正确的值被推回

C++ vector.push_back不会导致正确的值被推回,c++,vector,push-back,C++,Vector,Push Back,我正在练习合并排序(用于面试准备)。我遇到了一个关于向量的非常奇怪的问题。似乎将某个值推回到向量上并不会导致该值实际被放在那里。我可能遗漏了一些明显的东西,但我不确定。下面是合并排序的代码(添加了一些print语句以了解出现了什么问题) 无效合并(标准::向量*vec,整数低,整数中,整数高){ printf(“正在进入合并(%d,%d,%d)\n)”,低、中、高; std::矢量辅助器; 对于(inti=low;i作为旁白,您可以通过引用而不是指针来传递vec,从而使代码更加干净。您应该尝试替

我正在练习合并排序(用于面试准备)。我遇到了一个关于向量的非常奇怪的问题。似乎将某个值推回到向量上并不会导致该值实际被放在那里。我可能遗漏了一些明显的东西,但我不确定。下面是合并排序的代码(添加了一些print语句以了解出现了什么问题)

无效合并(标准::向量*vec,整数低,整数中,整数高){ printf(“正在进入合并(%d,%d,%d)\n)”,低、中、高; std::矢量辅助器;
对于(inti=low;i作为旁白,您可以通过引用而不是指针来传递vec,从而使代码更加干净。您应该尝试替换
运算符[]
使用
at
确保索引有效。这应该很容易调试…您至少可以显示您的测试用例吗?这是两个函数,很好,但您没有显示如何调用它们以及输出是什么…问题是您不能使用索引
来访问帮助程序的索引从
0
开始,然后转到(包括)
high-low
。您需要重新计算
helperLow=0,helperMiddle=middle-low+1,helperHigh=high-low
(我可能会关闭一个)@dyp我在大约30秒前意识到了同样的事情,并回来报告。它现在运行得很好,非常感谢!
void merge(std::vector<int> *vec, int low, int middle, int high) {
    printf("Entering Merge(%d, %d, %d)\n", low, middle, high);
    std::vector<int> helper;
    for(int i = low; i <= high; ++i) {
        helper.push_back( (*vec)[i] );
    }
    std::cout << "Array being worked on: [";
    for(auto &p : helper) {
        std::cout << p << ", ";
    } std::cout << "]" << std::endl;

    int helperLeft = low, helperRight = middle + 1, vecIndex = low;
    while(helperLeft <= middle && helperRight <= high) {
        if(helper[helperLeft] <= helper[helperRight]) {
            (*vec)[vecIndex] = helper[helperLeft];
            ++helperLeft;
            std::cout << "Helper Left: " << helperLeft << std::endl; 
        }
        else {
            (*vec)[vecIndex] = helper[helperRight];
            ++helperRight;
            std::cout << "Helper Right: " << helperRight << std::endl;
        }
        ++vecIndex;
        std::cout << "Current Index: " << vecIndex   << std::endl;
    }

    // Copy over the remaining elements into the array
    while(helperLeft <= middle) {
        std::cout << "Entered Left Remaining" << std::endl;
        (*vec)[vecIndex] = helper[helperLeft];
        ++helperLeft;
        ++vecIndex;
    }

    while(helperRight <= high) {
        std::cout << "Entered Right Remaining" << std::endl;
        (*vec)[vecIndex] = helper[helperRight];
        ++helperRight;
        ++vecIndex;
    }
    std::cout << "Resulting Array: [";
    for(int i = low; i < high; ++i) {
        std::cout << (*vec)[i] << ", ";
    } std::cout << (*vec)[high] << "]" << std::endl;
    std::cout << std::endl;
}

void mergeSort(std::vector<int> *vec, int low, int high) {
    if(low < high) {
        int middle = (low + high) / 2;
        mergeSort(vec, low, middle);
        mergeSort(vec, middle + 1, high);
        merge(vec, low, middle, high);
    }
}

int main() {
    std::vector<int> array({2, 25, 1, 1, 5});
    mergeSort(&array, 0, array.size() - 1);
}