「std::replace」の版間の差分
提供: C++入門
(ページの作成:「C++のstd::replace とは、レンジ内にある値で、指定された値を新しい値に変更するテンプレート関数です。例えば、配列内の指...」) |
(相違点なし)
|
2015年11月7日 (土) 00:25時点における最新版
C++のstd::replace とは、レンジ内にある値で、指定された値を新しい値に変更するテンプレート関数です。例えば、配列内の指定した値を別の値に変更できます。for文でループを回して、値を比較して、代入する、といったコードを書かずに済ませられます。
読み方
- std::replace
- えすてぃーでぃー りぷれいす
目次
概要
例えば、以下の配列があったときに
array<int,5> my_array = { 1,2,3,3,4 };
3を10に変更するには、
std::replace(my_array.begin(), my_array.end(), 3, 10);
を呼び出すと
1,2,10,10,4
となります。
for文でループを回して、値を比較して、代入する、といったコードを書かずに済ませられます。
std_replace1.cpp の例
ソースコード std_replace1.cpp
ラムダ式を利用しています。ラムダ式がよくわからない場合には、ラムダ式をご参照下さい。
/* * std_replace1.cpp * Copyright (C) 2015 kaoru <kaoru@localhost> */ #include <iostream> #include <algorithm> #include <array> #include <functional> int main(int argc, char const* argv[]) { auto dump = [](auto a) { for(auto i:a) { std::cout<<i<<" ";} std::cout<<std::endl; }; std::array<int, 5> a1{1,2,3,4,5}; std::array<int, 5> a2{1,2,2,2,5}; std::replace(a1.begin(), a1.end(), 3, 0); std::replace(a2.begin(), a2.end(), 2, 0); dump(a1); dump(a2); return 0; }
コンパイル
clang++36 --std=c++14 std_replace1.cpp -o std_replace1
実行例
% ./std_replace1 1 2 0 4 5 1 0 0 0 5
エラー
g++49 でコンパイルできなかった
g++でなぜか、コンパイルできなかったので、clang++でコンパイルしました。
$ g++49 --std=c++14 std_replace1.cpp In file included from /usr/local/lib/gcc49/include/c++/random:38:0, from /usr/local/lib/gcc49/include/c++/bits/stl_algo.h:66, from /usr/local/lib/gcc49/include/c++/algorithm:62, from std_replace1.cpp:9: /usr/local/lib/gcc49/include/c++/cmath:1064:11: error: '::erfl' has not been declared using ::erfl; ^ /usr/local/lib/gcc49/include/c++/cmath:1068:11: error: '::erfcl' has not been declared using ::erfcl; ^ /usr/local/lib/gcc49/include/c++/cmath:1104:11: error: '::lgammal' has not been declared using ::lgammal; ^ /usr/local/lib/gcc49/include/c++/cmath:1176:11: error: '::tgammal' has not been declared using ::tgammal;
error: 'auto' not allowed in function prototype
はじめは、dump()は、ラムダ式ではなく、普通の関数として、定義していました。
void dump(auto a) { for (auto i: a) { std::cout << i << " "; } std::cout << std::endl; }
しかし、auto型を関数の引数に指定したら、コンパイルできませんでした。ラムダ式に置き換えることで、問題はなくなりました。
$ clang++36 --std=c++14 std_replace1.cpp std_replace1.cpp:14:6: error: 'auto' not allowed in function prototype dump(auto a) { ^~~~ std_replace1.cpp:28:2: error: no matching function for call to 'dump' dump(a1); ^~~~ std_replace1.cpp:14:1: note: candidate function not viable: no known conversion from 'std::array<int, 5>' to 'int' for 1st argument dump(auto a) { ^ std_replace1.cpp:29:2: error: no matching function for call to 'dump' dump(a2); ^~~~ std_replace1.cpp:14:1: note: candidate function not viable: no known conversion from 'std::array<int, 5>' to 'int' for 1st argument dump(auto a) { ^ 3 errors generated.