Итак, у меня есть эта проблема. У меня есть два объекта, и мне нужно сравнить данные в каждом из них, проблема в том, что когда я вызываю функцию, я должен отправить оба из них, но мой учитель хочет, чтобы я сделал это, чтобы я мог отправить любой объект на него и вектор будет обновлен, а не создан заново. Текущая функция:
vector <Muziejus> atrinktiTinkamus(Bakalauras A, Bakalauras B, string R, int m)
{
vector <Muziejus> X;
for (int i = 0; i < A.imtiK(); i++){
if (A.imtiEksponata(i).imtiRusi() == R && A.imtiEksponata(i).imtiKAmz() > m){
X.push_back(A.imtiEksponata(i));
}
}
for (int i = 0; i < B.imtiK(); i++){
if (B.imtiEksponata(i).imtiRusi() == R && B.imtiEksponata(i).imtiKAmz() > m){
X.push_back(B.imtiEksponata(i));
}
}
return X;
}
Как видите, я отправляю оба объекта, зацикливаю их, получаю то, что хочу, и отправляю вектор обратно. Хотя мне нужно, чтобы он был универсальным, как будто я отправляю один объект, текущий вектор обновляется, а затем возвращается, промывается и повторяется. Как мне это сделать?
Ваш код почти идиоматичен в стиле C ++ 11, если вы только измените его для передачи больших типов, таких как A
, B
а также R
от const&
vector <Muziejus> atrinktiTinkamus(Bakalauras const& A, Bakalauras const& B, string const& R, int m)
{
vector <Muziejus> X;
// code reading from A and B, writing to X
return X; // moved, not copied in C++11
}
auto someX = atrinktiTinkamus(someA, someB, someR, someM);
Кажется, ваш учитель хочет, чтобы вы использовали «out-параметры» в стиле C ++ 98, которые вы передаете по ссылке следующим образом:
void // no return type
atrinktiTinkamus(
Bakalauras const& A, Bakalauras const& B, string const& R, int m,
vector<Muziejus>& X // by reference
)
{
// code reading from A and B, writing to X
}
vector<Muziejus> someX;
atrinktiTinkamus(someA, someB, someR, someM, someX);
Если вы не используете повторно someX
переменная, то стиль C ++ 11 короче и идиоматичнее. Однако, если вы можете использовать повторно someX
(и особенно динамически распределяемая память std::vector
), тогда может быть выигрыш в производительности при использовании стиля C ++ 98.
НОТА: для полноты, есть даже третий стиль (на самом деле, вариант второго стиля), который использует указатель вместо ссылки
void // no return type
atrinktiTinkamus(
Bakalauras const& A, Bakalauras const& B, string const& R, int m,
vector<Muziejus>* X // by pointer
)
{
// code reading from A and B, writing to X
}
vector<Muziejus> someX;
atrinktiTinkamus(someA, someB, someR, someM, &someX);
Согласно некоторым руководствам по стилю (Google, например), передача адреса переменной (&someX
в этом случае) облегчает обнаружение с сайта вызова, когда переменная модифицируется функцией.
Других решений пока нет …