アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【C/C++
通常のC言語配列にstd::for_each,find_if等のC++ラムダ式ループを適用する
POSTED BY
2023-01-19

std::for_each,find_if,sort,accumulate等のC++ラムダ式ループ構文はvector.begin(),end()だけでなく、通常のC言語配列に対してもループできる。

この場合はvector.begin()の代わりに配列の先頭アドレス=array[5]ならarray、vector.end()の代わりに配列の先頭アドレス+要素数=array[5]ならarray + 5と記載するだけでよい。

サンプルは以下。

C/C++ramda_loop_for_carray.cppGitHub Source
#include <iostream>
#include <cstring>
#include <algorithm>

int main(void) {
  struct {
    char key[32];
    char value[64];
  }arrays[8] = {
    {"きー1", "ばりゅー1"},
    {"きー2", "ばりゅー2"},
    {"きー3", "ばりゅー3"},
    {"きー4", "ばりゅー4"},
    {"きー5", "ばりゅー5"},
    {"きー6", "ばりゅー6"},
    {"きー7", "ばりゅー7"},
    {"きー8", "ばりゅー8"},
  };

  //ループ出力
  std::for_each(arrays, arrays + 8, [&](auto &c) {
    std::cout << c.key << "+" << c.value << std::endl;
  });

  //値に5を含む要素の検索
  auto itr = std::find_if(arrays, arrays + 8, [&](auto &c) {
    return strstr(c.value, "5") ? true:false;
  });
  if(itr != arrays + 8) {
    //発見した場合itrは要素のアドレス: itr->key, itr->valueでアクセス可能
    int i = std::distance(arrays, itr);
    std::cout << "arrays[" << i << "].valueに5発見" << std::endl;
  }

  return 0;
}

コンパイル、実行結果

g++ ramda_loop_for_carray.cpp
./a.out

きー1+ばりゅー1
きー2+ばりゅー2
きー3+ばりゅー3
きー4+ばりゅー4
きー5+ばりゅー5
きー6+ばりゅー6
きー7+ばりゅー7
きー8+ばりゅー8
arrays[4].valueに5発見

ループで渡ってくる参照引数cは対象配列内要素そのものなので、構造体配列なら.で各値にアクセス可能。

find_ifも適用可能で、条件を満たす要素が見つかったらfind_ifループを抜ける。

itrには発見要素のアドレスが返るので、itr→key、itr→valueでアクセス可能。未発見ならvector.end()に代わりarrays + 8がitrに返る。

何番目の要素かstd::distanceにitrを指定して配列のindexも取得できる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】