C 20は、従来のループ構築物と比較して、より表現力豊かで構成可能なデータを操作する方法を提供するRanges Libraryを導入しました。データ操作に効果的に範囲を使用するには、次の概念と手順を理解する必要があります。
Range
、 View
、 Iterator
などの特定の概念によって定義されます。 Range
、繰り返すことができる一連の値です。 View
、より複雑な操作を作成するために構成できる軽量で所有の範囲です。範囲アダプター:これらは、入力として範囲を取得し、新しい範囲を返す関数です。一般的なアダプターには、 filter
、 transform
、 take
、 drop
が含まれます。例えば:
<code class="cpp">#include <ranges> #include <vector> #include <iostream> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6}; auto even_numbers = numbers | std::views::filter([](int i){ return i % 2 == 0; }); for (auto num : even_numbers) { std::cout </int></iostream></vector></ranges></code>
このコードは、ベクトルnumbers
から偶数を除外します。
パイプライン:複数のアダプターをチェーンして、より複雑なデータ操作のためのパイプラインを作成できます。
<code class="cpp">auto result = numbers | std::views::filter([](int i){ return i % 2 == 0; }) | std::views::transform([](int i){ return i * 2; });</code>
このパイプラインは最初に偶数をフィルタリングし、次に各番号を2倍にすることで変換します。
範囲アルゴリズム: <algorithm></algorithm>
ライブラリは、範囲で動作するように拡張されています。例えば:
<code class="cpp">auto sum = std::accumulate(numbers | std::views::filter([](int i){ return i % 2 == 0; }), 0);</code>
これにより、偶数の合計がnumbers
で計算されます。
これらの概念を習得することにより、データ操作のためのより読みやすく簡潔なコードを書くことができ、プログラムをより維持可能で表現力豊かにすることができます。
C 20範囲を使用すると、データ操作のための従来のループよりもいくつかの利点があります。
はい、C 20範囲は複雑なデータ変換を大幅に簡素化できます。方法は次のとおりです。
チェーン操作:複数の範囲アダプターをチェーンして、単一の読み取り可能なパイプラインで一連の変換を実行できます。例えば:
<code class="cpp">auto result = numbers | std::views::filter([](int i){ return i % 2 == 0; }) | std::views::transform([](int i){ return i * i; }) | std::views::take(3);</code>
このパイプラインは偶数をフィルタリングし、それらを二乗し、最初の3つの結果を取得します。
カスタムアダプター:複雑な変換をカプセル化するためにカスタムレンジアダプターを作成して、コードをよりモジュール化し、再利用可能にすることができます。例えば:
<code class="cpp">auto square_if_even = [](auto&& range) { return std::views::filter(range, [](int i){ return i % 2 == 0; }) | std::views::transform([](int i){ return i * i; }); }; auto result = square_if_even(numbers);</code>
これらの機能を活用することにより、複雑なデータ変換をより小さく、より管理しやすい部分に分解し、コードを書き、理解し、維持しやすくすることができます。
C 20範囲を既存のコードベースに統合することは、データ操作効率を高めるために体系的に実行できます。ここにいくつかのステップと考慮事項があります:
リファクタリング:コードのこれらの部分のリファクトを開始します。たとえば、ベクトルをフィルターと変換するネストされたループを範囲パイプラインに変換します。
<code class="cpp">// Before std::vector<int> result; for (int num : numbers) { if (num % 2 == 0) { result.push_back(num * 2); } } // After auto result = numbers | std::views::filter([](int i){ return i % 2 == 0; }) | std::views::transform([](int i){ return i * 2; });</int></code>
これらの手順に従うことにより、C 20範囲を既存のコードベースに徐々に効果的に統合し、より表現力豊かで効率的で保守可能なデータ操作コードにつながることができます。
以上がより表現力のあるデータ操作のために、C 20の範囲を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。