Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL list assign() 함수 완벽 가이드 – 값 할당부터 복사까지


이번 글에서는 C++에서 assign() 함수가 어떻게 작동하는지 자세히 알아보겠습니다.

list::assign() 함수는 C++ 표준 템플릿 라이브러리(STL)에 포함된 함수로, 리스트에 새로운 값을 할당하거나 한 리스트의 값을 다른 리스트로 복사할 때 사용됩니다.

이 함수를 호출하려면 <list> 헤더 파일을 반드시 포함해야 합니다.

문법(Syntax)

리스트에 새로운 값을 할당할 때의 문법은 다음과 같습니다.

List_Name.assign(size, value)

한 리스트의 값을 다른 리스트로 복사할 때의 문법은 다음과 같습니다.

First_List.assign(Second_List.begin(), Second_List.end())

매개변수(Parameters)

이 함수는 두 개의 매개변수를 받습니다.

  • size: 리스트의 크기를 나타냅니다.
  • value: 리스트에 저장할 데이터 값을 나타냅니다.

반환값(Return Value)

이 함수는 별도의 반환값이 없습니다.

예제 1

Input: Lt.assign(3,10)
Output: The size of list Lt is 3.
The elements of the list Lt are 10 10 10.

설명

위 예제는 assign() 함수를 사용해 리스트에 크기와 값을 할당하는 방법을 보여줍니다. 첫 번째 인자는 리스트의 크기가 되며(여기서는 3), 두 번째 인자는 리스트의 모든 위치에 할당될 값입니다(여기서는 10).

예제 2

Input: int array[5] = { 1, 2, 3, 4 }
Lt.assign(array, array+3)
Output: The size of list Lt is 3.
The elements of the list Lt are 1 2 3.

설명

이 예제는 배열을 이용해 리스트에 값을 할당하는 방법을 보여줍니다. 리스트에 할당되는 요소의 개수가 곧 리스트의 크기가 됩니다.

assign() 함수의 첫 번째 인자로는 배열의 이름을, 두 번째 인자로는 배열 이름에 "+" 기호와 함께 할당하고자 하는 요소의 개수를 더한 값을 전달하면 됩니다.

위 예제에서는 3을 지정했으므로 배열의 처음 세 개 요소가 리스트에 할당됩니다.

만약 배열에 실제로 존재하는 요소 개수보다 큰 숫자(예: 6)를 지정하면 컴파일 오류는 발생하지 않지만, 리스트의 크기는 6이 되고 남은 자리에는 0이 채워집니다. 다만 배열의 유효 범위를 벗어나 접근하는 것은 정의되지 않은 동작(undefined behavior)에 해당하므로 실제 코드에서는 주의해야 합니다.

프로그램에서 사용된 접근 방식

  • 먼저 리스트의 요소를 화면에 출력하는 ShowList(list<int> L) 함수를 작성합니다.
  • 출력할 리스트의 첫 번째 요소를 가리키는 반복자(iterator) itr을 생성합니다.
  • itr이 리스트의 마지막 요소에 도달할 때까지 반복문을 실행합니다.
  • main() 함수 안에서 int 타입 값을 저장할 수 있는 세 개의 리스트 L1, L2, L3를 생성하고, int 타입 배열 arr[]를 선언해 값을 초기화합니다.
  • assign() 함수로 L1에 크기와 값들을 할당한 뒤, L1을 ShowList() 함수에 전달합니다.
  • assign() 함수로 L1의 요소들을 L2에 복사한 뒤, L2를 ShowList() 함수에 전달합니다.
  • assign() 함수로 배열 arr[]의 요소들을 L3에 복사한 뒤, L3를 ShowList() 함수에 전달합니다.

알고리즘

시작
단계 1-> 리스트 요소를 출력하기 위한 함수 DisplayList(list<int> L) 선언
    반복자 itr 선언
    itr = L.begin()부터 itr != L.end()일 때까지 itr++ 하며 반복
    *itr 출력
    반복 종료
단계 2-> main() 함수에서
    리스트 L1, L2, L3 선언
    배열 arr[] 초기화
    L1.assign(size, value) 호출
    L1.size() 출력
    DisplayList(L1) 함수를 호출하여 L1 출력
    L2.assign(L1.begin(), L1.end()) 호출
    L2.size() 출력
    DisplayList(L2) 함수를 호출하여 L2 출력
    L3.assign(arr, arr+4) 호출
    L3.size() 출력
    DisplayList(L3) 함수를 호출하여 L3 출력
종료

예제 코드

#include<iostream>
#include<list>
using namespace std;
int ShowList(list<int> L) {
    cout<<"The elements of the list are ";
    list<int>::iterator itr;
    for(itr=L.begin(); itr!=L.end(); itr++) {
        cout<<*itr<<" ";
    }
    cout<<"\n";
}
int main() {
    list<int> L1;
    list<int> L2;
    list<int> L3;
    int arr[10] = { 6, 7, 2, 4 };
    // 리스트 L1에 크기와 값 할당
    L1.assign(3,20);
    cout<<"The size of list L1 is "<<L1.size()<<"\n";
    ShowList(L1);
    // L1의 요소들을 L2로 복사
    L2.assign(L1.begin(),L1.end());
    cout<<"The size of list is L2 "<<L2.size()<<"\n";
    ShowList(L2);
    // 배열 arr[]의 요소들을 L3로 복사
    L3.assign(arr,arr+4);
    cout<<"The size of list is L3 "<<L3.size()<<"\n";
    ShowList(L3);
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

The size of list L1 is 3
The elements of the list are 20 20 20
The size of list L2 is 3
The elements of the list are 20 20 20
The size of list L3 is 4
The elements of the list are 6 7 2 4

설명

리스트 L1에는 assign() 함수에서 크기를 3, 값을 20으로 지정했고, 이것이 위 출력 결과를 만들어냈습니다.

그다음 L1의 요소들을 L2로 복사했으며, 출력에서 확인할 수 있듯이 L2는 L1과 동일한 크기와 값을 갖게 됩니다.

마지막으로 assign() 함수를 사용해 배열 arr[]의 모든 요소를 복사했는데, 이로 인해 L3의 크기는 4가 되었고 요소 역시 배열의 요소와 동일해졌습니다.