IT 프로그래밍/자료구조

[자료구조] 그룹액티비티2

기술1 2024. 10. 20. 11:53
#include <iostream>   // 표준 입출력 라이브러리 포함
#include <vector>     // 벡터 라이브러리 포함

using namespace std;

int main() {
    vector<int> g1;   // 정수형 벡터 g1을 선언 (현재 비어 있음)

    for (int i = 0; i < 5; i++)  // 0부터 4까지 벡터에 값을 추가
        g1.push_back(i);  // g1 벡터에 i 값을 추가 (g1 = {0, 1, 2, 3, 4})

    cout << "Size : " << g1.size() << endl;  // 현재 벡터의 크기(요소 개수) 출력
    cout << "Capacity : " << g1.capacity() << endl;  // 벡터의 용량(메모리 할당 크기) 출력

    g1.resize(10);  // 벡터의 크기를 10으로 변경 (빈 요소는 기본값 0으로 채워짐)
    cout << "Size : " << g1.size() << endl;  // 변경된 벡터의 크기 출력

    // 벡터의 모든 요소를 출력
    for (auto it = g1.begin(); it != g1.end(); it++)
        cout << *it << " ";  // 현재 요소 값 출력

    return 0;  // 프로그램 정상 종료
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
	vector<int> g1;
	for (int i = 1; i <= 10; i++)
		g1.push_back(i * 10);

	cout << "g1[2] = " << g1[2] << endl;
	cout << "g1.at(4) = " << g1.at(4) << endl;
	cout << "g1.front() = " << g1.front() << endl;
	cout << "g1.back() = " << g1.back() << endl;

	return 0;
}

 

  • vector<int> g1;:
    • 정수형 벡터 **g1**을 선언합니다. 초기에는 아무 값도 들어 있지 않으므로 빈 벡터입니다.
  • for (int i = 0; i < 5; i++) g1.push_back(i);:
    • 반복문을 사용하여 0부터 4까지의 값을 벡터에 추가합니다.
    • push_back() 함수는 벡터의 끝에 새로운 요소를 추가하는 함수입니다.
    • 이 과정을 통해 g1 벡터는 **{0, 1, 2, 3, 4}**가 됩니다.
  • cout << "Size : " << g1.size() << endl;:
    • size() 함수는 벡터에 들어 있는 현재 요소의 개수를 반환합니다.
    • 이 시점에서 **g1**에는 5개의 요소(0, 1, 2, 3, 4)가 있으므로, **Size : 5**가 출력됩니다.
  • cout << "Capacity : " << g1.capacity() << endl;:
    • capacity() 함수는 벡터가 현재 메모리에 할당된 용량을 반환합니다.
    • 벡터는 요소가 추가될 때 **용량(capacity)**을 미리 할당하여, 필요할 때 자동으로 확장합니다. **capacity()**는 그 크기를 반환하며, 이는 벡터의 실제 크기와 다를 수 있습니다.
    • 용량 값은 벡터의 구현 방식과 시스템에 따라 달라질 수 있습니다.
  • g1.resize(10);:
    • resize() 함수는 벡터의 크기를 조절합니다.
    • 여기서 크기를 10으로 변경하며, 벡터가 커진 만큼 추가된 요소는 **기본값(정수형인 경우 0)**으로 채워집니다.
    • 벡터의 새로운 상태는 **{0, 1, 2, 3, 4, 0, 0, 0, 0, 0}**가 됩니다.
  • cout << "Size : " << g1.size() << endl;:
    • 벡터의 크기가 10으로 변경되었으므로 **Size : 10**이 출력됩니다.
  • for (auto it = g1.begin(); it != g1.end(); it++):
    • 벡터의 모든 요소를 출력하는 반복문입니다.
    • **begin()**은 벡터의 첫 번째 요소를 가리키는 **반복자(iterator)**를 반환하고, **end()**는 벡터의 마지막 요소 다음을 가리킵니다.
    • ***it**는 반복자가 가리키는 현재 요소를 참조하며, 각 요소를 차례로 출력합니다.
  • cout << *it << " ";:
    • 벡터의 각 요소를 출력하며, 각 요소 뒤에 공백을 추가합니다.
    • 최종 출력은 **0 1 2 3 4 0 0 0 0 0**가 됩니다.
