""왼쪽의 벡터 중 하나에서 값을 추가하기 위해 "push_back"을 사용하려고하면 "병합"함수의 어딘가에서 문제가되는 것처럼 보이는 mergesort 프로그램을 디버그하려고합니다. 또는 "mergedList"에 "right"를 입력하십시오. 다음은 gdb 디버깅 세션에서 발췌 한 내용입니다 (그 아래에있는 전체 프로그램 코드가 이어짐)push_back 벡터에 숫자를 추가하지 않고 C++
이것은 첫 번째 호출에서 병합됩니다. "vector left"값을 "print left [0]"을 사용하여 접근 할 수 있었고 기대했던 값을 얻었다. (벡터 왼쪽의 숫자는 모두 1에서 50000 사이). 코드가 i = 0 인 경우 :
"mergedList.push_back (left [i]);" 디버거를 사용하여 mergedList [0]을 인쇄하면 left [0]을 추가하는 것이 실패한 것처럼 보입니다.
나는 push_back을 오해하니? 또는 벡터? 미안 내 질문이 명확하지 않은 경우 - 개선 방법을 알려주십시오.
GDB 디버깅 세션 :
(gdb) print left[0]
$1 = (int &) @0x100104760: 14108
(gdb) print mergedList[0]
$2 = (int &) @0x7fff5fbfdbf0: 1066800
(gdb)
(gdb) info locals
t = 0
i = 0
mergedList = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x7fff5fbfdbf0,
_M_finish = 0x7fff5fbfdc68,
_M_end_of_storage = 0x7fff5fbfdb90
}
}, <No data fields>}
j = 0
sizeOfLeft = 1
sizeOfRight = 1
next = 1
(gdb)
-uuu:**-F1 *gud-p1* Bot L28 (Debugger:run)--------------------------------------
------------------------------------------------------------------------------------------------------------------
while (iss >> n)
{
v.push_back(n);
}
}
return v;
}
vector<int> merge(vector<int> left, vector<int> right){
int i = 0;
int j = 0;
int sizeOfLeft = left.size();
int sizeOfRight = right.size();
vector<int> mergedList;
while (i < sizeOfLeft || j < sizeOfRight){
if (i < sizeOfLeft && j < sizeOfRight){
if (left[i] < right[j]) {
mergedList.push_back(left[i]);
=> i++;
}else{
mergedList.push_back(right[j]);
j++;
-uu-:---F1 main.cpp 21% L47 (C++/l Abbrev)--------------------------------------------------------------------------------------------------------------------------------------------------------
#COMPLETE MERGESORT PROGRAM
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
vector<int> getNums(){
ifstream infile("/Users/christinedeist/Documents/Algorithms/Practice/TestProject/IntegerArray.txt");
string line;
vector<int> v;
while (getline(infile, line))
{
istringstream iss(line);
int n;
while (iss >> n)
{
v.push_back(n);
}
}
return v;
}
vector<int> merge(vector<int> left, vector<int> right){
int i = 0;
int j = 0;
int sizeOfLeft = left.size();
int sizeOfRight = right.size();
vector<int> mergedList;
while (i < sizeOfLeft || j < sizeOfRight){
if (i < sizeOfLeft && j < sizeOfRight){
if (left[i] < right[j]) {
mergedList.push_back(left[i]);
i++;
}else{
mergedList.push_back(right[j]);
j++;
}
}else if (i < sizeOfLeft){
mergedList.push_back(left[i]);
i++;
}else if (j < sizeOfRight){
mergedList.push_back(right[j]);
j++;
}
}
return mergedList;
}
vector<int> sortVector(vector<int> nums){
int sizeOfNums = nums.size();
if (sizeOfNums == 1){
return nums;
}
vector<int> left;
vector<int> right;
int midpoint = sizeOfNums/2;
for (int i = 0; i < midpoint; i++){
left.push_back(nums[i]);
}
for (int j = midpoint; j < sizeOfNums; j++){
right.push_back(nums[j]);
}
left = sortVector(left);
right = sortVector(right);
return merge(left, right);
}
int main (int argc, char *argv[]) {
vector<int> nums = getNums();
vector<int> sorted = sortVector(nums);
for(int i = 0; i < nums.size(); i++){
cout << nums[i] <<endl;
}
return 0;
}
파일을 성공적으로 열 었는지 확인하십시오. –
디버거를 사용하십시오 ... –
'left [0]'을 추가하기 전에'mergedList'에 아무 것도 추가되지 않았 음을 확인할 수 있습니까? 즉, 첫 번째 반복에서 '오른쪽'[j]가 떠났을 가능성이 있습니까? – chrisaycock