c ++ вопрос: после присвоения значения переменной, другая переменная изменилась - PullRequest
0 голосов
/ 31 августа 2018

Следующие коды являются моим собственным API для предыдущей очереди индекса. Когда я проверяю функцию вставки, я получаю неправильный ответ. После отладки кодов я обнаружил, что значение массива qp изменилось после выполнения предложения: - item[k]=v, который находится в функции вставки. Почему значение массива qp изменилось после присвоения значения массиву item ?

template <class T>
class IndexPriorQueue{
private:
    int index;//the num of items
    int size;//capacity
    int* pq;//index binaryheap
    int* qp;//qp[pq[i]]=pq[qp[i]]=i
    T* item;//item array;
public:
    IndexPriorQueue(int qsize){//constructor function
        size=qsize;
        index=0;
        pq=new int(size+1);
        qp=new int(size+1);
        item=new T(size+1);
        for(int i=0;i<size+1;i++)
            qp[i]=-1;

    }
    void insert(int k,T v){
        if(contain(k)){
            cout<<"index is already in queue"<<endl;
            return;
        }
        //cout<<"insert"<<endl;
        item[k]=v;//debug,after excuting this sentence,the value of qp exchanged??
        pq[++index]=k;
        qp[k]=index;
        swim(index);
    }
    bool contain(int k){
        return qp[k]!=-1?1:0;
    }
    void swim(int j){
        while(j>1){
            if(item[pq[j/2]]<item[pq[j]]){
                exch(j/2,j);
                j=j/2;
            }else{
                break;
            }
        }
    }
    void exch(int m,int n){
        int temp=pq[m];
        pq[m]=pq[n];
        pq[n]=temp;
        qp[pq[m]]=m;
        qp[pq[n]]=n;
    }
    void display(){
        cout<<"item:";
        for(int i=1;i<size+1;i++){
            cout<<item[i]<<"  ";
        }
        cout<<endl;
        cout<<"pq:";
        for(int i=1;i<size+1;i++){
            cout<<pq[i]<<"  ";
        }
        cout<<endl;
        cout<<"qp:";
        for(int i=1;i<size+1;i++){
            cout<<qp[i]<<"  ";
        }
        cout<<endl;

    }
};

Следующие коды являются основной функцией

int main(){
    cout<<"before insert:"<<endl;
    IndexPriorQueue<char> ipq(10);
    ipq.display();
    ipq.insert(1,'a');
    cout<<"after insert:"<<endl;
    ipq.display();
    return 0;
}

1 Ответ

0 голосов
/ 31 августа 2018

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

new T(size+1)

Это выделяет один объект типа T и инициализирует его значением size + 1 (т. Е. Вызывает конструктор T с size + 1).

Если вам нужно выделить «массив», вы должны использовать квадрат скобки [], как в

new T[size+1]

Это выделит массив из size + 1 количества T объектов.

Тем не менее, гораздо лучшим решением будет использование std::vector вместо того, чтобы делать все вручную.

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