#include <iostream>   // 표준 입출력 라이브러리 포함
#include <vector>     // 벡터 라이브러리 포함

using namespace std;

int main() {
    vector<int> v(5);  // 크기가 5인 정수형 벡터 v 생성, 초기값은 모두 0
    int i = 0;  // 변수 i를 0으로 초기화
    
    vector<int>::reverse_iterator rit = v.rbegin();  
    // 벡터 v의 역방향 반복자 rit를 선언하고 rbegin()으로 초기화 (벡터의 마지막 요소를 가리킴)

    // 역방향으로 벡터의 요소를 채우는 반복문
    for (; rit != v.rend(); ++rit) {
        *rit = ++i;  // 각 요소에 i의 증가된 값을 할당 (1, 2, 3, 4, 5)
    }

    // 순방향으로 벡터의 요소를 출력하는 반복문
    for (auto it = v.begin(); it != v.end(); ++it) {
        cout << ' ' << *it;  // 각 요소를 출력 (공백으로 구분)
    }
    
    cout << '\n';  // 출력 후 줄바꿈

    return 0;  // 프로그램 정상 종료
}

 

 

상세 설명

  1. vector<int> v(5);:
    • 크기가 5인 정수형 벡터 v를 선언합니다. 벡터는 기본적으로 0으로 초기화됩니다.
    • 즉, v = {0, 0, 0, 0, 0} 상태가 됩니다.
  2. int i = 0;:
    • 변수 **i**를 0으로 초기화합니다. 이 변수는 반복문에서 값을 증가시키면서 벡터의 요소를 채우는 데 사용됩니다.
  3. vector<int>::reverse_iterator rit = v.rbegin();:
    • 벡터의 **역방향 반복자(reverse iterator)**인 **rit**를 선언하고, **rbegin()**으로 초기화합니다.
    • **rbegin()**은 벡터의 마지막 요소를 가리키는 반복자를 반환합니다. 이를 통해 벡터의 마지막 요소부터 처음 요소까지 역방향으로 순회할 수 있습니다.
  4. 역방향으로 벡터의 요소를 채우는 반복문:
    • rit != v.rend(): 벡터의 끝(처음 요소의 앞)을 가리키는 **rend()**에 도달할 때까지 반복합니다.
    • *rit = ++i: 역방향으로 순회하면서 각 요소에 **i**의 값을 1씩 증가시켜 할당합니다.
      • 처음에는 i = 1, 그다음 i = 2, ..., i = 5까지 할당됩니다.
    • 이 과정을 통해 **벡터는 {5, 4, 3, 2, 1}**로 변경됩니다.
  5. cpp
    코드 복사
    for (; rit != v.rend(); ++rit) { *rit = ++i; }
  6. 순방향으로 벡터의 요소를 출력하는 반복문:
    • **순방향 반복자(it)**를 사용하여 벡터의 첫 번째 요소부터 마지막 요소까지 순회합니다.
    • 각 요소를 공백과 함께 출력합니다.
    • 출력 결과는 **5 4 3 2 1**가 됩니다.
  7. cpp
    코드 복사
    for (auto it = v.begin(); it != v.end(); ++it) { cout << ' ' << *it; }
  8. cout << '\n';:
    • 마지막 출력 후 줄바꿈을 삽입합니다.
#include <iostream>  // 표준 입출력 라이브러리 포함
#include <vector>    // 벡터 라이브러리 포함

using namespace std;

