0

ポインタとベクトルポインタを使用して正しい操作を実行する方法について混乱しています。

Vecベクトルの要素を構造体関数に渡したいupdateHeapupdateHeapこれらのメンバーの値を変更します。以下のコードでは、この結果を完全に達成することはできません。問題をよりよく説明するために、コードのセクションにコメントを付けました。

#include <vector>
#include <iostream>

struct A
{
    A() : hLoc(100){}
    A(int av, int bv):a(av),b(bv),hLoc(100){}

    int a, b;
    int hLoc;
};

struct Heap
{
    Heap() : heapMembers(new std::vector<A>) {}

    Heap(std::vector<A> *members) : heapMembers(members) {}

    void updateHeap(unsigned int idx)
    {
        (*heapMembers)[idx].a*=2;   
    }

    std::vector<A> *heapMembers; //ptr
};

int main()
{
    std::vector<A> aVec;  
    //I want to use updateHeap function in struct Heap to modify values of select elements of aVec


    A a0(2,5), a1(4,2), a2(8,4);  
        aVec.push_back(a0); aVec.push_back(a1); aVec.push_back(a2); 
        //Here I initialized aVec


    Heap minHeap1;
    //In minHeap1, I want to add elements one by one

    minHeap1.heapMembers->push_back(aVec[1]); 
    //I added a selected element (aVec[1]) in aVec to the heap; 
    minHeap1.updateHeap(minHeap.heapMembers->size()-1); 
    //I want to modify the value of aVec[1].a by calling updateHeap function
    std::cout << aVec[1].a << "\n";
    //Output: 4 , I want this value to be 2*4=8. 

    std::vector<A> heapVec;  
    heapVec.push_back(a1);

    Heap minHeap2(&heapVec);
    //In minHeap2, I want to give it a vector of selected elements
    minHeap2.updateHeap(minHeap2.heapMembers->size()-1);
    //I want to modify the value of aVec[1].a by calling updateHeap function
    std::cout <<    aVec[1].a << "\n";
    //Output: 4 , I want this value to be 2*4=8.
    std::cout << heapVec[0].a << "\n";
    //Output: 8 , This is the right answer, but I want aVec[1].a to take upon this value

    delete minHeap1.heapMembers;

    return 0;
}
4

1 に答える 1

0

あなたの問題はvector::push_back()、プッシュされた要素をベクターにコピーすることです。参照などをプッシュしません。だから後:

minHeap1.heapMembers->push_back(aVec[1]);

(*minHeap1.heapMembers)[0]のコピーになりますaVec[1]。これを ( で行うようにHeap::updateHeap()) 変更すると、オリジナルではなくコピーが変更されます。

aVecを介して変更できるようにしたい場合はminHeap1、実際にヒープ内でそのベクトルを使用するか (多かれ少なかれ と で行うことheapVec) minHeap2、内部のベクトルを変更してHeap、値ではなく参照またはポインタを含むようにする必要があります。参照を持つことはできないstd::vectorため、ポインターを使用する必要があります。

struct Heap
{
    Heap() : heapMembers(new std::vector<A*>) {}

    Heap(std::vector<A*> *members) : heapMembers(members) {}

    void updateHeap(unsigned int idx)
    {
        (*heapMembers)[idx]->a*=2;   
    }

    std::vector<A*> *heapMembers; //ptr
};

そして、あなたのmain()関数で:

minHeap1.heapMembers->push_back(&aVec[1]); 

もちろん、これは 内のポインターによって指される要素の寿命にいくつかの問題を引き起こしheapMembersますmain()heapVecstd::vector<A*>.

于 2012-11-28T08:22:49.893 に答える