0

「push_back」を使用してベクトル「左」または「右」から「mergedList」に値を追加しようとすると、「マージ」関数内のどこかで問題があるように思われるマージソートプログラムをデバッグしようとしています。以下は、gdb デバッグ セッションからの抜粋です (その下に私の完全なプログラム コードが続きます)。

これは、merge の最初の呼び出しで発生します。「print left[0]」を使用して「vector left」の値にアクセスでき、期待どおりの値を取得できました (「left」ベクトルのすべての数値は 1 ~ 50000 です)。 i = 0 の場合のコード:

"mergedList.push_back(左[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;
}
4

1 に答える 1

1

このコードにはエラー チェックがありませんが、それでも動作するはずです。このロジックはうまくいくはずだと思います。ソートされたアウトプットを生成していないため、このコードをデバッグしようとしましたか。最後に要素をソートすると、ソートされた要素ではなく、読み取った要素が出力されます。

gdb セッションには、ベクトル内のポインターに null 以外の値があるため、つまり、_M_start = 0x7fff5fbfdbf0, _M_finish = 0x7fff5fbfdc68, _M_end_of_storage = 0x7fff5fbfdb90これにはベクトルにプッシュされた要素があります。したがって、ファイルを開いて正常に読み取る必要があります。

于 2013-02-10T21:28:12.313 に答える