en en ko ko ko ko ko ko ko en ko en ko ko ko nl ko en ko en ko en ko en ko ko fr ko nl ko en ko en nl ko en ko nl en ko ko en ko ko nl ko ko ko en nl ko en ko en nl ko ko ko en ko ko en ko ko ko ko zh en en en en en pt en it en en en sv fr en en en en en en en es fr en en en fr ja en en de en en en en en hu ja pt ru en en en en en ko ko ko ko ko ko ko en pt sv en ko ko ko ko ko ko ko ko ko ko ko en en
const-iterator Archives - IT HOW
그 이유를 궁금해 cbegin하고 cendC ++ (11)에 도입?
이러한 메소드를 호출 할 때 begin및의 const 오버로드 와 다른 경우는 무엇입니까 end?
아주 간단합니다. 벡터가 있다고 가정 해보십시오.
데이터로 채 웁니다. 그런 다음 반복자를 가져오고 싶습니다. 어쩌면 그들을 통과시킬 수 있습니다. 아마 std::for_each:
C ++ 03에서는 매개 변수 SomeFunctor를 자유롭게 수정할 수있었습니다 . 물론 SomeFunctorvalue 또는 by별로 매개 변수를 사용할 수 const&있지만이를 보장 할 방법이 없습니다 . 이런 바보 같은 일을하지 않으면 :
const std::vector  &vec_ref = vec; std::for_each(vec_ref.begin(), vec_ref.end(), SomeFunctor());
이제 SomeFunctor벡터의 요소를 수정할 수없는 구문 보장이 있습니다 (물론 const-cast없이). 우리는 명시 적으로을 얻으 const_iterator므로 SomeFunctor::operator()로 호출됩니다 const int &. 매개 변수를로 사용 int &하면 C ++에서 컴파일러 오류가 발생합니다.
C ++ 17에는이 문제에 대한보다 우아한 해결책이 있습니다 std::as_const. 음, 범위 기반을 사용할 때 적어도 우아합니다 for.
for(auto &item : std::as_const(vec))
const&제공된 객체에 단순히 a 를 반환합니다 .
Nicol Bolas가 그의 답변 에서 말한 것 외에도 새로운 auto키워드를 고려하십시오 .
auto iterator = container.begin();
를 사용하면 상수가 아닌 컨테이너 참조에 대한 상수 연산자를 반환 auto하도록 할 수있는 방법이 없습니다 begin(). 이제 다음을 수행하십시오.
auto const_iterator = container.cbegin();
이것을 실용적인 유스 케이스로 사용하십시오
void SomeClass::f(const vector & a) { auto it = someNonConstMemberVector.begin(); ... it = a.begin(); ... }
itconst가 아닌 반복자 이므로 할당이 실패 합니다. 처음에 cbegin을 사용했다면 반복자는 올바른 유형을 가졌을 것입니다.
프로그래머는 비 const 컨테이너에서도 const_iterator를 직접 얻을 수 있습니다.
vector  v; // fill v ... typedef vector ::iterator iter; for( iter it = v.begin(); it != v.end(); ++it ) { // use *it ... }
그러나 컨테이너 순회가 검사만을 목적으로하는 경우에는 컴파일러가 const-correctness 위반을 진단 할 수 있도록 const_iterator를 사용하는 것이 일반적으로 선호됩니다.
참고 작업 용지는 지금으로 완료되었는지, 어댑터 템플릿을 언급하는 것이 std::begin()및 std::end()기본 배열과 그 또한 작동합니다. 해당 std::cbegin()과 std::cend()호기심이 시간으로 누락, 그러나 또한 추가 될 수 있습니다.
방금이 질문에 우연히 발견되었습니다 … 나는 그것이 이미 대답했고 그것이 단지 노드라는 것을 알고 있습니다 …
auto const it = container.begin() 다른 유형입니다 auto it = container.cbegin()
의 차이 int[5](필자는이 방법을 시작하지만, 잘 차이를 보여 …하지만 14 C ++로 작업 할 필요가 없습니다 알고 사용하여 포인터, std::cbegin()그리고 std::cend()그것을 여기 때 사람이 무엇을 사용해야 본질적 인) …
int numbers = array[7]; const auto it = begin(numbers); // type is int* const -> pointer is const auto it = cbegin(numbers); // type is int const* -> value is const
iterator및 const_iterator상속 관계를 가지고 비교 또는 다른 타입의 할당시 암시 적 변환이 발생한다.
class T {} MyT1, MyT2, MyT3; std::vector  MyVector = {MyT1, MyT2, MyT3}; for (std::vector ::const_iterator it=MyVector.begin(); it!=MyVector.end(); ++it) { // ... }
사용 cbegin()하고 cend()이 경우 성능을 향상시킬 것입니다.
for (std::vector ::const_iterator it=MyVector.cbegin(); it!=MyVector.cend(); ++it) { // ... }
간단한 cbegin은 상수 반복자를 반환합니다. 여기서 begin은 반복자를 반환합니다.
더 나은 이해를 위해 여기 두 가지 시나리오를 취할 수 있습니다.
#include   using namespace std; #include   int main(int argc, char const *argv[]) { std::vector  v; for (int i = 1; i < 6; ++i) { /* code */ v.push_back(i); } for(auto i = v.begin();i< v.end();i++){ *i = *i + 5; } for (auto i = v.begin();i < v.end();i++){ cout<<*i<<" "; } return 0; }
여기서 반복자 i는 일정하지 않으며 5 씩 증가 할 수 있기 때문에 실행됩니다.
이제 cbegin을 사용하여 상수 반복자 시나리오 -2로 표시합니다.
#include   using namespace std; #include   int main(int argc, char const *argv[]) { std::vector  v; for (int i = 1; i < 6; ++i) { /* code */ v.push_back(i); } for(auto i = v.cbegin();i< v.cend();i++){ *i = *i + 5; } for (auto i = v.begin();i < v.end();i++){ cout<<*i<<" "; } return 0; }
상수 반복자를 반환하는 cbegin 및 cend를 사용하여 값을 업데이트 할 수 없으므로 작동하지 않습니다.
이 글은 c++ 카테고리에 분류되었고 c++, c++11, const-correctness, const-iterator, iterator 태그가 있으며 [호호] 야야님에 의해 2022년 8월 08일에 작성되었습니다.
“service foo status”가“less”를 통해 출력을 페이징하는 것을 방지 할 수 있습니까?
기본 Wi-Fi 설정 및 암호 배포 및 설정을 설정하고 처럼 그런
제로 충전은 virtualbox 동적 디스크 이미지의 크기를 증가시킵니다 있습니다.) 추가 질문 중 하나는 디스크 크기를 늘리지
Amazon ECS에서 서비스 컨테이너 업데이트 업데이트 한 경우, 해당 이미지와
가운데 클릭을위한 트리플 핑거 탭? 클릭을 위해
apthow.com powered by hoya