Wektory, wskaźniki a wczytywanie z pliku.

0

Cześć. Mam problem z wektorami.
Otóż, wczytuję z pliku dane:

// ///////////////////////////////////////////////////////////////////////////  //
//  ODCZYT BAZY STUDENTOW                                //
// ///////////////////////////////////////////////////////////////////////////  //
    ifstream odczyt;
    odczyt.open("students_database.txt");
    if (!odczyt) {
        cerr << "Blad przy otwieraniu pliku" << endl;
        return 1; // if this is main
    }
    Student temp;
    while (odczyt >> temp.imie >> temp.nazwisko >> temp.grupa >> temp.album) {
        student.push_back(temp);
    }
// ///////////////////////////////////////////////////////////////////////////  //
//              WYPISANIE STUDENTOW Z PLIKU TXT     //
// /////////////////////////////////////////////////////////////////////////// //
    cout << "\n[STUDENCI] LISTA:" << endl;
    cout << "NR ALBUMU IMIE NAZWISKO GRUPA\n" << endl;
    for (const auto &user : student) {
        cout <<
             user.album << ' ' <<
             user.imie << ' ' <<
             user.nazwisko << ' ' <<
             user.grupa << ' ' << endl;
    };

i teraz chciałabym mieć możliwość dodania na przykład nowego studenta.
W moich poprzednich zadaniach do nauki robiłam to w ten sposób - tutaj zadeklarowany jest dodatkowo wskaźnik, a wczytując z pliku - nie:

cout << "[INFO] PODAJ ALBUM:" << endl;
                    cin >> album;
                    for(vector<Student*>::iterator it1 = a->student.begin(); it1 != a->student.end(); it1++)
                    {
                        if((*it1)->album == album)
                        {
                            cout << "[ERROR] BLAD! ALBUM JEST JUZ W BAZIE DANYCH!" << endl;
                            break;
                        }

Jak - wczytując dane z pliku w wyżej wymieniony sposób, mogę na nich operować? Proszę o porady, dopiero przyswajam wektory.

0

vector<Student> != vector<Student*>, więc nie można używać iteratora jednego typu do porównania drugiego typu.
Opisz to trochę dokładniej. Sformatuj kod i wstaw więcej mówiące fragmenty.

Zrozumiałe z tego, że dodawany student może być już w bazie, więc nie powinien być dodany.
Do tego można użyć std::unordered_set, ale trzeba by dopisać operator== w klasie Student,
lub wykorzystać napisany już operator== i użyć go do przeszukania bazy funkcją std::find w vectorze.

0

Dane studenta z pliku (imię, nazwisko, grupa) przechowywane są kolejno w: temp.imie, temp.nazwisko, temp.grupa.
Posiadam wektor vector<Student> student.
W jaki sposób mogę działać na tych wczytanych danych? Np. jeśli chcę dodać nowego studenta to:

  1. chcę sprawdzić, czy student o podanym nr albumu istnieje - jeśli tak, kończę
  2. jeśli album się nie powtarza - chcę dodać studenta
    I jak teraz poruszać się po tych danych, bo nie mogę użyć wskaźnika?
1
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

class Student
{
   std::string name;
   int id;
public:
   Student(const std::string& name, int id)
      :name{ name }, id{ id } {}
   int GetId() const { return id; }
   std::string ToString() const { return name + ", " + std::to_string(id); }
};

int main()
{
   std::vector<Student> students{ {"tom", 2}, {"ala", 3} };
   Student tmp{ "tom", 2 };
   if (std::find_if(students.cbegin(), students.cend(), [&](auto const& el) {return el.GetId() == tmp.GetId(); }) == students.cend()) {
      students.push_back(tmp);
   }
   for (auto const& student : students) {
      std::cout << student.ToString() << '\n';
   }
} 
tom, 2
ala, 3

https://wandbox.org/permlink/6vbfGfGQyrj2VggV

a dla

Student tmp{ "jan", 1 };
tom, 2
ala, 3
jan, 1

https://wandbox.org/permlink/k7JNyfZ4yGwkr89y

1 użytkowników online, w tym zalogowanych: 0, gości: 1