2014-02-17 3 views
0

크기를 조정하거나 지우는 것이 더 효율적인 다음 코드에서?벡터에서 지우거나 크기를 조정하는 것이 더 빠릅니다.

vector<int> a(5000); 
//.... 
vector<int>::iterator it = remove(a.begin(),a.end(),8) 

a.resize(std::distance(a.begin(),it)); 
//or 
a.erase(it,a.end()); 

필자는 중복 된 요소의 수에 따라 다르다고 생각하십니까?

+1

데이터를 연속으로 유지하려면 '벡터'가 필요하기 때문에 두 가지 모두 최적치가 아닙니다. 적절한 컨테이너를 사용하지 않는다는 표시입니다. – Bathsheba

+4

@ Bathsheba 그것은 나에게 적절한 컨테이너처럼 보입니다. 일반적으로'std :: vector' (비 연관 컨테이너의 경우) 이외의 것을 사용해야하는 경우는 매우 드뭅니다. –

+0

아무 대답도 제공하지 않으므로 하나의 대답이 없습니다. 일반적으로, 한 번에 하나의 요소를 제거하려고 할 때, 대부분의 구현에서 본질적으로 같은 일을하는 제거 지우기 관용구를 사용하는 것이 더 효율적일 수 있습니다. 그러나 벡터를 분할하여 작동하므로 (각 일치를 첫 번째 파티션의 뒷면과 바꿔) 구현 및 사용법에 따라 대량 연속 제거를 수행하지 않을 수 있습니다. – kfsone

답변

1

"중복 요소의 수에 따라 달라지는 것 같습니까?"

아니. int에 대한 소멸자가 없으므로 복제본 1 개 또는 1000 개가 차이가 없습니다. 두 함수 중 필요한 것은 사용중인 요소의 새로운 끝에 대한 내부 레코드를 설정하는 것입니다. 결과적으로 remove()의 성능은 여기에 값 비싼 것이므로 resize/erase이 아닙니다. (그리고 소멸자가 있다고하더라도, 거의 동일한 시간이 걸리는 동일한 수의 요소를 반복합니다.)

거의 모든 노련한 표준 라이브러리 구현은 어리석은 일을하지 않고 필요 이상으로 오래 걸리지 않으므로 행동이 동일하다고 판단 할 때마다 (즉, 조크의 답변에 따라) 프로파일 러에서 말하는 것보다 더 자세히 조사 할 이유가 없습니다 너.

  • 그들은 그렇게 할 것을 일부 "크기"회원이 표준에서 요구되지 않지만이 iter != v.end() 반복자를 지원하는 실제로 매장에서 검토 한 모든 구현은 의미가 포인터를 "종료"업데이트하지 end()에 대한 느린 begin + size 산술 계산을하지 않고 포인터로 구현되거나 똑같이 추악한 특수 케이스를 사용하지 않으므로 end-1 반복기를 증가 시키면 일부 센티널 상태가 생성됩니다.
3

중복 수가 동일하면 동일한 복잡성을 갖습니다. 벡터를 축소하면 resizeerase의 관점에서 정의된다

n3337, 23.3.6.3 말한다을 :

void resize(size_type sz);

9 효과 : erase(begin() + sz, end())에 해당 sz <= size() 경우;. [...]

1

프로파일 러는 무엇을 말합니까? 이는 하나의 구현에서 다른 구현으로 명확하게 다를 수 있습니다 (단 인수 —이면 복잡성이 동일해야 함).

그 점에 관해서는 : 프로파일 러가 너무 많이 풀어 놓은 것을 보여줍니다. 시간은 여기에 있습니까? 이 글을 쓰는의 관용적 방법은 다음과 같습니다 프로파일 러가 명확 병목 것을 말한다, 당신 이 'C++ 프로그래머가 즉시 무슨 일이 일어나고 인식 있도록 관용적 인 방법으로 그것을 쓰고, 돈한다

a.erase(std::remove(a.begin(), a.end(), 8), a.end()); 

하지 않는 한 t 낭비 시간 당신이 똑같은 일을하고 있다는 것을 알고 왜 을 숙어로 사용하지 않았는지 궁금합니다.

관련 문제