int main() {
    vector<int> v;  // 정수형 벡터 v 선언

    // 벡터에 5개의 값 10을 할당
    v.assign(5, 10);  
    // v = {10, 10, 10, 10, 10}

    // 벡터의 모든 요소를 출력
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";  // 출력: "10 10 10 10 10 "
    cout << endl;

    // 벡터의 끝에 15 추가
    v.push_back(15);
    // v = {10, 10, 10, 10, 10, 15}

    // 마지막 요소 출력
    int n = v.size();  // n은 벡터의 크기
    cout << "The last element is: " << v[n - 1] << endl;  // 출력: "The last element is: 15"

    // 마지막 요소 제거
    v.pop_back();
    // v = {10, 10, 10, 10, 10}

    // 현재 벡터의 모든 요소 출력
    cout << "The vector elements are: ";
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";  // 출력: "10 10 10 10 10 "
    cout << endl;

    // 벡터의 맨 앞에 5 삽입
    v.insert(v.begin(), 5);  
    // v = {5, 10, 10, 10, 10, 10}

    // 첫 번째 요소 출력
    cout << "The first element is: " << v[0] << endl;  // 출력: "The first element is: 5"

    // 첫 번째 요소 제거
    v.erase(v.begin());  
    // v = {10, 10, 10, 10, 10}

    // 첫 번째 요소 출력
    cout << "The first element is: " << v[0] << endl;  // 출력: "The first element is: 10"

    // 벡터를 모두 지움
    v.clear();  
    // v = {}

    // 벡터의 크기 출력
    cout << "Vector size: " << v.size() << endl;  // 출력: "Vector size: 0"

    return 0;
}

상세 설명

  1. v.assign(5, 10);:
    • assign 함수는 벡터에 5개의 요소를 할당하며, 각 요소는 10으로 채워집니다.
    • 벡터 **v**는 **{10, 10, 10, 10, 10}**가 됩니다.
  2. for (int i = 0; i < v.size(); i++) cout << v[i] << " ";:
    • 벡터 **v**의 모든 요소를 순차적으로 출력합니다.
    • 출력 결과는 **"10 10 10 10 10 "**입니다.
  3. v.push_back(15);:
    • push_back 함수는 벡터의 끝에 15를 추가합니다.
    • 벡터는 **{10, 10, 10, 10, 10, 15}**로 변합니다.
  4. int n = v.size(); cout << "The last element is: " << v[n - 1];:
    • **v.size()**는 벡터의 크기를 반환하고, **v[n - 1]**은 마지막 요소를 의미합니다.
    • 출력 결과는 **"The last element is: 15"**입니다.
  5. v.pop_back();:
    • pop_back 함수는 벡터의 마지막 요소(15)를 제거합니다.
    • 벡터는 다시 **{10, 10, 10, 10, 10}**로 변합니다.
  6. 벡터 요소 출력:
    • 다시 벡터의 모든 요소를 출력하면 **"The vector elements are: 10 10 10 10 10 "**가 출력됩니다.
  7. v.insert(v.begin(), 5);:
    • insert 함수는 벡터의 맨 앞에 5를 삽입합니다.
    • 벡터는 **{5, 10, 10, 10, 10, 10}**이 됩니다.
  8. 첫 번째 요소 출력:
    • 벡터의 첫 번째 요소인 **5**를 출력합니다. 결과는 **"The first element is: 5"**입니다.
  9. v.erase(v.begin());:
    • erase 함수는 벡터의 첫 번째 요소(5)를 제거합니다.
    • 벡터는 다시 **{10, 10, 10, 10, 10}**로 변합니다.
  10. 다시 첫 번째 요소 출력:
    • 이제 첫 번째 요소는 **10**이므로, 결과는 **"The first element is: 10"**입니다.
  11. v.clear();:
    • clear 함수는 벡터의 모든 요소를 제거하여 벡터를 비웁니다.
    • 벡터는 빈 상태가 됩니다.
  12. 벡터의 크기 출력:
    • **v.size()**는 0을 반환합니다. 결과는 **"Vector size: 0"**입니다.
#include <iostream>
#include <vector>  // 벡터 라이브러리 포함

using namespace std;

