「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.

関連項目