-1

vector<string>line をvector<vector <double> >dに変換する良い方法は何ですか?

ファイルから500x9のベクトル文字列データを読み取っていますが、

vector<string> line;

この文字列ベクトルをサイズ (500 行、9 列) の 2D ベクトル配列に変換する必要があります。

vector<vector <double> > d;

コード:

using namespace std;

int main()
{

    /// read file data ///
    std::ifstream myfile;
    myfile.open("somefile.txt");
    std::vector<string> lines;
    std::string str;
    while(getline(myfile,str))
        lines.push_back(str);
    myfile.close();

    std::vector< std::vector<double> > data;
    /// convert string to double ///
    std::transform(lines.begin(), lines.end(), data.begin(), std::stod);

}
4

1 に答える 1

1

私は、標準アルゴリズムの大ファンです。しかし、ここでのあなたの最良のケースは古き良きファッションループだと思います(これは、9で割り切れるwhileかわからない場合に特に当てはまります:イテレータを使用して配列を不等サイズの部分に分割しますline

vector<vector<double>> d(line.size() / 9, vector<double>(9));

for(auto i = 0U; i + 9 <= line.size(); i += 9) {
    transform(next(cbegin(line), i), next(begin(line), i + 9), begin(d[i / 9]), [](const auto& it){return stod(it);});
}

Live Example

への呼び出しがstodラムダでラップされていることに注意してください。

  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), stod)コンパイラはあなたが呼び出しているのか、double stod(const string&, size_t*)それともdouble stod(const wstring&, size_t*)
  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), static_cast<double (*)(const string&, size_t*)>(stod))デフォルトの 2 番目の引数が関数ポインタによって保持されないため、機能しません
  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), bind(static_cast<double (*)(const string&, size_t*)>(stod), placeholders::_1, 0))ラムダと同等に機能します
于 2016-06-23T02:49:12.623 に答える