2011-01-22 2 views
1

난 node_obj가 [노드] .c_max> 0 (I 체크)되어이STL 벡터 보호구

vector<int> tmp_color; tmp_color.reserve(node_obj[node].c_max); 
    for(int tmp_color_idx = 0; tmp_color_idx < node_obj[node].c_max; tmp_color_idx++) 
     tmp_color[tmp_color_idx] = tmp_color_idx; 

같은 정수의 벡터를 미리 할당하는 것을 시도 하였다. tmp_color의 크기는 for 루프 다음에 어쨌든 0 인 것처럼 보입니다. 코드에 문제가 있다면?

감사

답변

2

당신은 내가 다음과 같은 방법으로 제안 쓴 루프에서 할당을 확인하려면 :

vector<int> tmp_color(node_obj[node].c_max); 
for(int tmp_color_idx = 0; tmp_color_idx < node_obj[node].c_max; tmp_color_idx++) 
    tmp_color[tmp_color_idx] = tmp_color_idx; 
+0

+1 이것은 아마도 저자가 의도 한 것일 것입니다. – StackedCrooked

3

reserve 실제로 vector에 요소를 추가하지 않습니다; 그게 resize입니다. reserve은 그 (것)들을위한 공간을 다만 비축한다. 당신이 중 하나를 사용하여, 루프에 하나씩 요소를 추가해야

tmp_color.push_back(tmp_color_idx); 

또는 resizereserve의 사용을 변경합니다.

+2

즉,'reserve()'는 vector의 ** capacity **를 변경하는 반면,'resize()는 vector의 ** size **를 변경한다. ** 크기 **는 실제로 초기화 된 * 요소가 벡터에 몇 개 있는지를 나타내고 ** capacity **는 새로운 요소가 추가 될 때 다시 할당해야하기 전에 보유 할 수있는 요소의 최대 개수를 나타냅니다. 크기는 항상 용량보다 작거나 같습니다. –

1

당신은 그것을 충돌하지 않았다 오히려 운을.

tmp_color[tmp_color_idx] = tmp_color_idx; 

위의 줄에서 벡터의 범위를 벗어나 액세스하고 있습니다.

reserve()가 벡터 크기를 늘리지 않으면 resize()를 사용해야합니다. Elalfer에서 사용하는 방법은 크기를 미리 할당하는 것이 더 좋습니다.

+0

@In silico : Visual Studio impl을 보면 과부하 된 첨자 연산자가 max_size()가 아니라 size()를 검사합니다. reserve() 호출은 max_size()를 업데이트하지만 size()는 업데이트하지 않습니다. 따라서 operator []가 호출 될 때 충돌이 발생합니다. – bjskishore123

+0

죄송합니다. OP의 질문이 아니라 Elalfer의 대답을 읽었습니다. –