💡 퀵 접속: cpp.kr/swap_ranges

swap_ranges

C++ 표준 라이브러리의 알고리즘으로, 두 범위의 요소들을 서로 교환합니다. swap_ranges는 원본 범위를 직접 수정하며, 두 범위의 요소 타입이 같아야 합니다. 이 함수는 [first1, last1) 범위의 각 요소를 [first2, first2 + (last1 - first1)) 범위의 해당 요소와 교환합니다.

기본 사용법

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2 = {10, 20, 30, 40, 50};
    
    std::cout << "교환 전:" << std::endl;
    std::cout << "v1: ";
    for (int x : v1) std::cout << x << " ";
    std::cout << "\nv2: ";
    for (int x : v2) std::cout << x << " ";
    std::cout << std::endl;
    
    // 두 벡터의 요소들 교환
    std::swap_ranges(v1.begin(), v1.end(), v2.begin());
    
    std::cout << "\n교환 후:" << std::endl;
    std::cout << "v1: ";
    for (int x : v1) std::cout << x << " ";
    std::cout << "\nv2: ";
    for (int x : v2) std::cout << x << " ";
    std::cout << std::endl;
    
    return 0;
}

실행 결과:

교환 전:
v1: 1 2 3 4 5 
v2: 10 20 30 40 50 

교환 후:
v1: 10 20 30 40 50 
v2: 1 2 3 4 5

문자열에서 사용

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string s1 = "Hello";
    std::string s2 = "World";
    
    std::cout << "교환 전:" << std::endl;
    std::cout << "s1: " << s1 << std::endl;
    std::cout << "s2: " << s2 << std::endl;
    
    // 두 문자열의 문자들 교환
    std::swap_ranges(s1.begin(), s1.end(), s2.begin());
    
    std::cout << "\n교환 후:" << std::endl;
    std::cout << "s1: " << s1 << std::endl;
    std::cout << "s2: " << s2 << std::endl;
    
    return 0;
}

실행 결과:

교환 전:
s1: Hello
s2: World

교환 후:
s1: World
s2: Hello

사용자 정의 타입에서 사용

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

class Person {
    std::string name;
    int age;
public:
    Person(const std::string& n, int a) : name(n), age(a) {}
    
    void print() const {
        std::cout << name << " (" << age << "세)" << std::endl;
    }
};

int main() {
    std::vector<Person> v1 = {
        Person("Alice", 20),
        Person("Bob", 30),
        Person("Charlie", 40)
    };
    
    std::vector<Person> v2 = {
        Person("David", 25),
        Person("Eve", 35),
        Person("Frank", 45)
    };
    
    std::cout << "교환 전:" << std::endl;
    std::cout << "v1:" << std::endl;
    for (const auto& p : v1) p.print();
    std::cout << "v2:" << std::endl;
    for (const auto& p : v2) p.print();
    
    // 두 벡터의 요소들 교환
    std::swap_ranges(v1.begin(), v1.end(), v2.begin());
    
    std::cout << "\n교환 후:" << std::endl;
    std::cout << "v1:" << std::endl;
    for (const auto& p : v1) p.print();
    std::cout << "v2:" << std::endl;
    for (const auto& p : v2) p.print();
    
    return 0;
}

실행 결과:

교환 전:
v1:
Alice (20세)
Bob (30세)
Charlie (40세)
v2:
David (25세)
Eve (35세)
Frank (45세)

교환 후:
v1:
David (25세)
Eve (35세)
Frank (45세)
v2:
Alice (20세)
Bob (30세)
Charlie (40세)

참고사항

  • swap_ranges는 algorithm 헤더에 정의되어 있습니다.
  • 원본 범위를 직접 수정합니다.
  • 시간 복잡도는 O(n)입니다.
  • 두 범위의 요소 타입이 같아야 합니다.
  • 두 번째 범위는 첫 번째 범위와 같은 크기여야 합니다.
  • 두 범위가 겹치면 안 됩니다.
  • 사용자 정의 타입에 대해서는 이동 생성자와 이동 대입 연산자가 정의되어 있어야 합니다.
  • std::move를 사용하여 이동 시맨틱을 활용할 수 있습니다.
  • swap은 단일 요소를 교환하는 버전입니다.
  • iter_swap은 두 반복자가 가리키는 요소들을 교환하는 버전입니다.
함수 설명
swap_ranges(first1, last1, first2) [first1, last1) 범위의 각 요소를 [first2, first2 + (last1 - first1)) 범위의 해당 요소와 교환