"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 반복자를 통해 C++ std::set의 요소를 수정하는 것이 왜 나쁜 생각입니까?

반복자를 통해 C++ std::set의 요소를 수정하는 것이 왜 나쁜 생각입니까?

2024년 11월 24일에 게시됨
검색:991

Why is Modifying Elements in a C   std::set Through Iterators a Bad Idea?

C에서 집합 요소 수정의 의미

반복자를 통해 std::set의 요소를 수정하면 기본 요소의 동작에 대한 우려가 발생할 수 있습니다. 데이터 구조.

요소의 결과 수정

MSDN 문서에 따르면 집합에 저장된 값을 직접 편집하는 것은 권장되지 않습니다. 값을 수정하면 다음과 같은 이유로 예측할 수 없는 동작이 발생할 수 있습니다.

  • 세트 구현은 저장된 값을 정렬을 위한 키 값으로 사용합니다. 값을 변경하면 데이터 순서가 무효화됩니다.
  • 대부분의 구현에서는 레드-블랙 트리를 사용하여 데이터를 관리합니다. 요소를 명시적으로 제거하고 다시 삽입하지 않고 값을 수정하면 트리 내에서 요소의 위치가 잘못되어 검색 작업에서 잘못된 결과가 발생할 수 있습니다.

정의되지 않은 동작의 예

다음과 같은 가상의 예를 고려해보세요.

std::set mySet = {1, 2, 3};
auto it = mySet.find(1);

// Modify the value stored in the set
*it = 4;

이 시나리오에서 수정된 요소(값 4)는 레드-블랙 트리에서 잘못된 위치를 갖게 됩니다. 결과적으로 세트에 대한 후속 검색 작업이 실패하거나 잘못된 결과를 반환할 수 있습니다.

결론

std::set 객체의 무결성을 유지하려면 다음이 중요합니다. 저장된 값의 직접적인 수정을 방지합니다. 대신 기존 요소를 제거하고 원하는 값이 포함된 새 요소를 삽입하여 올바른 데이터 순서를 보장하고 정의되지 않은 동작을 방지하세요.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3