I have data like this
4.0 0.8
4.1 0.7
4.4 1.1
3.9 1.2
4.0 1.0
I have written my program
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
vector<double> v;
ifstream in("primer.dat");
double word;
while(in >> word)
v.push_back(word);
for(int i = 0; i < v.size(); i++)
cout << v[i] << endl;
}
But now I have realized that for further calculations in my code,I need data as (vector <vector> double)
.I would prefer not to reshape the vector.Is it possible to read data as vector of vectors?
Try the following
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <sstream>
#include <string>
int main()
{
std::vector<std::vector<double>> v;
std::ifstream in( "primer.dat" );
std::string record;
while ( std::getline( in, record ) )
{
std::istringstream is( record );
std::vector<double> row( ( std::istream_iterator<double>( is ) ),
std::istream_iterator<double>() );
v.push_back( row );
}
for ( const auto &row : v )
{
for ( double x : row ) std::cout << x << ' ';
std::cout << std::endl;
}
}
Not sure if I fully understand what you meant but if I did this code should work just fine then:
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
using namespace std;
std::vector<std::string> split(const std::string& str, char sep)
{
std::vector<std::string> result;
std::istringstream iss(str);
std::string sub;
while (std::getline(iss, sub, sep))
result.push_back(sub);
return result;
}
int main() {
vector<vector<double> > completeVector ;
ifstream in("primer.dat");
string word;
while(in >> word){
std::vector<std::string> splitS = split(word, ' ');
std::vector<double> line ;
for(int i = 0 ; i < splitS.size() ; i++){
line.push_back(stod(splitS[i]));
}
completeVector.push_back(line);
}
// For printing out the result
for(int i = 0 ; i < completeVector.size() ; i++){
std::vector<double> tmp = completeVector[i];
for(int j = 0 ; j < tmp.size() ; j++){
std::cout << tmp[j] << std::endl ;
}
}
}
It compiles for sure and it should have the behaviour that you're looking for.
If it doesn't let me know in the comments.
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
vector<vector<double>> v;
ifstream in("primer.dat");
string line;
while(std::getline(in, line))
{
v.push_back(vector<double>());
stringstream ss(line);
double word;
while(ss >> word)
{
v.back().push_back(word);
}
}
for(int i = 0; i < v.size(); i++)
{
for(int j = 0; j < v[i].size(); j++)
{
cout << v[i][j] << ' ';
}
cout << endl;
}
}