0

我对如何使用指针和向量指针来执行正确的操作感到困惑。

我想将 vector 的元素传递Vec给 struct function 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,您将需要在堆内实际使用该向量(或多或少地使用heapVecand minHeap2)或更改内部的向量Heap,使其不包含值,而是包含引用或指针。您不能拥有std::vectorof 引用,因此您将不得不使用指针:

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]); 

当然,这会给内部指针所指向的元素的生命周期带来一些问题,heapMembersmain()只要你注意制作.heapVecstd::vector<A*>

于 2012-11-28T08:22:49.893 回答