int main() {
    vector<int> v1 = {1, 2, 3, 4, 5, 6};  // v1 벡터 초기화 (6개의 정수)
    vector<int> v2 = {7, 8, 9};           // v2 벡터 초기화 (3개의 정수)

    // v1에서 인접한 요소들끼리 교환
    for (int i = 0; i <= 4; i += 2)
        swap(v1[i], v1[i + 1]);

    // v1 벡터 출력
    cout << "Vector v1 = ";
    for (int i = 0; i < 6; i++)
        cout << v1[i] << " ";
    cout << endl;

    // v1과 v2의 첫 번째, 두 번째, 세 번째 요소를 서로 교환
    for (int i = 0; i < 3; i++)
        swap(v1[i], v2[i]);

    // v1 벡터 출력
    cout << "Vector v1 = ";
    for (int i = 0; i < 6; i++)
        cout << v1[i] << " ";
    cout << endl;

    // v2 벡터 출력
    cout << "Vector v2 = ";
    for (int i = 0; i < 3; i++)
        cout << v2[i] << " ";
    cout << endl;

    return 0;
}

상세 설명

  1. vector<int> v1 = {1, 2, 3, 4, 5, 6};:
    • 크기가 6인 벡터 **v1**을 선언하고 **{1, 2, 3, 4, 5, 6}**으로 초기화합니다.
  2. vector<int> v2 = {7, 8, 9};:
    • 크기가 3인 벡터 **v2**를 선언하고 **{7, 8, 9}**로 초기화합니다.
  3. for (int i = 0; i <= 4; i += 2) swap(v1[i], v1[i + 1]);:
    • 이 반복문은 벡터 **v1**의 인접한 요소들을 서로 교환합니다.
    • **i += 2**로 짝수 인덱스의 요소와 그 다음 인접한 요소를 교환합니다.
    • 교환되는 요소들:
      • **v1[0]**과 v1[1]: 1과 2를 교환 → 결과: {2, 1, 3, 4, 5, 6}
      • **v1[2]**과 v1[3]: 3과 4를 교환 → 결과: {2, 1, 4, 3, 5, 6}
      • **v1[4]**과 v1[5]: 5와 6을 교환 → 결과: {2, 1, 4, 3, 6, 5}
  4. 첫 번째 출력: v1:
    • 첫 번째 v1 벡터는 교환된 후 **{2, 1, 4, 3, 6, 5}**로 변합니다.
    • 출력 결과: Vector v1 = 2 1 4 3 6 5
  5. for (int i = 0; i < 3; i++) swap(v1[i], v2[i]);:
    • 이 반복문은 **v1**과 **v2**의 첫 번째, 두 번째, 세 번째 요소들을 서로 교환합니다.
    • 교환되는 요소들:
      • **v1[0]**과 v2[0]: 2와 7을 교환 → v1 = {7, 1, 4, 3, 6, 5}, v2 = {2, 8, 9}
      • **v1[1]**과 v2[1]: 1과 8을 교환 → v1 = {7, 8, 4, 3, 6, 5}, v2 = {2, 1, 9}
      • **v1[2]**과 v2[2]: 4와 9를 교환 → v1 = {7, 8, 9, 3, 6, 5}, v2 = {2, 1, 4}
  6. 두 번째 출력: v1:
    • 두 번째 v1 벡터는 교환된 후 **{7, 8, 9, 3, 6, 5}**로 변합니다.
    • 출력 결과: Vector v1 = 7 8 9 3 6 5
  7. 세 번째 출력: v2:
    • v2 벡터는 **{2, 1, 4}**로 변합니다.
    • 출력 결과: Vector v2 = 2 1 4
#include <algorithm>  // sort(), unique() 함수 포함
#include <iostream>   // 표준 입출력 라이브러리 포함
#include <vector>     // 벡터 라이브러리 포함

using namespace std;

