연관 컨테이너에서 객체의 키를 변경하는 것은 끔찍한 생각이지만, 표준에서 내가 그렇게하는 것을 정확히 금지하고 있는지 궁금합니다. 고려 :왜 연관 컨테이너의 키를 수정하지 않습니까?
#include <map>
#include <memory>
struct X { int i; };
struct lt
{
bool operator()(const std::shared_ptr<X>& lhs,
const std::shared_ptr<X>& rhs) const
{
return lhs->i < rhs->i;
}
};
int main()
{
std::map< std::shared_ptr<X>, int, lt > m;
auto x = std::make_shared<X>();
x->i = 1;
m.insert(std::make_pair(x, 2));
x->i = 42; // change key wrt the container!
}
나는 위의 이 불법해야한다고 생각하지만, 지금은 약간의 시간에 대한 표준을 읽고 있던 나는 실제로 이 불법하게 아무것도 찾을 수 없습니다. 어디 있니? 아니면 미래의 결함 보고서에 숨어 있습니까?
std :: map에는 트리 내부 구조가 있습니다. 키를 수정하면 내부 구조가 올바르지 않고 잘못된 경로로 이동하기 때문에 검색이 작동하지 않습니다. – Felics
@Felics : 그것은 질문이 아니 었습니다. –
S. Meyers의 "Effective STL"에는이 문제에 대한 전체 장이 나와 있습니다 (항목 22 참조). 재미있는 점은 맵의 내부 구조를 뒤 틀리는 것은 어렵지만 (맵의 요소 유형은'pair'입니다.), 그 일종의 앨리어싱을 사용해야합니다. ** 매우 난파하기 쉽습니다 ** set과 multiset을 가지고 있습니다. 왜냐하면'it'이 (multi) set :: iterator 일 때'* it'에 할당 할 수 있기 때문입니다. –
shakurov