C ++ STL에서 const_iterator와 non-const 반복자의 차이점은 무엇입니까?
a const_iterator
와 an 의 차이점은 무엇 iterator
이며 어디에서 다른 것을 사용합니까?
const_iterator
지시하는 값을 변경할 수 없습니다 iterator
.
C ++의 모든 것과 마찬가지로 const
정기적 반복자를 사용해야 할 합당한 이유가없는 한 항상 선호 합니다 (즉 const
, 지정된 값을 변경 하지 않는다는 사실을 사용하고 싶습니다 ).
그들은 거의 자명해야합니다. 반복자가 T 유형의 요소를 가리키는 경우 const_iterator는 'const T'유형의 요소를 가리 킵니다.
기본적으로 포인터 유형과 같습니다.
T* // A non-const iterator to a non-const element. Corresponds to std::vector<T>::iterator
T* const // A const iterator to a non-const element. Corresponds to const std::vector<T>::iterator
const T* // A non-const iterator to a const element. Corresponds to std::vector<T>::const_iterator
const 반복자는 항상 같은 요소를 가리 키므로 반복자 자체 는 const입니다. 그러나 가리키는 요소는 const 일 필요는 없으므로 가리키는 요소를 변경할 수 있습니다. const_iterator는 const 요소를 가리키는 반복자이므로 반복자 자체를 업데이트 (예 : 증가 또는 감소) 할 수 있지만 가리키는 요소는 변경할 수 없습니다.
불행히도, STL 컨테이너의 많은 메소드 는 const_iterators 대신 반복자 를 매개 변수로 사용합니다. 따라서 const_iterator 가 있다면 "이 반복자가 가리키는 요소 앞에 요소를 삽입하십시오"라고 말할 수 없습니다 (이러한 것은 개념적으로 const 위반이 아니라고 생각합니다). 어쨌든 그것을 원한다면 std :: advance () 또는 boost :: next ()를 사용하여 비 const 반복자로 변환해야합니다 . 예 : boost :: next (container.begin (), std :: distance (container.begin (), the_const_iterator_we_want_to_unconst)) . 경우 컨테이너 A는 표준 : : 목록 , 그 호출에 대한 실행 시간이 될 것입니다 O (n)을 .
따라서 "논리적"인 곳에 const를 추가하는 보편적 인 규칙은 STL 컨테이너와 관련하여 덜 보편적입니다.
그러나 부스트 컨테이너는 const_iterator를 사용합니다 (예 : boost :: unordered_map :: erase ()). 부스트 컨테이너를 사용할 때 "const agressive"가 될 수 있습니다. 그건 그렇고, STL 컨테이너가 언제 고쳐질 지 아는 사람이 있습니까?
가능하면 const_iterator를 사용하고 다른 선택이 없을 때는 iterator 를 사용하십시오 .
최소 예
비 const 반복자를 사용하면 그들이 가리키는 것을 수정할 수 있습니다.
std::vector<int> v{0};
std::vector<int>::iterator it = v.begin();
*it = 1;
assert(v[0] == 1);
Const 반복자는하지 않습니다 :
const std::vector<int> v{0};
std::vector<int>::const_iterator cit = v.begin();
// Compile time error: cannot modify container with const_iterator.
//*cit = 1;
상술 한 바와 같이 v.begin()
되어 const
과부하 및 반환하거나 iterator
또는 const_iterator
용기 변수 CONST 다움에 따라 :
const_iterator
팝업이 나타나는 일반적인 경우 this
는 const
메서드 내에서 사용될 때 입니다 .
class C {
public:
std::vector<int> v;
void f() const {
std::vector<int>::const_iterator it = this->v.begin();
}
void g(std::vector<int>::const_iterator& it) {}
};
const
하게 this
만드는, CONST this->v
CONST.
일반적으로로 잊어 버릴 수 auto
있지만 반복자를 전달하기 시작하면 메소드 서명에 대해 반복자를 생각해야합니다.
const 및 non-const와 마찬가지로 non-const에서 const로 쉽게 변환 할 수는 있지만 다른 방법은 아닙니다.
std::vector<int> v{0};
std::vector<int>::iterator it = v.begin();
// non-const to const.
std::vector<int>::const_iterator cit = it;
// Compile time error: cannot modify container with const_iterator.
//*cit = 1;
// Compile time error: no conversion from const to no-const.
//it = ci1;
사용할 것 : const int
vs와 유사 int
: const 반복자를 사용할 수있을 때마다 (컨테이너를 수정할 필요가없는 경우) constiterator를 선호하여 수정하지 않고 읽을 의도를 더 잘 문서화합니다.
(as others have said) const_iterator doesn't allow you modify the elements to which it points, this is useful inside of const class methods. It also allows you to express your intent.
ok Let me explain it with very simple example first without using constant iterator consider we have collection of random integers collection "randomData"
for(vector<int>::iterator i = randomData.begin() ; i != randomData.end() ; ++i)*i = 0;
for(vector<int>::const_iterator i = randomData.begin() ; i!= randomData.end() ; ++i)cout << *i;
As can be seen for writing/editing data inside collection normal iterator is used but for reading purpose constant iterator has been used . If you try using constant iterator in first for loop you will get error . As a thumb rule use constant iterator to read data inside collection .
'programing tip' 카테고리의 다른 글
여러 INSERT 문 대 여러 VALUES를 가진 단일 INSERT (0) | 2020.07.20 |
---|---|
R에서 객체로 함수에 보낸 후 객체의 이름을 얻는 방법은 무엇입니까? (0) | 2020.07.20 |
리소스와 엔드 포인트의 차이점은 무엇입니까? (0) | 2020.07.20 |
AndroidX로 마이그레이션 할 때 변수 '$ {animal.sniffer.version}'을 (를) 해결하지 못했습니다. (0) | 2020.07.20 |
여러 로더가있는 LoaderManager : 올바른 커서 로더를 얻는 방법 (0) | 2020.07.20 |