Как исправить ошибку в векторной операции C ++? - PullRequest
1 голос
/ 01 мая 2019

Функция f () в классе MapSquare работает правильно. Когда я добавляю другой класс MapTriple, он не работает. Функция f () в MapSquare должна найти квадрат элементов в векторе, а в MapTriple следует умножить 3 на все элементы.

MapGeneric - это базовый класс, который содержит функцию map (), которая является рекурсивной функцией для доступа к векторным элементам, а функция f () является чисто виртуальной функцией.

MapSquare и MapTriple - два производных класса, переопределяющих функцию f (), чтобы найти квадрат векторных элементов и умножить 3 на все векторные элементы.

MapSquare работает нормально ... но когда я добавляю MapTriple, происходит ошибка сегментации. Пожалуйста, помогите решить эту проблему.

#include<vector>
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

class MapGeneric
{
   public:
        virtual int f(int){};
        vector<int> map(vector<int>, int);
};
class MapSquare:public MapGeneric
{
   public: int f(int);

};
class MapTriple:public MapGeneric
{
   public: int f(int);
};
class MapAbsolute:public MapGeneric
{
   public: int f(int);
};
vector<int> MapGeneric::map(vector<int> v, int index)
{

   if(index>=1)
   {
      v[index]=f(v[index]);
      return map(v,index-1);
   }
   return v;

}
int MapSquare::f(int x)
{
   return x*x;
}
int MapTriple::f(int x)
{
 return 3*x;
}
int MapAbsolute::f(int x)
{
  return abs(x);
}
int main()
{
   //mapping square
   MapSquare ob;
   vector<int> L,L1,L2;
   for (int i = 1; i <= 5; i++) 
      L.push_back(i);
   L1=ob.map(L,sizeof(L));
   cout<<"Square  = ";
   for ( vector<int>::iterator i = L1.begin(); i != L1.end(); ++i) 
      cout << *i<<" ";

   //mapping triple
   MapTriple t;

   L2=t.map(L,sizeof(L));
   cout<<endl<<"Triple  = ";
   for(vector<int>::iterator i=L2.begin();i!=L2.end();++i)
     cout<<*i<<" ";

   return 0;
 }

1 Ответ

1 голос
/ 01 мая 2019

Ряд проблем здесь. Похоже, вы думаете, что индексы C ++ начинаются с 1, а не с нуля?

if(index>=1)
{
   v[index]=f(v[index]);
   return map(v,index-1);
}

Для меня это сразу выглядит неправильно, вы наверняка имеете в виду:

// use size_t for indices (which cannot be negative)
vector<int> MapGeneric::map(vector<int> v, size_t index)
{
  // make sure the index is valid!
  if(index < v.size())
  {
    v[index] = f(v[index]);
    return map(v, index - 1);
  }
  return v;
}

Во-вторых, оператор sizeof () не делает то, что вы ожидаете! Он возвращает размер std :: vector (который обычно составляет 24 байта в 64-битных системах - в основном 3 указателя). Вы должны использовать метод size () для определения длины массива.

// remember that indices are zero based, and not 1 based!
L1=ob.map(L, L.size() - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...