「std::swap」の版間の差分

提供: C++入門
移動: 案内検索
 
(同じ利用者による、間の1版が非表示)
行1: 行1:
<!--
+
[[std::swap]]は、<u>2つのオブジェクトの値を入れ替える</u>、'''テンプレート関数'''です。一般的な型に加え、[[std::vector]]などのコンテナや[[std::unique_ptr]]などの[[スマートポインタ]]のスワップも可能です。
vim: filetype=mediawiki
+
-->
+
  
読み方
+
'''読み方'''
 
;[[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">
g++  std_swap.cpp -o std_swap
+
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

関連項目