Суть в том, что в C ++, в отличие от Pascal , функция возвращает значения с помощью оператора return
. В C ++ невозможно получить доступ к возвращаемому объекту через имя функции. В вашем коде:
v1[v1_index] = x;
v1
относится к самой функции, а не к возвращаемому объекту. Итак, код пытается получить доступ к функции v1
, если бы это был массив или вектор. Что не имеет смысла, и, следовательно, ошибка:
<source>: In function 'std::vector<int> v1(const std::vector<int>&, const std::vector<int>&)':
<source>:12:19: warning: pointer to a function used in arithmetic [-Wpointer-arith]
v1[v1_index] = x;
^
Чтобы получить требуемую функциональность, вам нужно определить возвращаемый объект и вернуть его в конце:
vector<int> v1(const vector<int> &v2, const vector<int> &v3) {
int v2_index = 0;
int v3_index = 0;
int v1_index = 0;
vector<int> ret;
for(int i=0; i < v3.size(); ++i) {
if(v2[v2_index] == v3[v3_index]) {
int x= v2[v2_index];
// Bug: out of bounds
ret[v1_index] = x;
++v1_index;
}
if (v2[0] != v3[0]) {
v2_index++;
}
v3_index++;
}
return ret;
}
Это компилируется, но у вас все еще есть критическая ошибка. Ошибка доступа к ret
за пределами. Лучшее решение - бросить v1_index
и просто позвонить push_back()
вместо этого:
int x= v2[v2_index];
ret.push_back(x);
Еще лучше - использовать цикл диапазона вместо всего беспорядка с переменными v3_index
. Это так же просто, как:
for (auto v3_element: v3) {
... your code goes here...
}
Нет необходимости поддерживать индексы и нет необходимости доступа к v3[...]
. Все это сделано для вас for
. К сожалению, вы не можете избавиться от v2_index
из-за того, как он увеличивается, но другие индексные переменные не нужны.