2016-06-23 2 views
-1

Что такое хороший способ конвертировать vector<string> линия в vector<vector <double> > d?конвертировать вектор строки в двойной вектор 2-мерного массива

Я 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); 

} 
+2

Вот предложение: откройте редактор и напишите код. –

+0

Возможный дубликат [Как читать и анализировать CSV-файлы на C++?] (Http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c) – Barmar

+0

@Barmar .. спасибо за помощь в редактировании ..., нет, его путь разный, я уже умею читать данные из .txt-файла, а не csv, моя главная задача - преобразовать вектор-строку в 2d - вектор парных .. позже мне придется извлекать отдельные столбцы – ash

ответ

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 завернуты в лямбду.

  • 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)) работает аналогично лямбда
+0

Спасибо Джонатан .. высоко оценил ваше время и усилия .. этот метод работает хорошо, хотя я тоже удалось сделать это по-другому :) – ash

+0

Кстати, я не делал этого в своем примере, вы можете напечатать 'd', используя:' for (const auto & i: d) copy (cbegin (i), cend (i), ostream_iterator (cout, "\ t")); ' –

Смежные вопросы