2016-09-09 5 views
0

여기에서 많은 부분을 검색했지만 저에게있어서 C++의 고급 초보자에게는 올바른 설명이 없습니다. 이전에 벡터의 구조체로 작업했는데 세그먼트 결함이 생겼습니다 ...C++ 구조체의 벡터를 초기화하는 올바른 방법

그와 같은 객체가 실제로 어떻게 작동하는지 그리고 내가 올바르게 수행하고 있는지를 알고 싶습니다. 나는 그것을 크기를 조정하고 값을 입력하기 전에

std::vector<numberOfSpecies> size; 

:

나는

struct numberOfSpecies { 
    int predator; 
    int prey1; 
    int prey2; 
}; 

같은 구조체과의 벡터를 가지고있다.

size.resize(100); 

실제로이 작업은 무엇입니까? 구조체에 적합한가?

size[t].predator=0; 
size[t].prey1=0; 
size[t].prey2=0; 

for(int k = 0; k < N; ++k){ 
    size[t].predator++; 
    size[t].prey1++; 
    size[t].prey2++; 
} 

이 바로인가 :이 제로로 초기화처럼 이

지금 나는이 같은 일을 오전 ... 보인다? 가능한 문제는 어디에 있습니까? 그것을 더 잘하는 방법?

+0

resize는 n 개의 구조체를 만듭니다. 그러나 디버그 모드를 사용하기 때문에 사고로 인해 초기화되지 않습니다. 당신이 그것을 사용하는 방법의 크기를 조정 한 후에 각 값이 임의의 정의되지 않은 값을 가지고 있다고 가정해야합니다. – Hayt

+0

돕기 위해 OK : 가치 란 무엇인가 't'입니까? 세분화 오류는 어디에서 발생합니까? 좀 더 많은 코드를 추가 할 수 있습니까? 가급적이면 http://stackoverflow.com/help/mcve 길에서 – Hayt

+0

@Hayt는 0시에 초기화가 확실한가요? 난 항상 크기를 개체의 생성자를 호출한다고 생각한다.이 경우, 모든 멤버를 0으로 설정하는 기본값이다. – Garf365

답변

3

여기 쉬운 '올바른'솔루션은

size.resize(100,{0,0,0}); //aggregate initialization 

for(int k = 0; k < N; ++k) 
{ 
    size[t].predator++; 
    size[t].prey1++; 
    size[t].prey2++; 
} 
같은 resize() (당신이 C++ 11과에 대한 액세스 권한이있는 경우) 집계 초기화와 벡터 객체에 속하는 기능, 무언가를 사용하는 아마

numberOfSpecies 개체의 모든 구성원은 0으로 초기화됩니다.

+2

"중간"대안은'reserve'와'push_back'입니다. 그러나 기본값으로 모든 것을 초기화하고 싶다면'resize'가 더 좋습니다. – Hayt

+0

'resize'의 두 번째 인자로'{0,0,0}'(상처를주지는 않지만)이 필요하다고 생각하지 않습니다. 기본적으로'std :: vector :: resize'는 default- 초기화, 집계의 경우 [zero-initialization]을 의미합니다 (http://en.cppreference.com/w/cpp/language/zero_initialization). – vsoftco

+0

@vsoftco 필자는 이유를 불문하고 구문을 보여주기 위해 멤버를 다른 값으로 초기화하거나 다른 사람이 질문을 조회하기 위해 포함 시켰습니다. – George

-1

기본 생성자를 구조에 추가 할 수 있습니다. 새 코드는 다음과 같습니다.

struct numberOfSpecies { 
    numberOfSpecies(): predator(0), prey1(0), prey2(0) { } // default constructor 
    int predator; 
    int prey1; 
    int prey2; 
}; 

그런 식으로 크기 조정을 적용하면 구조가 벡터 내부에서 올바르게 초기화됩니다.

+1

또는 C++ 11의 경우 : struct numberOfSpecies { int predator = 0; int prey1 = 0; int prey2 = 0; }; ' – Garf365

+2

'적절하게 초기화 됨 '에 따르면, 생성자 없이도 마찬가지입니다. 당신의 생성자는 오직 명시적인 0이지만,'resize' 명세에 따르면, 그것은 이미 올바르게 벡터 내부에서 0으로 초기화됩니다. 0 값이 아닌 다른 값을 원할 경우에만 유용합니다. – Garf365

+1

@ Garf365 또는 C++ 03 이상에서는이 경우에 아무런 차이가 없으므로 생성자를 그대로 두십시오. – juanchopanza

1

이 :

size[t].predator=0; 
size[t].prey1=0; 
size[t].prey2=0; 

sizet 번째 요소에 제로 쓸 것 - 또는 유용하지 않을 수 있습니다 :

을이 :

for(int k = 0; k < N; ++k){ 
    size[t].predator++; 
    size[t].prey1++; 
    size[t].prey2++; 
} 

t 일을 증가합니다 요소는 N 번 size입니다. 이것은 유용하지 않을 것 같습니다. 당신이 원하는 것 같아요 :

size[0].predator=0; // Technically not needed because .resize() 
size[0].prey1=0;  // will have initialized it to zero anyway 
size[0].prey2=0;  // *BUT* explicit is always better than implicit. 

// Initialize each element of size to be one greater than previous. 
for(int k = 1; k < N; ++k){ 
    size[k].predator = size[k-1].predator + 1; 
    size[k].prey1 = size[k-1].prey1 + 1; 
    size[k].prey2 = size[k-1].prey2 + 1;; 
} 
관련 문제