C++ STL 컨테이너를 사용할 때 어떤 조건에서 참조 값에 액세스해야합니까? 예를 들어 컨테이너에 대한 다음 함수 호출 후에 무효화 된 참조가 있습니까?STL 컨테이너의 지속 참조
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
vector.push_back (3);
vector[0] = 10; //modifies 0'th element
int& ref = vector[0];
ref = 10; //modifies 0'th element
vector.push_back (4);
ref = 20; //modifies 0'th element???
vector.clear();
ref = 30; //clearly obsurd
}
stl의 대부분의 구현에서 이것이 작동한다는 것을 알고 있지만 표준 선언에 필요한 것에 관심이 있습니다.
--edit : 나는 C에 대한 (http://stxxl.sourceforge.net/) 라이브러리 ++ STXXL을 원했고,하지만 난 컨테이너에 의해 반환되는 참조를 변경하지 않고, 따라서 호환되지 여러 읽기를 통해 지속되지 있었고, 실현 becuase 임 관심 (그러나 피상적 인) 내 기존의 stl 코드. 예 : 난 그냥이 그 STXXL 용기를 의미 있는지 알고 싶어
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
int& refA = vector[0];
int& refB = vector[1]; //refA is not gaurenteed to be valid anymore
}
경우 100 % 호환, 또는 실제로 나는 안전하지 않은/구현에 의존 방식으로 전체 시간을 STL 컨테이너를 사용하고 있었다면.
FAQ에 대한 관련 답변을 찾았습니다. http://algo2.iti.uni-karlsruhe.de/dementiev/stxxl/trunk/FAQ.html "외부 메모리 데이터 구조의 요소에 대한 참조를 전달하거나 저장해서는 안됩니다. 참조가 사용될 때 요소를 포함하는 블록은 더 이상 내부 메모리에 없을 수 있습니다. "따라서 대답은 NO입니다. 컨테이너 요소에 대한 참조는 STL과 동일한 동작을하지 않습니다. – Akusete
C++ 표준을 살펴보면 모든 컨테이너에는 기본 할당 자의 해당 typedef로 설정된 typedefs reference, const_reference, pointer 및 const_pointer가 있습니다. 표준위원회는 처음에는 refs와 포인터에 대한 추상화를 설정하여 프록시를 사용하여 컨테이너에서 (예 : 반복기가 이미있는 방식으로) 이러한 이벤트를 관리 할 수 있지만 중단 된 것처럼 보였습니다. 표준 할당 자'allocator :: pointer'는'T *'등으로 typedef 자체를 궁극적으로 무의미하다고 생각합니다. –
대부분의 STL 컨테이너의 인터페이스를 통해 읽음으로써 같은 감정을 갖게되었지만, 왜 그들이 절반 정도만 갔는지에 대한 토론을 찾을 수 없었습니다. – Akusete