поиск в наборе записей / обновление значения - PullRequest
0 голосов
/ 18 апреля 2019

Я создал набор записей, используя структуры, вектор и добавил пару записей.Это код, который делает это.Это должно работать как есть - на Arduino / ESP8266 / ESP32.

#include <string>
#include <vector>

struct student {

  std::string studentName; // I only load this once at startup. So can be const
  std::string studentSlot; // <= This should be updateable
  bool wasPresent;         // <= This should be updateable

  student(const char* stName, const char* stSlot, bool stPresent) :
    studentName(stName),
    studentSlot(stSlot),
    wasPresent(stPresent)
  {}
};

std::vector<student> studentRecs;

void setup() {
  delay(1000);

  Serial.begin(115200);

  // Add couple of records
  student record1("K.Reeves", "SLT-AM-03", false);
  student record2("J.Wick", "SLT-PM-01", true);

  studentRecs.push_back(record1);
  studentRecs.push_back(record2);
}

void loop() {

  Serial.println();

  // Get the size
  int dsize = static_cast<int>(studentRecs.size());

  // Loop, print the records
  for (int i = 0; i < dsize; ++i) {
    Serial.print(studentRecs[i].studentName.c_str());
    Serial.print(" ");
    Serial.print(studentRecs[i].studentSlot.c_str());
    Serial.print(" ");
    Serial.println(String(studentRecs[i].wasPresent));
  }

  // Add a delay, continue with the loop()
  delay(5000);
}

Я могу читать отдельные записи, используя цикл for.Я не уверен, что это лучший способ, но он работает.

Мне нужно иметь возможность сделать пару вещей с этим набором записей.

1) Поиск / найти запись по studentName.Я могу найти его по циклу, но это кажется мне неэффективным и уродливым.

2) Уметь обновлять studentSlot и wasPresent

С некоторыми исследованиями и экспериментами я обнаружил, чтоЯ мог бы сделать это, чтобы изменить wasPresent

studentRecs[0].wasPresent = false;

Опять же, я не уверен, что это лучший способ, но он работает.Я хочу иметь возможность изменить studentSlot, и я не уверен в этом, поскольку я впервые имею дело со структурами и вектором.StudentName является постоянным (мне нужно только загрузить его один раз при запуске), где studentSlot может измениться во время выполнения.Я не уверен, как это изменить.Может потребоваться, чтобы я удалил const char *, сделал что-то вроде strcpy или что-то еще, но я застрял в этом.Короче говоря, есть 3 вещи, которые мне нужно немного помочь по

1) Поиск / найти запись по studentName

2) Уметь обновлять studentSlot

3) Удалить всезаписи. Примечание: Я только что понял, что studentRecs.clear() делает это

Я не уверен, что смог объяснить это достаточно ясно.Так что любые вопросы, пожалуйста, стреляйте.Спасибо.

1 Ответ

2 голосов
/ 18 апреля 2019

Ну, я думаю, что вам лучше всего пойти с циклом for для поиска studentName. В зависимости от того, какую версию C ++ вы используете:

student searchForName(const std::string & name)
{
    for (auto item : studentRecs)
    {
        if (item.studentName == name)
            return item;
    }
    return student();
}

или если вы ограничены до C ++ 11:

student searchForName(const std::string & name)
{
    for (std::size_t cnt = 0; cnt < studentRecs.size(); ++cnt)
    {
        if (studentRecs[cnt].studentName == name)
            return item;
    }
    return student();
}

Остальное очень похоже.

Кстати: вы можете изменить:

...
  // Get the size
  int dsize = static_cast<int>(studentRecs.size());

  // Loop, print the records
  for (int i = 0; i < dsize; ++i) {
...

до:

...
  // Loop, print the records
  for (std::size_t i = 0; i < studentRecs.size(); ++i) {
...
...