[英]Pointers and pass by reference c++
在我的主程序中,我調用了函數compute_entropy,並給了它一個像這樣的向量:float entropy = h.compute_entropy(input_pic [0],&Symbol_table);
在實現函數本身(在h.cpp中)中,我不應更改其采用的參數,即vector * prob。如何訪問prob的數據?
float compute_entropy(vector<Symbol>* prob)
{
float ent = 0;
vector<Symbol>* prob;
for (int i = 0; i < prob.size(); i++) //GIVES ERROR
{
ent += (prob.at(i).freq) * log2( 1 / (prob.at(i).freq) );
}
}
因為prob
類型是Vector<Symbol> *
,所以實際上您需要在訪問成員之前首先對其進行取消引用。 看起來像(*prob).at(i).freq
。
*(A).B
也可以寫為A->B
,因此可以代替(*prob).at(i).freq
來編寫(*prob).at(i).freq
prob->at(i).freq
。 (使用類似的參數, prob.size()
變為prob.size()
prob->size()
)
以更清潔的方式做
因為您從不更改向量的內容,所以可以使參數恆定。
float compute_entropy(const vector<Symbol>* prob)
現在我們知道指針是邪惡的 ,讓我們用引用替換指針。
float compute_entropy(const vector<Symbol> &prob)
{
float ent = 0;
for (int i = 0; i < prob.size(); i++) //GIVES ERROR
{
ent += (prob.at(i).freq) * log2( 1 / (prob.at(i).freq) );
}
}
調用此函數時,如果要使用vector調用,請從參數中刪除&
,如果使用矢量指針調用,請使用*
取消引用。
vector<Symbol>* prob;
for (int i = 0; i < prob.size(); i++) //GIVES ERROR
.....
因為prob是一個指針,所以您需要使用->運算符
for (int i = 0; i < prob->size(); i++)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.