2015-05-09 2 views
-3

Я пытаюсь использовать функцию erase, чтобы удалить строку, которая является элементом вектора для домашнего задания. Я попытался линии двумя способами:Что не могу удалить значение, определенное пользователем из вектора?

  1. vectnames.erase(vectnames[blowup]);

  2. vectnames.erase(blowup);

Кто-нибудь знает, почему функция стирания не может работать? В качестве фона я должен разрешить пользователю вводить имя планеты в вектор, а также удалять его по имени. Пример, который я нашел в Интернете, использовал линию №2, но он не работает ...

Вот остальная часть моего кода для справки.

#include <iostream> 
#include <string> 
#include <cmath> 
#include <vector> 

using namespace std; 

class planet 
{ 
    private: 
     string n; 
     double d, m; 
    public: 
     void Density (double d, double m) 
     { 
      double Den = m/((4.0/3.0)*M_PI*pow((d/2.0), 3.0)); 
      cout<<"Density: "<<Den<<endl; 
     } 
     void SurfaceArea(double d) 
     { 
      double S = 4.0*M_PI*pow((d/2.0), 2.0); 
      cout<<"Surface Area: "<<S<<endl; 
     } 
     void Name (string n) 
     { 
      string N = n; 
      cout<<"Name: "<<N<<endl; 
     } 
     void Gravity (double G, double m, double d) 
     { 
      double F = G*m/pow((d/2.0), 2.0); 
      cout<<"Force of gravity: "<<F<<endl; 
     } 

}; 

int main() 
{ 
    const double G=6.67384e-11; 
    int c=0; 
    string n, N, blowup; 
    double d=0.0, m=0.0, Den=0.0, S=0.0, F=0.0; 
    vector<string> vectnames; 
    vector<double> vectdiam; 
    vector<double> vectmass; 

    do 
    { 
     cout<<"1. Add a planet\n"; 
     cout<<"2. Delete planet\n"; 
     cout<<"3. Find planet (by name)\n"; 
     cout<<"4. List all planets\n"; 
     cout<<"5. Sort (alphabetical order)\n"; 
     cout<<"6. Quit\n"; 
     cout<<endl; 
     cout<<"Please select an option from the menu above."<<endl; 
     cin>>c; 
     cout<<endl; 

     if(c==1) 
     { 
      planet red; 

      cout<<"Enter the planet's name: "; 
      cin>>n; 
      cout<<"Enter the planet's diameter: "; 
      cin>>d; 
      cout<<"Enter the planet's mass: "; 
      cin>>m; 
      cout<<endl; 

      vectnames.push_back(n); 
      vectdiam.push_back(d); 
      vectmass.push_back(m); 

      red.Name(n); 
      red.Density(d, m); 
      red.SurfaceArea(d/2.0); 
      red.Gravity(G, m, d); 
      cout<<endl; 


     } 
     else if (c==2) 
     {   
      cout<<"Fire the Death Star's superlaser at: "<<endl; 
      cin>>blowup; 

      vectnames.erase(vectnames[blowup]); //This is the part that I'm having trouble with 

      for (int i=0; i<vectnames.size(); i++) 
      { 
       cout<<vectnames[i]<<endl; 
      } 

     } 

     else if (c==4) 
     { 
      for (int i=0; i<vectnames.size(); i++) 
      { 
       planet red; 
       cout<<"Planet name: "<<vectnames[i]<<endl; 
       cout<<"Planet diameter: "<<vectdiam[i]<<endl; 
       cout<<"Planet mass: "<<vectmass[i]<<endl; 
       red.Density(vectdiam[i], vectmass[i]); 
       red.SurfaceArea(vectdiam[i]/2.0); 
       red.Gravity(G, vectmass[i], vectdiam[i]); 
       cout<<"************************"<<endl; 
       cout<<endl; 
      } 
     } 


    } while (c!=6); 

    system("pause"); 

    return 0; 
} 
+0

Ваш класс 'planet' не использует ни один из элементов данных, и эти три вектора должны быть одним контейнером класса, содержащего эти три свойства (например, ваш класс' planet'). Если вам нужно удалить по имени, рассмотрите карту от имен к планетам. – chris

+0

@chris, который будет моим следующим вопросом - если я удалю название планеты, как я могу гарантировать, что его данные также будут удалены? _ Как перенести три вектора в «один контейнер»? Кроме того, я думал, что я использовал данные memebers, потому что мои функции void используют частные переменные 'n, d и m'. – heyheythere

+0

http://stackoverflow.com/questions/30135646/how-do-i-create-a-vector-that-the-user-can-keep-adding-values-to-between-menu-ch u спросил его снова здесь, –

ответ

0

Я буду работать с vector<planet> planets;, потому что у него есть хорошее кольцо к нему, и это цель настолько близка к очевидна, так как я могу получить без использования идиотски длинное имя как VectorOfPlanets.

Чтобы удалить элемент из вектора, вы должны знать, где он находится. Существует множество способов сделать это из грубой силы, ища вектор в цикле до тех пор, пока вы не найдете индекс нужного элемента, а затем вызовите planets.erase(planets.begin + index);

Я думал, что произошла перегрузка std::find, вы можете передать функцию компаратора , но похоже, что я на трещине. Рад, что я не сделал себе задницу, предложив это. Подождите ... Я громко пишу? Дерьмо. Ненавижу это, когда я это делаю.

Прочитайте, как создать метод operator= в классе планеты, и вы можете использовать std::find. С его помощью вы можете:

vector<planet> planets; 
vector<planet>::iterator it; 

it = std::find(planets.begin(), planets.end()); 
if (it != planets.end()) 
{ 
    planets.erase(it); 
} 
Смежные вопросы