2016-11-18 1 views
0

벡터를 깊게 지우는 방법?C++ STL 벡터 깊은 지우기

다음 코드를 고려하십시오.

#include<algorithm> 
#include<iostream> 
#include<iterator> 
#include<vector> 

using namespace std; 

int main(){ 
    vector<int> v {1,2,3,4,5}; 
    for_each(begin(v),end(v),[&v](int& n){ 
     static auto i = (int)0; 
     if(n == 2){ 
      v.erase (begin(v) +2, end(v)); 
     } 
     cout << n << " having index " << i++ << endl; 
    }); 
    v.erase (begin(v) +2, end(v)); 
    cout << v.size() << endl << v[4] << endl; 
} 

출력은

1 having index 0 
2 having index 1 
3 having index 2 
4 having index 3 
5 having index 4 
2 
4 

나는 [내가] 어떤 난 2에서 4가 오류가 발생하는 무효 및 컴파일러되기 위해서는 V의 액세스하고 원하는 것은.

간단한 단어로 깊은 지우기 방법은 무엇입니까?

+2

그것은 UB입니다. 혼자서 확인해야합니다. 또는 대신'std :: vector :: at'를 사용하십시오. – songyuanyao

+0

벡터는 정의에 의해 연속적인 메모리에 요소를 저장하므로 원하는 것은 없습니다. – user463035818

+1

그리고 컴파일 타임 오류가되기를 원합니다. – LogicStuff

답변

1

정의되지 않은 동작이 트리거되므로 결과를 신뢰할 수 없습니다. 당신이 경계가

std::vector::at

vector<int> v{ 1,2,3,4,5 }; 
v.erase(begin(v) + 2, end(v)); 
try { 
    auto val = v.at(4); 
} catch (std::out_of_range&) { 
    cout << "out of range"; 
} 
를 사용하기 위해 자신의 시설이나 해결 방법을 코딩하지 않는 한 확인해야하는 경우

, 당신은 std::vector와 같은 컴파일 시간 체크를 할 수 없습니다. 더 많은 정보와 몇 가지 제안은 여기에 있습니다 : https://stackoverflow.com/a/32660677/1938163

+0

연산자 []과 메소드에서 액세스하는 것의 차이점은 무엇입니까? – kalpa

+0

@calpa'at'는 바운드 체크를하지 않고 범위를 벗어난 경우 런타임 예외를 throw합니다 –

+0

'[]'을 사용하여 벡터에 액세스하는 것은 나쁜 습관입니까? – kalpa

1

저는 예제를 제공 할 시간이 없지만, 이것을 확실히 수행 할 수있는 유일한 방법은 사용자 정의 클래스를 랩핑하거나 서브 클래 싱하여 벡터로 만드는 것입니다. 그런 다음 특정 인덱스에 오류가 발생하는 사용자 정의 []at 연산자를 생성 할 수 있습니다. 이 금지 된 목록에 indeces를 추가하는 삭제 방법을 사용할 수도 있습니다.

이제 컴파일 타임에 오류가 발생하면이 작업이 더 어려워집니다. 나는 constexpr 액세스 연산자와 일부 static_assert을 사용하여 무언가가 가능할 수도 있다고 생각하지만 정확히 어떻게 손을 떼지는 자신이 아닙니다.

+0

'operator [] '가 UB를 산출하고 범위 검사를하지 않으면 왜 허용됩니까? 또한'at '는'operator []'에 비해 성능 오버 헤드를 추가합니까? 그렇다면 얼마나 중요합니까? – kalpa

+0

@kalpa 답글의 두 번째 문장이 첫 번째로 답하고, []는에서와 같이 천천히, 정확히 천천히 달려있다. 그러나 나는 3-10 번 실행하는 것으로 추측한다. – Vality

+0

'erase' 또는'clean' 메서드를 호출 할 때 또 다른 것은 메모리가 할당 해제되었거나 전체 벡터가 소멸 될 때까지 할당 해제되지 않았습니까? – kalpa