выделить элемент вектора на вектор - PullRequest
0 голосов
/ 02 сентября 2018

Это функция сегмента, которую я пишу:

vector<int> v1(const vector<int> &v2, const vector<int> &v3) {

  int v2_index = 0;
  int v3_index = 0;
  int v1_INDEX = 0;

  for(int i=0; i < v3.size(); ++i) {
    if(v2[v2_INDEX] == v3[v3_INDEX]) {
       int  x= v2[v2_INDEX];
       v1[v1_INDEX] = x;
       ++v1_INDEX;
     }
     if (v2[0] != v3[0]) {
       v2_INDEX++;
     }
     v3_INDEX++;
   }
}

Я должен использовать вектор как функцию. Если элемент v2 равен элементу v3, я хочу выделить один элемент (не дублировать; push_back или v2 [0] = v1 [0]) для вектора v1:

Я пробовал:

v1.push_back(v2.push_back(i));
v1[v1_INDEX] = v2[v2_index];
int x = v2[v2_index]; v1.push_back(x);
v1[v2[v2_index]];

Все они не компилируются. Почему я могу правильно выделить элемент v2 [i] для -----> v1 [i] без использования дополнительной библиотеки?

Я получаю ошибку ниже:

error: request for member ‘push_back’ in ‘v1’, which is of non-class type 

1 Ответ

0 голосов
/ 02 сентября 2018

Суть в том, что в 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 из-за того, как он увеличивается, но другие индексные переменные не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...