code

구조체 초기화로 구성된 벡터

codestyles 2020. 11. 20. 09:00
반응형

구조체 초기화로 구성된 벡터


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");

벡터, 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;
}

해당 인덱스의 벡터에 요소가 존재할 때까지 [#]을 사용하여 벡터에 액세스 할 수 없습니다. 이 예제는 [#]을 채운 다음 나중에 수정합니다.


새로운 현재 표준을 사용하려면 다음과 같이 할 수 있습니다.

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

또는

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

기본 구성이 필요하지 않습니다 subject.


첨자로 빈 벡터의 요소에 액세스 할 수 없습니다.
에서 []연산자 를 사용하는 동안 항상 벡터가 비어 있지 않고 인덱스가 유효한지 확인하십시오 std::vector.
[]요소가 없으면 추가하지 않지만 인덱스가 유효하지 않으면 정의되지 않은 동작 이 발생합니다 .

구조의 임시 객체를 생성하고 채운 다음이를 사용하여 벡터에 추가해야합니다. vector::push_back()

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

이와 같은 상황에 대해 중괄호 초기화 목록에서 집계 초기화를 사용할 수도 있습니다.

#include <vector>
using namespace std;

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

int main() {
    vector<subject> sub {
      {"english", 10, 0},
      {"math"   , 20, 5}
    };
}

그러나 때로는 구조체의 멤버가 그렇게 간단하지 않을 수 있으므로 컴파일러에게 형식을 추론하는 데 도움을 주어야합니다.

그래서 위에서 확장합니다.

#include <vector>
using namespace std;

struct assessment {
    int   points;
    int   total;
    float percentage;
};

struct subject {
    string name;
    int    marks;
    int    credits;
    vector<assessment> assessments;
};

int main() {
    vector<subject> sub {
      {"english", 10, 0, {
                             assessment{1,3,0.33f},
                             assessment{2,3,0.66f},
                             assessment{3,3,1.00f}
                         }},
      {"math"   , 20, 5, {
                             assessment{2,4,0.50f}
                         }}
    };
}

assessment중괄호 이니셜 라이저에가 없으면 유형을 추론하려고 할 때 컴파일러가 실패합니다.

The above has been compiled and tested with gcc in c++17. It should however work from c++11 and onward. In c++20 we may see the designator syntax, my hope is that it will allow for for the following

  {"english", 10, 0, .assessments{
                         {1,3,0.33f},
                         {2,3,0.66f},
                         {3,3,1.00f}
                     }},

source: http://en.cppreference.com/w/cpp/language/aggregate_initialization


After looking on the accepted answer I realized that if know size of required vector then we have to use a loop to initialize every element

But I found new to do this using default_structure_element like following...

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

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

int main(){
  subject default_subject;
  default_subject.name="NONE";
  default_subject.marks = 0;
  default_subject.credits = 0;

  vector <subject> sub(10,default_subject);         // default_subject to initialize

  //to check is it initialised
  for(ll i=0;i<sub.size();i++) {
    cout << sub[i].name << " " << sub[i].marks << " " << sub[i].credits << endl;
  } 
}

Then I think its good to way to initialize a vector of the struct, isn't it?

참고URL : https://stackoverflow.com/questions/8067338/vector-of-structs-initialization

반응형