「std::swap」の版間の差分
提供: C++入門
(同じ利用者による、間の1版が非表示) | |||
行1: | 行1: | ||
− | + | [[std::swap]]は、<u>2つのオブジェクトの値を入れ替える</u>、'''テンプレート関数'''です。一般的な型に加え、[[std::vector]]などのコンテナや[[std::unique_ptr]]などの[[スマートポインタ]]のスワップも可能です。 | |
− | + | ||
− | + | ||
− | 読み方 | + | '''読み方''' |
;[[std::swap]]:えすてぃーでぃー すわっぷ | ;[[std::swap]]:えすてぃーでぃー すわっぷ | ||
行9: | 行7: | ||
== 概要 == | == 概要 == | ||
− | |||
[[std::swap]] は、2つのオブジェクトの値を交換します。 | [[std::swap]] は、2つのオブジェクトの値を交換します。 | ||
行25: | 行22: | ||
std::swap(a,b); | std::swap(a,b); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | == ヘッダファイル == | |
− | + | <syntaxhighlight lang="cpp"> | |
+ | #include <algorithm> // C++11以前 | ||
+ | #include <utility> // C++11から | ||
+ | </syntaxhighlight> | ||
== std::swapのシンプルな例 == | == std::swapのシンプルな例 == | ||
− | |||
=== ソースコード std_swap.cpp === | === ソースコード std_swap.cpp === | ||
− | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> // std::cout | #include <iostream> // std::cout | ||
行47: | 行45: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
=== コンパイル === | === コンパイル === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | c++ std_swap.cpp -o std_swap | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
=== 実行例 === | === 実行例 === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
% ./std_swap | % ./std_swap | ||
x=20 y=10 | x=20 y=10 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== 配列を swap する例 == | == 配列を swap する例 == | ||
− | |||
=== ソースコード std_swap_2.cpp === | === ソースコード std_swap_2.cpp === | ||
− | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> // std::cout | #include <iostream> // std::cout | ||
行86: | 行77: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
=== コンパイル === | === コンパイル === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++48 -std=c++11 std_swap_2.cpp -o std_swap_2 | g++48 -std=c++11 std_swap_2.cpp -o std_swap_2 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
=== 実行例 === | === 実行例 === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
% ./std_swap_2 | % ./std_swap_2 | ||
10 20 30 40 | 10 20 30 40 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == ベクターコンテナを入れ替える例 == | ||
+ | === std_swap_3.cpp === | ||
+ | [[std::vector]]の初期化には、[[C++11]]で導入された [[std::initializer_list]] を使用しています。以下のコードは、[[C++14]]に対応したコンパイラが必要です。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | /* | ||
+ | * std_swap_3.cpp | ||
+ | * Copyright (C) 2015 kaoru <kaoru@localhost> | ||
+ | */ | ||
+ | #include <utility> | ||
+ | #include <string> | ||
+ | #include <iostream> | ||
+ | #include <vector> | ||
− | + | void | |
+ | print(auto container) { | ||
+ | for (auto x: container) { | ||
+ | std::cout << x << " "; | ||
+ | } | ||
+ | std::cout << std::endl; | ||
+ | } | ||
+ | int main(int argc, char const* argv[]) | ||
+ | { | ||
+ | std::vector<std::string> v1 {"a","b","c"}, v2 {"x","y","z"}; | ||
+ | std::swap(v1, v2); | ||
+ | print(v1); | ||
+ | print(v2); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | === コンパイル === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | c++49 -std=c++14 std_swap_3.cpp | ||
+ | </syntaxhighlight> | ||
+ | === 実行例 === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ ./a.out | ||
+ | x y z | ||
+ | a b c | ||
+ | </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == | ||
− | |||
* [[C++ライブラリ]] | * [[C++ライブラリ]] | ||
+ | * [[std::copy]] | ||
+ | * [[std::fill]] | ||
+ | <!-- vim: filetype=mediawiki | ||
+ | --> |
2015年11月5日 (木) 23:58時点における最新版
std::swapは、2つのオブジェクトの値を入れ替える、テンプレート関数です。一般的な型に加え、std::vectorなどのコンテナやstd::unique_ptrなどのスマートポインタのスワップも可能です。
読み方
- std::swap
- えすてぃーでぃー すわっぷ
目次
概要
std::swap は、2つのオブジェクトの値を交換します。
たとえば、こういったコードをわざわざ書くことはありません。
int a = 0, b = 100, t; t = a; a = b; b = t;
上記は、こうなります。
int a = 0, b = 100; std::swap(a,b);
ヘッダファイル
#include <algorithm> // C++11以前 #include <utility> // C++11から
std::swapのシンプルな例
ソースコード std_swap.cpp
#include <iostream> // std::cout #include <utility> // std::swap int main(int argc, char *argv[]) { int x = 10, y = 20; std::swap (x, y); std::cout << "x=" << x << " y=" << y << std::endl; return 0; }
コンパイル
c++ std_swap.cpp -o std_swap
実行例
% ./std_swap x=20 y=10
配列を swap する例
ソースコード std_swap_2.cpp
#include <iostream> // std::cout #include <utility> // std::swap int main(int argc, char *argv[]) { int foo[4]; // ? ? ? ? int bar[] = {10,20,30,40}; std::swap (foo, bar); // foo: 10 20 30 40 // bar: ? ? ? ? for ( int i: foo ) { std::cout << ' ' << i; } std::cout << std::endl; return 0; }
コンパイル
g++48 -std=c++11 std_swap_2.cpp -o std_swap_2
実行例
% ./std_swap_2 10 20 30 40
ベクターコンテナを入れ替える例
std_swap_3.cpp
std::vectorの初期化には、C++11で導入された std::initializer_list を使用しています。以下のコードは、C++14に対応したコンパイラが必要です。
/* * std_swap_3.cpp * Copyright (C) 2015 kaoru <kaoru@localhost> */ #include <utility> #include <string> #include <iostream> #include <vector> void print(auto container) { for (auto x: container) { std::cout << x << " "; } std::cout << std::endl; } int main(int argc, char const* argv[]) { std::vector<std::string> v1 {"a","b","c"}, v2 {"x","y","z"}; std::swap(v1, v2); print(v1); print(v2); return 0; }
コンパイル
c++49 -std=c++14 std_swap_3.cpp
実行例
$ ./a.out x y z a b c