-1

vector<string>将line 转换为vector<vector <double> >d的好方法是什么?

我从文件中读取了 500x9 矢量字符串数据,

vector<string> line;

我需要将此字符串向量转换为大小的二维向量数组(500 行,9 列)

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

我是你能找到的标准算法的忠实粉丝。但我相信你最好的情况是一个很好的老式while循环(如果你不确定它line可以被 9 整除,尤其如此:Using an iterator to Divide an Array into Parts with Unequal Size

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包含在 lambda 中。

  • 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))将不起作用,因为函数指针未保留默认的第二个参数
  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), bind(static_cast<double (*)(const string&, size_t*)>(stod), placeholders::_1, 0))确实与 lambda 等效
于 2016-06-23T02:49:12.623 回答