У меня есть вектор< 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;
}
Вы не хотите делать это, но я думаю, что это может решить проблему
qsort(&InTr[0], InTr.size(), sizeof(int), compare);
Вместо этого используйте алгоритм sort
. qsort медленнее
&InTr
— это адрес векторного объекта, а не фактические данные. Так должно быть:
InTr.data() or &InTr[0]
И третий аргумент должен быть:
sizeof(InTr[0]),
как сказал великий волк.
Кстати, рассмотрите возможность использования сортировки из STL, это больше «C ++ ‘ish».
Ваша проблема исходит от использования вами:
qsort(&InTr, InTr.size(), InTr[0], compare);
Третий аргумент предполагает размер сортируемого элемента. Проходя в InTr[0]
здесь явно неправильно, так как он может содержать любое значение для int
что скорее всего не будет равным sizeof(vector<int>::value_type)
,
Использование &InTr
в качестве первого параметра также неверно, так как элементы в std::vector
Не нужно начинать с базового адреса. Проходя в векторе, вы эффективно qsort
внутреннее состояние вектора клоббера. На этом этапе попытка использовать вектор становится непредсказуемой. К счастью, в вашем случае вы получили нарушение прав доступа.
В других ответах уже упоминается предпочтительный подход, поэтому я не буду здесь его повторять.