C++ STL의 전달 목록

Forward_list 컨테이너는 다음의 구현을 제공합니다. 단일 연결 리스트 데이터 구조. 각 요소가 시퀀스의 다음 요소를 가리키는 비연속 메모리에 데이터를 저장합니다. 이렇게 하면 요소의 위치가 알려지면 삽입과 삭제가 더 빨라집니다.

통사론

전달 목록은 다음과 같이 정의됩니다. 표준::forward_list 클래스 템플릿 내부 < 앞으로_목록 > 헤더 파일.

앞으로_목록 fl;

어디

  • 티: 정방향 목록에 있는 요소의 데이터 유형입니다.
  • 에프: 전달 목록에 할당된 이름입니다.

선언 및 초기화

아래 예제와 같이 여러 가지 방법으로 Forward_list를 선언하고 초기화할 수 있습니다.

C++
   #include          using     namespace     std  ;   void     printFL  (  forward_list   <  int  >&     fl  )     {      for     (  auto     i     :     fl  )      cout      < <     i      < <     ' '  ;      cout      < <     'n'  ;   }   int     main  ()     {          // Creating an empty forward_list      forward_list   <  int  >     fl1  ;      // Creating a forward_list with      // default value      forward_list   <  int  >     fl2  (  3       4  );          // Creating a forward_list from an      // initializer list      forward_list   <  int  >     fl3     =     {  1       5       3       4  };          printFL  (  fl2  );      printFL  (  fl3  );      return     0  ;   }   

산출
4 4 4 1 5 3 4  

예: 위 프로그램에서는 세 가지 방법으로 간단하게 초기화된 정방향 목록을 만듭니다.

  • 성명 앞으로_목록 FL1 빈 정수 정방향 목록을 생성합니다.
  • 성명 앞으로_목록 fl2(34) 크기가 3이고 각 요소가 4인 정방향 목록을 만듭니다.
  • 성명 앞으로_목록 fl3 = {1 5 3 4} 정방향 목록을 생성하고 초기화 목록의 요소로 초기화합니다.

기본 작업

정방향 목록에서 수행할 수 있는 기본 작업은 다음과 같습니다.

1. 요소에 접근하기

정방향 목록의 요소는 배열이나 벡터와 같은 인덱스를 사용하여 액세스할 수 없습니다. 목록에 접근하려면 처음부터 원하는 위치까지 순차적으로 이동해야 합니다. 이 작업은 증분을 통해 수행할 수 있습니다. 시작하다() 반복자이지만 사용하는 것이 더 좋습니다 다음() 또는 전진() 기능.

그러나 목록의 첫 번째 요소는 다음을 통해 쉽게 액세스할 수 있습니다. 앞쪽() 방법.

예:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Access the first element      cout      < <     fl  .  front  ()      < <     endl  ;          // Access third element      auto     it     =     next  (  fl  .  begin  ()     2  );      cout      < <     *  it  ;      return     0  ;   }   

산출
1 3 

예: 위 프로그램에서 첫 번째 요소는 다음을 사용하여 인쇄됩니다. 앞쪽() 방법. 세 번째 요소에 액세스하려면 다음() 반복자를 처음부터 두 위치 이동하는 데 사용됩니다. *그것 반복자를 역참조하는 데 사용됩니다.

2. 요소 삽입

다음을 사용하여 요소를 정방향 목록에 삽입할 수 있습니다. insert_after() 기능. 요소를 삽입하려면 반복자가 필요합니다. 그러나 전면에서의 빠른 삽입은 다음과 같은 방식으로 지원됩니다. push_front() 방법.

예:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  5       4  };      // Inserting Element at front      fl  .  push_front  (  1  );          // Insert 3 after the second element      auto     it     =     fl  .  begin  ();      advance  (  it       1  );      fl  .  insert_after  (  it       3  );          for     (  auto     x  :     fl  )     cout      < <     x      < <     ' '  ;      return     0  ;   }   

산출
1 5 3 4  

설명: 이 프로그램에서는 forward_list의 첫 번째 요소가 다음을 사용하여 앞에 삽입됩니다. push_front() 기능. 그런 다음 반복자가 생성되고 다음을 사용하여 한 위치 앞으로 이동됩니다. 전진() 기능. 그 후 요소 5 다음을 사용하여 두 번째 요소 뒤에 삽입됩니다. insert_after() 기능.

3. 요소 업데이트

기존 요소의 값은 해당 요소에 액세스하고 다음을 사용하여 간단히 변경할 수 있습니다. 할당 연산자 새 값을 할당합니다.

예:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Updating first element      fl  .  front  ()     =     111  ;      cout      < <     fl  .  front  ()      < <     endl  ;          // Updating third element      auto     it     =     next  (  fl  .  begin  ()     2  );      *  it     =     333  ;      cout      < <     *  it  ;      return     0  ;   }   

산출
111 333 

4. 요소 찾기

정방향 목록은 요소를 검색하는 멤버 함수를 제공하지 않지만 다음을 사용할 수 있습니다. 찾다() 주어진 값을 찾는 알고리즘.

:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Finding 3      auto     it     =     find  (  fl  .  begin  ()     fl  .  end  ()     3  );          if     (  it     !=     fl  .  end  ())     cout      < <     *  it  ;      else     cout      < <     'Element not Found'  ;      return     0  ;   }   

산출
3 

5. 횡단

정방향 목록은 다음을 사용하여 탐색할 수 있습니다. 시작하다() 그리고 끝() 루프가 있는 반복자는 앞으로만 이동할 수 있고 뒤로는 이동할 수 없습니다.

예:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };          // Traversing using range-based for loop      for  (  auto     i     :     fl  )      cout      < <     i      < <     ' '  ;      cout      < <     endl  ;          return     0  ;   }   

산출
1 5 3 4  

6. 요소 삭제

정방향 목록에서는 다음을 사용하여 주어진 위치의 요소를 삭제할 수 있습니다. 지우기_후() 방법. 이 메서드는 반복자를 대상 요소 앞의 한 위치로 가져옵니다. 다음을 사용하여 전면에서 빠른 삭제가 가능합니다. 팝프론트() 방법.

예:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Delete first element      fl  .  pop_front  ();          // Delete third element      auto     it     =     fl  .  begin  ();      advance  (  it       1  );      fl  .  erase_after  (  it  );          for     (  auto     x  :     fl  )     cout      < <     x      < <     ' '  ;      return     0  ;   }   

산출
5 3  

7. 전달 목록의 크기

Forward_list에는 내장된 size() 함수가 없습니다. 크기를 찾으려면 루프를 사용하거나 std:: 거리를 사용하여 요소를 수동으로 계산해야 합니다.

C++
   #include          #include         #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     flist  =  {  10    20    30    40  };      //Calculate size by counting elements using std:: distance      int     size  =  distance  (  flist  .  begin  ()  flist  .  end  ());      cout   < <  'Size of forward_list: '   < <  size   < <  endl  ;      return     0  ;   }   

산출
Size of forward_list: 4  

8. 빈()

Forward_list가 비어 있는지 확인하는 데 사용됩니다.
목록이 비어 있으면 true를 반환하고 그렇지 않으면 컨테이너에 데이터가 없는지 빠르게 확인할 수 있도록 false를 반환합니다.

C++
   #include          #include         using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     flist  ;      if     (  flist  .  empty  ())     {      cout      < <     'The forward_list is empty.'      < <     endl  ;      }      flist  .  push_front  (  10  );      if     (  !  flist  .  empty  ())     {      cout      < <     'The forward_list is not empty.'      < <     endl  ;      }      return     0  ;   }   

산출
The forward_list is empty. The forward_list is not empty.  

시간 복잡도

아래 표에는 정방향 목록에서 위 작업의 시간 복잡도가 나열되어 있습니다.

작업 시간 복잡도
첫 번째 요소에 액세스 오(1)
액세스 n 요소 에)
앞쪽에 삽입 오(1)
특정 위치 뒤에 삽입 에)
첫 번째 요소 삭제 오(1)
특정 위치 이후 삭제 에)
순회 에)

앞으로 목록과 목록

특징

앞으로_목록

목록

연결리스트의 종류

단일 연결 리스트

이중 연결 리스트

순회

앞으로만 이동할 수 있음

앞뒤로 모두 이동할 수 있습니다.

메모리 사용량

더 적은 메모리를 사용합니다(노드당 하나의 포인터만 사용).

더 많은 메모리를 사용합니다(노드당 포인터 2개).

삽입/삭제

삽입 및 삭제는 빠르지만 특정 위치나 그 이후에만 가능

어느 위치에서나(위치 앞이나 뒤) 빠른 삽입 및 삭제

지원되는 기능

목록에 비해 제한됨(size() 없음 역방향 반복자 없음)

size() reverse() 양방향 반복자를 포함한 더욱 완전한 인터페이스입니다.