2017-10-30 9 views
1

나는이 코드 조각을 우연히 발견하고 그것을 이해하려고 노력했다가, 어떤 부분은 루프 분명하지만 있습니다for 루프 농축 .. (C++)

forward_list<Class> obj; 
auto b_end = obj.before_begin(); 

for (auto& _ : obj) 
    ++b_end ; 

obj.insert_after(b_end, Class newObj); 

하지 루프 무엇을하고 있는지 정확히 확인하십시오. 어떤 사람들은 for 루프를 깰 수 있었고 그것을 이해할 수 있었습니까?

편집 : 이 질문은 중복으로 표시되어 있지만 다른 스레드는 충분한 정보를 제공하지 못하거나 너무 오래되었습니다.

+1

후의 값 3을 추가 얻어진 반복기를 사용 http://en.cppreference.com/w/cpp/language/range ([루프 범위 기반] -for) – rustyx

+0

전체 코드를 게시 할 수는 없지만 코드 목적은 항상 목록의 끝에 newObj를 삽입하는 것입니다. 기술적으로는 끝이 아니라 끝나기 전에 끝나야합니다. nullptr을 가리킬 수 있습니다 ??) – Jin

+2

@Jin : A [mcve]는 전체 코드가 아닙니다. 그것은 장난감 예를 만들고 당신이 보는 행동을 재현하는 것입니다. 디버깅과 이해를위한 매우 유용한 연습. – AndyG

답변

1

std::forward_list은 forward_iterators가있는 순차적 컨테이너입니다. 이것은 일방적으로 단일 연결된 목록입니다. 목록에 값을 삽입하려면 [begin(), end()) 범위의 반복기 또는 before_begin() 메서드에서 반환 된 반복기를 지정하는 메서드 만 사용할 수 있습니다. C++ 표준

5에서

사용 조건 : 위치 [) (시작 범위의 dereferenceable 반복기 before_begin() 또는이다 엔드()).

목록 끝에 새 값을 추가하려는 경우 목록의 마지막 요소에 해당하는 위치에서 반복기를 이동해야합니다.

은 그래서 이름이 루프

for (auto& _ : obj) 
    ++b_end ; 

이동 목록의 마지막 요소에 의해 점유 된 위치 단계 반복자 b_end 단계 루프 범위 계. 이제 이터레이터를 사용하면 insert_after 메서드를 사용하여 목록에 새 값을 추가 할 수 있습니다.

간단한 데모 프로그램을 고려하십시오.

#include <iostream> 
#include <forward_list> 

int main() 
{ 
    std::forward_list<int> lst = { 1, 2 }; 

    auto b_end = lst.before_begin(); 

    for (const auto &_ : lst) 
    { 
     ++b_end; 
     std::cout << *b_end << '\n'; 
    } 
    std::cout << std::endl; 

    lst.insert_after(b_end, 3); 

    for (const auto &_ : lst) std::cout << _ << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

프로그램 출력 b_end 포인트리스트의 첫 번째 요소 이전에 제 반복기에

1 
2 

1 2 3 

이다. 목록이 두 요소 첫 번째에 해당하는 위치에 다음의 첫 번째 요소에 대응하는 위치로 이동 될시 반복기를 포함하고 있기 때문에 두 번 반복해야 할 루프 그 후

auto b_end = lst.before_begin(); 
        ^^^^^^^^^^^^^^ 

요소.

지금 우리가라고 값 2

1

이 :

forward_list<Class> obj; 

obj라는 std::forward_listClass의 -es를 선언합니다. std:: 부분은 using namespace std; 코드의 사용으로 인해 생략되었습니다. 이 :

auto b_end = obj.before_begin(); 

obj 목록에 std::forward_list::before_begin 위치를 가리키는 반복자를 정의합니다. 이 :

for (auto& _ : obj) 
    ++b_end; 

참조로 전달 된 괴상 _라는 변수를 사용하는 range based for loop이다. 이 루프에서는 b_end이 반복 될 때마다 증가합니다. 마지막 :

말했다되고 그건
Class newObj; 
obj.insert_after(b_end, newObj); 

에서, _ 그냥 변수 다음 b_end 위치 후 유형 Class의 새로운 newObj을 삽입하는

obj.insert_after(b_end, Class newObj); 

시도하고 그것이 아마해야하기 때문에 컴파일에 실패 이름. 그것은 (다소 이상한) 유효한 변수 식별자입니다.

for (auto el : obj){ 
    ++b_end; 
} 

auto 키워드는 auto specifier 의미 : 모든 일이 같이 다시 작성할 수 있었다, 그래서 여기에서 _ 변수 자체가 for 루프에서 어떤 방식으로 사용되지 않습니다.