将字符串向量转换为双二维数组向量
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&, 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 等效
【讨论】:
谢谢乔纳森..非常感谢您的时间和精力..虽然我也设法以另一种方式做到了,但这种方法效果很好:) 顺便说一下,由于我在示例中没有这样做,您可以使用:for(const auto& i : d) copy(cbegin(i), cend(i), ostream_iterator<double>(cout, "\t"));
打印d
以上是关于将字符串向量转换为双二维数组向量的主要内容,如果未能解决你的问题,请参考以下文章