Прежде всего. Есть миллион решений вашей проблемы. Каждый может использовать то, что он хочет. Стили разные. Новичкам, как правило, нравятся решения C -Style более, чем сложные и "современные C ++" решения.
Я мое очень скромное мнение, (только мое личное мнение) ответ пользователя "super" (+1) - намного лучше, чем принятый ответ от пользователя "selb ie". Но OP принял его и, следовательно, это наиболее подходящий ответ для OP.
Я хотел бы показать дополнительное решение, такое же, как и у пользователя "super", только с использованием "более современного" C ++. elements.
У вас есть 2-мерное std::vector
. Это очень хороший подход. Теперь вы хотите преобразовать эти std::vector
из std::vector
из std::string
в другой тип данных. Вы даже использовали тег «transform» в своем вопросе.
Для такого преобразования вы можете использовать функцию из библиотеки C ++, которая была сделана именно для этой цели. Он называется std::transform
.
Он превращает элементы из контейнера в нечто иное. Он выполняет итерацию по каждому элементу в контейнере, а затем использует «функцию», например, лямбду, для преобразования этого элемента.
Для двухмерных векторов нам необходимо применить std::transform
для каждого измерения.
И поскольку такая выделенная функция существует в C ++, я бы порекомендовал использовать ее.
См. Пример ниже:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
int main() {
// The source data
std::vector<std::vector<std::string>> vvs{ {"1","2","3","4"},{"5","6","7","8"},{"9","10","11","12"},{"13","14","15","16"}};
// Here we will store the result
std::vector<std::vector<double>> vvd{};
// Transform 2 dimensional vector
// Outer vector
std::transform(vvs.begin(), vvs.end(), std::back_inserter(vvd), [](const std::vector<std::string>&vs) {
std::vector<double> vd{};
// Inner vector
std::transform(vs.begin(), vs.end(), std::back_inserter(vd), [](const std::string& s) { return std::stod(s); });
return vd;
});
// Show debug output
std::for_each(vvd.begin(), vvd.end(), [](const std::vector<double>& vd) {
std::copy(vd.begin(), vd.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << "\n"; });
return 0;
}
Но, как уже было сказано, каждый может сделать, что он хочет.