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