2012-09-28 6 views
4

나는이 무고한보고있는 코드가 다소 위험하다는 생각에 맞습니까? 몇 가지 답변을 읽은 후벡터에 삽입

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), v.back()); 
} 

일부 해명 .. 잘

정말 즉 .. 벡터에 요소를 삽입하지만 원리를 질문 더미 상황을 만들어하는 방법을 요구하고 있지 않다 당신을

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), T(v.back())); 
} 
+7

'const' 참조에'insert'를 호출 할 수 없으므로 컴파일되지 않습니다. 그것은 당신이 위험하다고 생각하는 것입니까? –

+2

'typename T'도 컴파일해야합니다. – Benj

+1

당신은'뒤로'와'끝'을 혼동하지 않습니다? 그것의 쉬운 실수지만 코드의 의미를 완전히 바꾼다 – jozefg

답변

1

이를 만들기 위해 코멘트에서 언급 한 두 점을 해결된다고 가정 : 사본을 (여기에 임시가 생성됩니다 .. 임시로 const를 참조가 살고 보장) 할 필요가있다 생각 컴파일하고, 이것은 실행하고 실행하지만 가바를 떠날 것입니다. 벡터 값이 참조을 반환하기 때문에 vector.back()이 실행될 때마다 벡터의 앞쪽에있는 Ge 값을 반환합니다. 그것은 또한 첫 번째 요소이다 있도록

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), v.end() - 1, v.end()); 
} 

이 안전하게 벡터의 마지막 요소를 삽입합니다 .... 즉 원하는되었다고 가정 : 할 노력은 다음과 같습니다 무엇

는 다음과 행동.

2

그것은) (저 위험뿐만 때문에 vector.back 보인다 참조를 반환하고, 벡터의 끝 이외의 위치에

삽입은 위치 벡터의 단부 사이의 모든 요소를 ​​이동시킴으로써 수행 내가 오해하지 않는 한 새로운 위치로하고, 더 재 할당이 그렇지 않은 마지막 요소를 포함 할 수있는 일이없는 경우 insert에 전달 참조 ("무효"가, (here에서) 새로운 요소 (들)

를 삽입 그러나 이전, oth 어쨌든 그것은 여전히 ​​맞을 수도 있지만 보장되지는 않습니다.

일부 옵티마이 저는 버그를 숨길 수도 있습니다 (객체에서 발생하지는 않지만 프리 머 티브에서 발생할 수 있음) 예상 결과를 얻을 수 있지만 일반적으로 이러한 동작에 의존하지는 않습니다.