기존의 vector
요소의 복사본을 두 번 삽입하려고합니다. 다음 코드는 이전 버전에서 작동하지만, 2010 년중복 요소를 벡터에 삽입하는 방법은 무엇입니까?
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.insert(test.begin(), test[0]);
cout << test[0] << " " << test[1] << " " << test[2] << endl;
return 0;
}
출력이 -17891602 1 2
입니다 비주얼 스튜디오에 실패 1 1 2
을 기대했다.
나는 그것이 일어나는 이유를 알아 냈습니다. 벡터가 재 할당되고 참조 점이 삽입 점에 복사되기 전에 유효하지 않게됩니다. 오래된 Visual Studio는 분명히 다른 순서로 작업을 수행 했으므로 정의되지 않은 동작의 한 가지 가능한 결과는 올바르게 작동하는 것임을 입증하고 의존할만한 것이 아님을 증명합니다.
이 문제를 해결하기위한 두 가지 방법이 있습니다.
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
비록 : 다른 유효한 남아있는 기준에 종속가 없습니다 있도록 참조에서 복사본을 만드는 것입니다
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
: 하나는 더 재 할당이 발생하지 있는지 확인 reserve
을 사용하는 것입니다 둘 다 작동하지만 어느 누구도 자연스러운 해결책을 느끼지 못합니다. 내가 빠진 것이 있습니까?
BTW vc11 dev 미리보기의 첫 번째 예는 '1 2 2'입니다. –
@ 제시, 놀라지 않습니다. '삽입 (insert)'의 Rvalue 과부하가 선택되어 버그로 수정되었을 수 있습니다. 코드는 그 오버로드와 const 참조를 취하는 것과 완전히 다릅니다. –
int로 캐스팅을 수행합니까? –