C++98 에서와 C++11 에서의 swap 함수 사용법 비교
C++98 에서는 swap 함수를 쓸려면 #include <algorithm> 을 했지만, C++0x 와 C++11 에서는 #include <utility> 로 바뀌었다.
또 빝트인 타입의 데이터를 swap 할 때는 이전 처럼 std::swap(dat1. data2) 하지만, 빌트인 타입이 아닌 데이터를 swap 할 때는 std:: 를 붙이지 않고 swap(data1, data2) 로 해야 한다.
Visual C++ 의 cl 로 컴파일할려면 Visual Studio 2008 이상이면 되고. g++ 로 컴파일할려면 g++ 4.5.x 이상이면 된다.
만약 Haskell Platform 에 설치된 g++ 4.5.2 로 컴파일할려면 옵션 -enable-auto-import 를 추가하면 성공작으로 컴파일될 것이다.
다음 소스의 컴파일과 실행을 테스트한 환경은
Visual C++ 2008
Visual C++ 2010
Visual C++ 2012
Visual C++ 2013
gcc 4.5.2
gcc 4.5.3
gcc 4.6.2
gcc 4.7.0
gcc 4.8.0
gcc 4.8.1
이다.
// Filename: testSwap.cpp
//
// Test swap functions of C++98 and C++11 specifications.
//
// Compile: cl /EHsc testSwap.cpp
// Compile: g++ -std=c++11 -o testSwap testSwap.cpp
// Compile: g++ -std=c++0x -o testSwap testSwap.cpp
//
// See for detail: http://www.cplusplus.com/reference/algorithm/swap/
#include <iostream> // std::cout
// #include <algorithm> // std::swap since C++98
#include <utility> // std::swap and swap since C++0x
#include <vector> // std::vector
#include <string> // std::string
template <typename T>
void printVector(std::vector<T> v)
{
std::cout << '[';
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
std::cout << ' ' << *it;
std::cout << " ]\n";
}
int main () {
int x = 10, y = 20; // x:10 y:20
std::swap(x, y); // x:20 y:10
std::vector<int> foo (4,x), bar (6,y); // foo:4x20 bar:6x10
// std::swap(foo, bar); // foo:6x10 bar:4x20 since C++98
swap(foo, bar); // foo:6x10 bar:4x20 since C++0x
std::cout << "foo contains:";
for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
std::cout << '\n';
std::string s1 = "Hello,";
std::string s2 = "world!";
std::cout << s1 << ' ' << s2 << std::endl;
std::cout << '\n';
std::cout << "Swapping two strings..." << std::endl;
s1.swap(s2);
std::cout << s1 << ' ' << s2 << std::endl;
std::cout << '\n';
std::vector<int> v1(10, 7);
std::vector<int> v2(5, -1);
std::cout << "v1 = [";
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it)
std::cout << ' ' << *it;
std::cout << " ]\n";
std::cout << "v2 = [";
for (std::vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
std::cout << ' ' << *it;
std::cout << " ]\n";
std::cout << '\n';
std::cout << "Swapping two vectors..." << std::endl;
v1.swap(v2);
std::cout << "v1 =";
printVector(v1);
std::cout << "v2 = ";
printVector(v2);
return 0;
}
/*
Output:
foo contains: 10 10 10 10 10 10
Hello, world!
Swapping two strings...
world! Hello,
v1 = [ 7 7 7 7 7 7 7 7 7 7 ]
v2 = [ -1 -1 -1 -1 -1 ]
Swapping two vectors...
v1 =[ -1 -1 -1 -1 -1 ]
v2 = [ 7 7 7 7 7 7 7 7 7 7 ]
*/