구조체 초기화로 구성된 벡터
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
'code' 카테고리의 다른 글
이미지 처리 : 폐색이란 무엇입니까? (0) | 2020.11.20 |
---|---|
StackPanel에 컬렉션 바인딩 (0) | 2020.11.20 |
SQL 날짜 선택 (0) | 2020.11.20 |
fileExistsAtPath : 존재하는 파일에 대해 NO 반환 (0) | 2020.11.20 |
Ruby on Rails 콘솔에서 내 명령 기록을 기억하도록 할 수 있습니까? (0) | 2020.11.20 |