gtyoung2 Ответов: 1

Как я могу переписать цикл, чтобы использовать сопоставляется массив c++


Массив настраивается с помощью:

class Roster {
public:
	void add(string studentID, string firstName, string lastName, string email, int age, int daysInCourse1, int daysInCourse2, int daysInCourse3, Degree degreeProgram);
	void printAll();
	void printByDegreeProgram(int degreeProgram);
	void printDaysInCourse(string studentID);
	void printInvalidEmails();
	void remove(string studentID);
	~Roster();
	std::map<string, shared_ptr<Student> > classRosterArray;
};



void Roster::printAll()
{
    for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
        classRosterArray[i]->print();
    }
}

void Roster::printByDegreeProgram(int degreeProgram)
{
    for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
        if (classRosterArray[i]->fetchDegreeProgram() == degreeProgram) {
            classRosterArray[i]->print();
        }
    }
}

void Roster::printDaysInCourse(string studentID)
{
    float avg = 0;
    int max = 3;
    for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
        if (classRosterArray[i] != nullptr && classRosterArray[i]->fetchStudentId() == studentID) {
            int *daysInCourse = classRosterArray[i]->fetchDaysInCourse();
            for (int x = 0; x < max; x++) {
                avg += daysInCourse[x];
            }

            cout << "Student " << classRosterArray[i]->fetchStudentId() << "'s average number of days in each course is." << (avg / max) << "\n";
            break;
        }
    }
}

void Roster::printInvalidEmails()
{
    for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
        string email = classRosterArray[email]->fetchEmail();
        bool isValid = false;

        size_t found = email.find("@");
        if (found != string::npos) {
            found = email.find(".");
            if (found != string::npos) {
                found = email.find(" ");
                if (found == string::npos) {
                    isValid = true;
                }
            }
        }

        if (!isValid) {
            cout << email << " is not a valid email address \n";
        }
    }
}


Что я уже пробовал:

Первоначально он был настроен как массив, инициализированный nullptrs, который не работает в C++, как оказалось, для циклов прямого сравнения. Поэтому по чьему-то совету я переключился на карту, которая исправила одну из моих проблем, но позже сломала циклы classarray, и я точно не знаю, как их переписать, чтобы компенсировать это.


Любая помощь которую вы ребята можете оказать будет очень признательна

jeron1

что-то вроде этого?

for (int i = 0; i < classRosterArray.size(); i++)
{...
}

или попробуйте итераторы, что-то вроде,

Для (с std::карта::итератор IT = classRosterArray.начать(); к != classRosterArray.конец(); ++это)
{
...
}

1 Ответов

Рейтинг:
1

David O'Neil

Что-то вроде этого:

void Roster::printDaysInCourse(string studentID)
{
    float avg = 0;
    int max = 3;
    for (auto it : classRosterArray) {
      int *daysInCourse = it->second->fetchDaysInCourse();
      for (int x = 0; x < max; x++) {
         avg += daysInCourse[x];
      }
      cout << "Student " << it->second->fetchStudentId() << "'s average number of days in each course is." << (avg / max) << "\n";
   }
}


Но у вас есть проблема дизайна в том, что вы не можете иметь двух студентов с одинаковым именем в своем списке. Если вы настаиваете на карте, поставьте студенческий билет в качестве ключа, а не значения (
std::map<shared_ptr<Student>, string> classRosterArray;
Это решает проблему. Но я бы рекомендовал использовать вектор shared_ptrs или unique_ptrs вместо массива или карты, потому что вам не нужно использовать "первую" и "вторую" номенклатуру. Вы также можете вернуться к чему-то более близкому к вашему оригинальному дизайну и преодолеть проблему отсутствия дубликатов имен. Однако вам придется научиться использовать векторы и обновить свой класс реестра, чтобы правильно добавлять и удалять из вектора.