假设我们有一个称为V
类型的向量,vector<int>
它是类的私有成员。
我们也有这个类的公共函数:
vector<int> getV(){ return V; }
现在,如果我有这个类的一个实例,我想做的就是读取值并找到向量内所有值的总和,
我可以这样说:
MyClass obj;
//update vector
size_t i, size;
size = obj.getV().size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += obj.getV().at(i);
}
或者我可以这样说:
MyClass obj;
//update vector
size_t i, size;
vector<int> myV = obj.getV();
size = myV.size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += myV[i];
}
在第二种情况下,我们将整个向量复制到向量myV
。但是,我不确定在第一种情况下到底发生了什么,我们是按原样使用向量还是每次调用函数时都实际复制向量getV()
?
如果没有发生复制,那么我相信第一个版本效率更高。
但是我不是 100% 到底发生了什么。
我想如果我们返回对 vector 的引用,我们可以完全避免进行任何复制V
。所以我们可以有以下功能:
vector<int>* getV { return &V; }
进而
MyClass obj;
//update vector
size_t i, size;
vector<int> * myV = obj.getV();
size = myV->size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += myV->at(i);
}
但是我想知道在第一种情况下到底发生了什么。有什么被复制的吗?即使在第三种情况下,我们也会返回一个指针,所以会发生某种复制。
先感谢您