2

二分木を順番にたどる vector< int> があります。ここで、qsort を使用して並べ替えます。その後、ベクターの内容を出力しようとすると、実行時に以下のエラーが発生しました。

[main] C:\General_algorithms\binaryTreeToBST.exe 1000 (0) handle_exceptions
: Exception: STATUS_ACCESS_VIOLATION
[main] binaryTreeToBST 1000 (0) handle_exceptions: Dumping stack trace to binary
TreeToBST.exe.core

コードを以下に示します。

struct BinTreeNode
{
    int id;
    BinTreeNode *left;
    BinTreeNode *right;

    BinTreeNode(int a)
    {
        id=a;
        left=right=NULL;
    }
};

int compare (const void *a, const void *b)
{
    return ( *(int*)a - *(int*)b );
}

int main()
{
    BinTreeNode n10(10);
    BinTreeNode n2(2);
    BinTreeNode n7(7);
    BinTreeNode n8(8);
    BinTreeNode n4(4);
    n10.left=&n2;
    n10.right=&n7;
    n2.left= &n8;
    n2.right= &n4;

    cout<<"OK TILL HERE1"<<endl;
    vector<int> InTr= inorder(n10); //returns a vector containing the inorder traversal of the tree.
    cout<<"OK TILL HERE2"<<endl;

    if(InTr.size()!=0)
    qsort(&InTr, InTr.size(), InTr[0], compare);
    cout<<"OK TILL HERE3"<<endl; //THIS GETS PRINTED

    cout<<InTr[0];  //THIS DOESN'T GET PRINTED(Error occurs)
    for(int i=0;i<InTr.size();i++)
        cout<<InTr[i]<<endl;
         cout<<"OK TILL HERE4"<<endl; //THIS DOESN'T GET PRINTED
    return 0;
}
4

3 に答える 3

2
&InTr

- はベクトル オブジェクトのアドレスであり、実際のデータではありません。そのはず:

InTr.data() or &InTr[0]

3 番目の引数は次のようになります。

sizeof(InTr[0]),

グレートウルフが言ったように。

ところで、STL からの並べ替えの使用を検討してください。より「C++ 風」です。

http://www.cplusplus.com/reference/vector/vector/

http://www.cplusplus.com/reference/algorithm/sort/

于 2013-07-27T07:31:45.880 に答える
2

あなたはこれをしたくありませんが、これで問題が解決するかもしれません

qsort(&InTr[0], InTr.size(), sizeof(int), compare);

代わりにアルゴリズムのsort. qsort が遅い

于 2013-07-27T07:21:09.247 に答える
1

あなたの問題はあなたの使用から来ています:

qsort(&InTr, InTr.size(), InTr[0], compare);

3 番目の引数は、並べ替えられる要素のサイズを想定しています。ここで渡すのInTr[0]は明らかに間違っていintますsizeof(vector<int>::value_type)

の要素はそのベース アドレスから開始する必要がないため、最初のパラメータとして を使用すること&InTrも間違っています。std::vectorそのように vector を渡すことで、効果的にqsortclobber vector の内部状態を許可します。この時点で、ベクトルを使用しようとすると予測不能になります。幸いなことに、あなたの場合、アクセス違反が発生しました。

他の回答では、推奨されるアプローチについて既に言及されているため、ここでは繰り返しません。

于 2013-07-27T07:35:35.647 に答える