2013-05-29 55 views
2

傳遞我對C++相當新,我有一個關於通過引用傳遞元素的問題。 我定義下面的結構通過價值或參考使用struct

struct Point 
{ 
     bool isOnEnvelop; 
     double x, y; 
}; 

而下面的函數

vector<Point> convex_hull(vector<Point> P) 
{ 
     int n = P.size(), k = 0; 
     vector<Point> H(2*n); 

     for (int i = 0; i < n; i++) 
     { 
      // IF SOMETHING .... 
         P[i].isOnEnvelop = true; 
         H[k] = P[i] 
         k++ 
     } 

     H.resize(k-1); 
     return H; 
} 

具有主如下

main() 
{ 
    vector<Point> P; 
    // FILL P with Point and set Point.isOnEnvelop = false 
    vector<Point> H = convex_hull(P); 
} 

該算法是建立一組2D點的凸包空間。我希望能夠在P的元素上循環,以便能夠檢測這個點是否在凸包上(因此檢查P.at(i).isOnEnvelop) 不幸的是,在調用函數convex_hull。我應該通過引用來傳遞參數嗎?或者我應該創建P作爲Point *的矢量?

非常感謝您的幫助

文森特

+0

所以,如果我理解正確,你希望修改'P'在這次調用後反映在'main'中'convex_hull(P);' ?如果是這種情況,那麼只是按照這個'convex_hull(矢量&P)'的引用傳遞。 –

+0

是的:實際上在調用convex_hull(P)之後,我將循環P並在散點圖上繪製它們(如果點在H中,則使用不同的顏色,因此可以檢查P.at(i).isOnEnvelop) – Vincent

回答

4

你宣佈convex_hull的方式,參數被複制:

vector<Point> convex_hull(vector<Point> P){ ... } 

這通常是一個壞主意,因爲複製P可能很昂貴。另一種方法是,如果您想確保P本身未被修改,那麼將使用const參考。

如果在調用函數時(如在main修改修改P,你必須通過引用傳遞它,並聲明convex_hull如下(注意&):

vector<Point> convex_hull(vector<Point> &P){ ... } 
0

您可以change vector<Point> Pvector<Point> &P,這樣就可以修改矢量P.

0

所以閱讀您的評論後,根據需要進行更改,以P是在撥打convex_hull後反映在main之後,所以你應該只是通過參考如下:

std::vector<Point> convex_hull(std::vector<Point> &P) 

如果您不通過引用傳遞vector將被複制,副本將被修改而不是原來的。即使你不想修改你可以通過爲const參考原始取得不復制vector像這樣的好處是:

std::vector<Point> convex_hull(const std::vector<Point> &P) 
0

如果您數據將被修改,通過引用作爲參數或給出的值