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
후의 값 3을 추가 얻어진 반복기를 사용 http://en.cppreference.com/w/cpp/language/range ([루프 범위 기반] -for) – rustyx
전체 코드를 게시 할 수는 없지만 코드 목적은 항상 목록의 끝에 newObj를 삽입하는 것입니다. 기술적으로는 끝이 아니라 끝나기 전에 끝나야합니다. nullptr을 가리킬 수 있습니다 ??) – Jin
@Jin : A [mcve]는 전체 코드가 아닙니다. 그것은 장난감 예를 만들고 당신이 보는 행동을 재현하는 것입니다. 디버깅과 이해를위한 매우 유용한 연습. – AndyG