Предположим, у нас есть вектор с именем 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%, что именно происходит.
Думаю, мы могли бы вообще избежать копирования, если бы вернули ссылку на вектор 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);
}
однако я хотел бы знать, что именно происходит в первом случае. Копируется ли что-нибудь? Даже в третьем случае мы возвращаем указатель, так что происходит какое-то копирование.
заранее спасибо
int getValue( int index ){ reutrn v[index]; }
- person olevegard   schedule 08.05.2013begin()
иend()
(или const_iterators) вектора. - person James Kanze   schedule 08.05.2013