gpt4 book ai didi

c++ - push_back 不向 vector c++ 添加数字

转载 作者:行者123 更新时间:2023-11-28 07:46:25 25 4
gpt4 key购买 nike

我正在尝试调试我的合并排序程序,当我尝试使用“push_back”将 vector “left”或“right”中的值添加到“mergedList”时,它似乎在“merge”函数内部某处出现问题”。以下是gdb调试 session 的摘录(下面是我的完整程序代码)

这发生在第一次调用 merge 时;我能够使用“print left[0]”访问“vector left”的值,我得到了一个我期望的值( vector “left”中的所有数字都在 1-50000 之间),但是在执行行之后i = 0 时的代码:

“mergedList.push_back(left[i]);”然后用调试器打印mergedList[0],貌似添加left[0]不成功。

我是不是误解了 push_back?或载体?抱歉,如果我的问题不清楚——请告诉我如何改进它!


GDB 调试 session :


(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;
}

最佳答案

此代码缺少错误检查,但应该仍然有效。我认为这个逻辑应该没问题。您是否尝试调试此代码,因为它没有生成已排序的 put。最后,当您对元素进行排序时,您打印的不是已排序的元素,而是您阅读的元素。

因为您的 gdb session 具有 vector 中指针的非空值,即 _M_start = 0x7fff5fbfdbf0, _M_finish = 0x7fff5fbfdc68, _M_end_of_storage = 0x7fff5fbfdb90 这有元素被插入 vector 。因此,文件必须打开并成功读取。

关于c++ - push_back 不向 vector c++ 添加数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com