int main() {
    // 벡터 초기화
    vector<int> my_vec = {1, 3, 1, 4, 4, 6, 5, 6, 6};

    // 벡터 정렬
    sort(my_vec.begin(), my_vec.end());

    // 정렬된 벡터 출력
    for (int item : my_vec)
        cout << item << " ";
    cout << endl;

    // 중복을 제거하고 고유 요소로 구성된 범위를 반환 (하지만 크기는 그대로)
    auto it = unique(my_vec.begin(), my_vec.end());

    // 중복 제거 후의 벡터 출력 (아직 실제로 삭제되지 않았고, 중복된 값들이 뒤에 남아 있음)
    for (int item : my_vec)
        cout << item << " ";
    cout << endl;

    // 실제로 중복된 요소들을 벡터에서 삭제
    my_vec.erase(it, my_vec.end());

    // 중복 제거 후 최종 벡터 출력
    for (int item : my_vec)
        cout << item << " ";
    cout << endl;

    return 0;
}

상세 설명

  1. vector<int> my_vec = {1, 3, 1, 4, 4, 6, 5, 6, 6};:
    • 정수형 벡터 **my_vec**을 **{1, 3, 1, 4, 4, 6, 5, 6, 6}**으로 초기화합니다.
  2. sort(my_vec.begin(), my_vec.end());:
    • sort() 함수는 벡터의 요소를 오름차순으로 정렬합니다.
    • 정렬 후 **my_vec**은 **{1, 1, 3, 4, 4, 5, 6, 6, 6}**로 변합니다.
  3. 정렬된 벡터 출력:
    • 벡터의 모든 요소를 출력합니다. 출력 결과는:
    코드 복사
    1 1 3 4 4 5 6 6 6
  4. cpp
    코드 복사
    for (int item : my_vec) cout << item << " ";
  5. auto it = unique(my_vec.begin(), my_vec.end());:
    • unique() 함수는 인접한 중복된 요소를 제거하고, 고유한 값으로 구성된 새로운 범위를 반환합니다. 하지만 실제로 중복된 요소가 삭제되는 것은 아닙니다.
    • **unique()**는 중복을 제거한 후 중복된 요소들이 있는 위치의 반복자를 반환합니다.
    • 이 단계에서는 **my_vec**이 **{1, 3, 4, 5, 6, ?, ?, ?, ?}**로 변형됩니다. 중복된 값들이 앞쪽으로 모이지만, 뒤쪽에 여전히 중복된 값들이 남아 있습니다.
  6. 중복 제거 후의 벡터 출력:
    • 중복을 제거한 후의 벡터를 출력하면 여전히 중복된 요소가 포함된 상태입니다.
    • 출력 결과는:
    코드 복사
    1 3 4 5 6 6 6 6 6
    • 여기서 보듯이, 중복된 요소들이 뒤쪽에 남아 있지만 앞쪽에는 고유한 값들만 위치합니다.
  7. cpp
    코드 복사
    for (int item : my_vec) cout << item << " ";
  8. my_vec.erase(it, my_vec.end());:
    • erase() 함수는 벡터에서 지정된 범위의 요소를 실제로 삭제합니다.
    • **it**는 **unique()**가 반환한 반복자이며, 이 위치부터 벡터의 끝까지의 요소가 삭제됩니다.
    • 이 작업 후 **my_vec**은 **{1, 3, 4, 5, 6}**로 변합니다.
  9. 중복 제거 후 최종 벡터 출력:
    • 최종적으로 중복이 제거된 벡터를 출력합니다.
    • 출력 결과는:
    코드 복사
    1 3 4 5 6
  10. cpp
    코드 복사
    for (int item : my_vec) cout << item << " ";

최종 출력 결과

이 프로그램을 실행하면 다음과 같은 결과가 출력됩니다:

코드 복사
1 1 3 4 4 5 6 6 6 1 3 4 5 6 6 6 6 6 1 3 4 5 6

요약

  • 이 프로그램은 벡터의 요소를 정렬하고, 중복된 요소를 제거하는 과정입니다.
  • **sort()**는 벡터를 오름차순으로 정렬하고, **unique()**는 중복된 값을 제거한 뒤의 범위를 반환하지만, 실제로 중복된 값들은 그대로 남아 있습니다.
  • **erase()**를 통해 중복된 요소들을 벡터에서 실제로 삭제하여 최종적으로 중복 없는 벡터가 됩니다.