функция — Как создать глобальный вектор в переполнении стека

Итак, у меня есть эта проблема. У меня есть два объекта, и мне нужно сравнить данные в каждом из них, проблема в том, что когда я вызываю функцию, я должен отправить оба из них, но мой учитель хочет, чтобы я сделал это, чтобы я мог отправить любой объект на него и вектор будет обновлен, а не создан заново. Текущая функция:

    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;
}

Как видите, я отправляю оба объекта, зацикливаю их, получаю то, что хочу, и отправляю вектор обратно. Хотя мне нужно, чтобы он был универсальным, как будто я отправляю один объект, текущий вектор обновляется, а затем возвращается, промывается и повторяется. Как мне это сделать?

0

Решение

Ваш код почти идиоматичен в стиле 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 в этом случае) облегчает обнаружение с сайта вызова, когда переменная модифицируется функцией.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]