вектор времени выполнения & lt; int & gt; STATUS_ACCESS_VIOLATION

У меня есть вектор< 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;
}

2

Решение

Вы не хотите делать это, но я думаю, что это может решить проблему

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

Вместо этого используйте алгоритм sort. qsort медленнее

2

Другие решения

&InTr

— это адрес векторного объекта, а не фактические данные. Так должно быть:

InTr.data() or &InTr[0]

И третий аргумент должен быть:

sizeof(InTr[0]),

как сказал великий волк.

Кстати, рассмотрите возможность использования сортировки из STL, это больше «C ++ ‘ish».

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

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

2

Ваша проблема исходит от использования вами:

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

Третий аргумент предполагает размер сортируемого элемента. Проходя в InTr[0] здесь явно неправильно, так как он может содержать любое значение для int что скорее всего не будет равным sizeof(vector<int>::value_type),

Использование &InTr в качестве первого параметра также неверно, так как элементы в std::vectorНе нужно начинать с базового адреса. Проходя в векторе, вы эффективно qsort внутреннее состояние вектора клоббера. На этом этапе попытка использовать вектор становится непредсказуемой. К счастью, в вашем случае вы получили нарушение прав доступа.

В других ответах уже упоминается предпочтительный подход, поэтому я не буду здесь его повторять.

1
По вопросам рекламы [email protected]