Вектор инициализации структур

51

Я хочу знать, как я могу добавить значения в свой вектор структур с помощью метода push_back

struct subject
{
  string name;
  int marks;
  int credits;
};


vector<subject> sub;

Итак, как я могу добавить в него элементы?

У меня есть функция, которая инициализирует имя строки (имя темы для нее)

void setName(string s1, string s2, ...... string s6)
{
   // how can i set name too sub[0].name= "english", sub[1].name = "math" etc

  sub[0].name = s1 // gives segmentation fault; so how do I use push_back method?

  sub.name.push_back(s1);
  sub.name.push_back(s2);
  sub.name.push_back(s3);
  sub.name.push_back(s4);

  sub.name.push_back(s6);

}

Вызов функции

setName("english", "math", "physics" ... "economics");
  • 1
    другие средства векторной инициализации: stackoverflow.com/questions/4155845/vector-of-structures
  • 0
    эй, я добавил новый ответ, пожалуйста, посмотрите на это
Теги:
struct
vector
push-back

3 ответа

68
Лучший ответ

Создайте векторный элемент push_back, а затем измените его так:

struct subject {
    string name;
    int marks;
    int credits;
};


int main() {
    vector<subject> sub;

    //Push back new subject created with default constructor.
    sub.push_back(subject());

    //Vector now has 1 element @ index 0, so modify it.
    sub[0].name = "english";

    //Add a new element if you want another:
    sub.push_back(subject());

    //Modify its name and marks.
    sub[1].name = "math";
    sub[1].marks = 90;
}

Вы не можете получить доступ к вектору с [#], пока в векторе этого индекса не будет существовать элемент. Этот пример заполняет [#], а затем изменяет его.

  • 1
    subject.resize(2); может быть немного более быстрым и более ясным решением ... или даже vector<subject> sub(2); ,
  • 1
    Да я согласен. :) Я не думал, что он вполне поймет, как перераспределение для эффективности и как вектор растет в размерах - это больше похоже на проблему введения в c ++.
Показать ещё 3 комментария
36

Если вы хотите использовать новый текущий стандарт, вы можете сделать это:

sub.emplace_back ("Math", 70, 0);

или

sub.push_back ({"Math", 70, 0});

Для них не требуется построение по умолчанию subject.

8

Вы не можете получить доступ к элементам пустого вектора по индексу.
Всегда проверяйте, что вектор не пуст, и индекс действителен при использовании оператора [] на std::vector.
[] не добавляет элементы, если ни один не существует, но вызывает Undefined Поведение, если индекс недействителен.

Вы должны создать временный объект своей структуры, заполнить его и затем добавить в вектор, используя vector::push_back()

subject subObj;
subObj.name = s1;
sub.push_back(subObj);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню