2012-01-25 2 views
1

수행하는 동안 왜 런타임 오류가 점점 오전은 :어설 션 오류 표준에 대한 표준 : copy_if를 사용하는 동안 : 벡터

std::vector<int> vi; 
std::generate_n(std::back_inserter(vi),10,rand); 

std::vector<int> vi_1; 
vi_1.reserve(vi.size()); 
std::copy_if(vi.begin(),vi.end(),vi_1.begin(),std::bind2nd(std::greater<int>(),-20000)); 
//Here (in copy_if) I'm getting assert error. 
+0

무엇이 오류 메시지입니까? – blubb

+1

'vi_1.reserve (vi.size());가 아니라'vi_1.reserve (vi.size());'가 필요합니까? – dasblinkenlight

답변

2

Reserve는 실제로 벡터를 주어진 한도까지 증가시키는 모든 호출이 O (1)이 될 것이라는 것을 보장하는 객체를 실제로 생성하지 않습니다. resize을 사용하십시오.

+1

reserve와 std :: back_inserter (vi_1) –

+2

을 사용할 수도 있습니다. 쓸데없는 값을 만들지 않기 위해'reserve'를 유지하고'back_inserter'를 사용한다고 생각한다면. –

+0

'push_back'은'reserve (n)'이 없어도 amortized O (1)이 보장됩니다. 'reserve'는 벡터가'n'보다 커질 때까지 재 할당을 보장하지 않습니다. 이것은 두 가지 중요한 영향을 미칩니다. O (1)의 상수 요소는 실제로 상수 (상각 된 상수가 아닌)이며 매우 작습니다. 반복자, 참조 또는 이미 존재하는 요소에 대한 포인터는 무효화됩니다. –

1

vi_1.reserve 단지 메모리를 예약하지만 벡터의 실제 크기를 변경하지 않습니다. 이를 위해서는 resize을 사용해야합니다.

+0

실제로 나는 정정했다. –