将字符串向量转换为双二维数组向量
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);});
}
请注意,对 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 等效
将 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);});
}
请注意,对 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 等效