2012-02-29 64 views
0

在以下情況下,sortMyVectors的參數列表如何顯示,以及如何從myFunction內部調用它?將矢量傳遞給函數(指針/地址)

std::vector<Vector2> myFunction (MyObj * myObj) { 

    std::vector<Vector2> myVectors; 
    // fill with lots of Vector2(double x, double y) objects 

    sortMyVectors(???-myVectors, ???-myObj); 

    return myVectors; 
} 


void sortMyVectors(vector<Vector2> &myVectors, const MyObj &myObj) { 

    // sort the std::vector using myObj 
    // modifies order of Vector2s within the passed-in myVectors 
    // does not modify myObj 
    // need to be able to access with myVectors[0].x here... 
} 

這就是所謂的方法是myFunction(&(*myObj));,其中myObjlist<MyObj>::iterator。有沒有更清晰的方式來寫這個?

+3

沒什麼特別的:'sortMyVectors(myVectors,* myObj);''myVectors'是一個變量,所以你可以直接將它傳遞給一個引用; 'myObj'是一個指針,所以你需要解除引用它才能與'MyObj&'兼容。 – dasblinkenlight 2012-02-29 18:34:40

+0

你會得到什麼錯誤? – dasblinkenlight 2012-02-29 18:46:05

+0

Thx爲解釋。但是,我得到這個錯誤:「未定義引用sortMyVectors(std :: vector <_Vector2,std :: allocator <_Vector2>>&,MyObj&)'」 – Ben 2012-02-29 18:48:27

回答

2
sortMyVectors(???-myVectors, ???-myObj); 

答:

sortMyVectors(myVectors, *myObj); 

,因爲它似乎你有一些基本的麻煩現在有了指針(並且我懷疑這是某種作業的做法),但它可能會有點過於強烈,不足以建議你學習迭代器,但你應該稍後再研究一下與std::sort這將是很難打敗任何手動排序。

作爲一種嘗試,以提高你的指針的理解:

MyObj* myObjPtr = ...; 

這是一個指針。它指向一個內存地址。假設它指向一個有效的,我們能做到這一點:

MyObj& myObjRef = *myObjPtr; 

現在我們取消引用的指針來獲得指針對象,並將其分配給一個參考,這也是像一個指針,但隱藏的指針/指針對象的區別(不需要operator *來訪問pointee /被引用的對象)。

在迴應評論你做:

The "sorting" basically sorts these vectors by their distance from another vector, but only in a particular case, so I don't know if there is a standard way of doing that..

的std ::排序接受了嚴格的弱序謂詞(基本上是一個函數或函數對象基於是否部件1 < element2的返回真/假)。例如:

bool length_is_less(const string& str1, const string& str2) 
{ 
    return str1.size() < str2.size(); 
} 

vector<string> my_strings = ...; 
sort(my_strings.begin(), my_strings.end(), length_is_less); 

上面的代碼基於他們從最短的字符串最長的字符串的長度,而不是默認的行爲(默認操作<執行字符串)排序字符串由字符串命令(對它們進行排序不分先後,粗暴地說話)。

鑑於這種定義自己的比較對象謂詞的能力,基本上可以使用std::sort對任何條件進行排序。

+0

Thx的解釋,快速的問題,如果一個構造函數有一個參數'const MyObj&myObj',我怎麼能然後將它分配給一個數據成員MyObj * myObj(這與你在上面解釋的相反)?或者我應該也更改數據成員? – Ben 2012-02-29 20:01:32

+0

@Ben簡化答案:你不能,因爲你的const引用是隻讀的,MyObj *是可變的。這會違反常量安全的要點,以防止您不小心修改您不想要的東西。如果它是常量MyObj *,那麼你可以這樣做:const MyObj * myObjPtr =&myObjRef; – stinky472 2012-02-29 20:15:08

+0

@Ben粗略地說,它是操作符&從指針到指針,操作符*從指針到指針。 – stinky472 2012-02-29 20:16:02

2

不要重新排序,使用std::sort它允許您傳入謂詞對象,如MyObj,只要它有operator()來進行排序。它使用迭代器而不是容器,它提供了更多的靈活性。

+0

「排序」基本上將這些向量與其他向量的距離排序,但僅限於特定情況下,所以我不知道是否有標準方式來做這件事......但是,我的問題是我需要投入的指針? – Ben 2012-02-29 18:38:25

0

如果你只是想myFunction的調用sortMyVectors傳遞MyObj中和myVectors,請執行下列操作:

std::vector<Vector2> myFunction (MyObj * myObj) { 

     std::vector<Vector2> myVectors; 
     // fill with lots of Vector2(double x, double y) objects 

     sortMyVectors(myVectors, myObj); 

     return myVectors; 
    } 


    void sortMyVectors(vector<Vector2> &myVectors, const MyObj *myObj) { 

     // Check for null pointer of myObj 
     // sort the std::vector using myObj 
     // need to be able to access with myVectors[0].x here... 
    } 
+0

那麼,我現在使用的引用,這樣我不需要做空指針檢查;) – Ben 2012-02-29 19:23:17