C でさまざまなカウントを持つテキスト ファイルの整数をベクトルに効率的に解析する方法

Patricia Arquette
リリース: 2024-10-30 19:54:30
オリジナル
495 人が閲覧しました

How to Efficiently Parse Integers from a Text File with Varying Counts into a Vector in C  ?

C ifstream を使用したテキスト ファイルからの整数の読み取り

テキスト ファイルからグラフ隣接情報を読み取ろうとすると、さまざまな数の整数が次で終わる行に遭遇することがあります。 「ん」。 getline() メソッドを使用して各行を個別に取得すると、整数の数が一貫していないため、各行を正確に解析することが困難になります。この問題に対処し、これらの値をベクトルに効率的に格納するための戦略が模索されています。

従来のアプローチでは、getline() によって読み取られた各行を反復処理し、istringstream オブジェクトを利用して各行を解析する必要があります。整数は順番に読み取られるため、それらをベクトルに追加し、必要に応じてさらに操作することができます。次のコードは、このアプローチの例を示しています。

<code class="cpp">#include <fstream>
#include <sstream>
#include <string>
#include <vector>

int main() {
  std::ifstream infile("thefile.txt");
  std::string line;

  while (std::getline(infile, line)) {
    std::istringstream iss(line);
    int n;
    std::vector<int> v;

    while (iss >> n) {
      v.push_back(n);
    }

    // Do something with v
  }
}</code>
ログイン後にコピー

別の解決策には、単一行の for ループが含まれます。 istream_iterator クラスを利用すると、値をベクトルに直接読み取ることができるため、中間コンテナの必要性が減ります。 std::move.

<code class="cpp">#include <fstream>
#include <string>
#include <vector>

int main() {
  std::vector<std::vector<int>> vv;

  for (std::string line;
       std::getline(std::cin, line);
       vv.push_back(std::vector<int>(std::istream_iterator<int>(std::stay(std::istringstream(line))),
                                     std::istream_iterator<int>())
                    )
       ) { }
}</code>
ログイン後にコピー
から発生する可能性のある潜在的なダングリング参照を防ぐために、補助関数も使用されています。

以上がC でさまざまなカウントを持つテキスト ファイルの整数をベクトルに効率的に解析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート