指针和引用传递 C++

Pointers and pass by reference c++

在我的 main 中,我调用函数 compute_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.size() 变为 prob->size()

以更简洁的方式进行
因为您永远不会更改向量的内容,所以您可以使参数保持不变。

float compute_entropy(const vector<Symbol>* prob)

既然我们知道 指针是邪恶的,让我们用 reference.

替换指针
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)  );
    }
}

调用时,如果您使用矢量调用,请从参数中删除 &,如果您使用矢量指针调用,请使用 *.[=24 取消引用它=]

vector<Symbol>* prob;    
for (int i = 0; i < prob.size(); i++)  //GIVES ERROR
.....

因为prob是一个指针,所以需要使用->运算符

for (int i = 0; i < prob->size(); i++)