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

Posted

技术标签:

【中文标题】将字符串向量转换为双二维数组向量【英文标题】: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);


【问题讨论】:

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

以上是关于将字符串向量转换为双二维数组向量的主要内容,如果未能解决你的问题,请参考以下文章

将 NumPy 向量转换为二维数组/矩阵

C++ RGB 图像数据叠加成二维数组(向量的向量)

将向量模拟为二维数组

使用 NULL 数组将内存分配给二维数组 (c)

在c ++ Qt中将二维向量/二维数组显示为简单图形

如何将 C# 中的二维数组传递给 C++ DLL?