将字符串向量转换为双二维数组向量

convert string vector into double 2-d array vector

vector<string> 行转换为 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);

}

我是标准算法的忠实拥护者。但我相信这里最好的情况是一个很好的老式 while-loop(如果您不确定 line 是否可以被 9 整除,则尤其如此:)

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
  • 等效