2

我有一个向量< 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

你不想这样做,但我想这可能会解决问题

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

而是使用算法的sort. qsort 比较慢

于 2013-07-27T07:21:09.247 回答
2
&InTr

- 是向量对象的地址,而不是实际数据。它应该是:

InTr.data() or &InTr[0]

第三个论点应该是:

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 回答
1

您的问题来自您的使用:

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

第三个参数期望被排序的元素的大小。在这里传入InTr[0]显然是错误的,因为它可以包含任何int可能不等于的值sizeof(vector<int>::value_type)

作为第一个参数的使用&InTr也是错误的,因为std::vector's 中的元素不必从其基地址开始。通过像这样传入向量,您可以有效地让qsortclobber 向量的内部状态。此时,尝试使用向量变得不可预测。幸运的是,您遇到了访问冲突。

其他答案已经提到了首选方法,所以我不会在这里重述。

于 2013-07-27T07:35:35.647 回答