【问题标题】:convert string vector into double 2-d array vector将字符串向量转换为双二维数组向量
【发布时间】:2016-06-23 01:48:53
【问题描述】:

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

我从一个文件中读取了 500x9 的向量字符串数据,

vector<string> line;

我需要将此字符串向量转换为大小为 2D 向量数组(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);

}

【问题讨论】:

  • 这里有个建议:打开一个编辑器,写一些代码。
  • @Barmar .. 感谢您对编辑的帮助...,不,它的方式不同,我已经能够从 .txt 文件而不是 csv 读取数据,我的主要问题是将字符串向量转换为2d - 双精度向量.. 稍后我将不得不提取单个列
  • 这有什么不同?您有一个逗号分隔的数字列表,CSV 阅读器将返回一个二维向量。
  • 好吧,第一,它不是逗号分隔的..它只是空格,我认为它可以用一两行代码解决..而不是像在那个问题中那样创建新类我有问题这行代码..这应该将字符串转换为双精度。 ..如果我错了,请纠正我? std::transform(lines.begin(),lines.end(),data.begin(),std::stod);感谢您的帮助

标签: c++ string vector 2d-vector


【解决方案1】:

我是标准算法的忠实拥护者。但我相信你最好的情况是一个很好的老式while-loop(如果你不确定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&amp;, size_t*) 还是 double stod(const wstring&amp;, size_t*)
  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), static_cast&lt;double (*)(const string&amp;, size_t*)&gt;(stod)) 不起作用,因为函数指针不保留默认的第二个参数
  • transform(cbegin(lines), cend(lines), begin(d[i / 9]), bind(static_cast&lt;double (*)(const string&amp;, size_t*)&gt;(stod), placeholders::_1, 0)) 确实与 lambda 等效

【讨论】:

  • 谢谢乔纳森..非常感谢您的时间和精力..虽然我也设法以另一种方式做到了,但这种方法效果很好:)
  • 顺便说一下,由于我在示例中没有这样做,您可以使用:for(const auto&amp; i : d) copy(cbegin(i), cend(i), ostream_iterator&lt;double&gt;(cout, "\t")); 打印d
猜你喜欢
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多