Редактировать: Я удалил многословную функцию транспонирования.
Я предполагаю, что вы хотите преобразовать std::vector<std::string>
в 2D матрицу std::vector<std::vector<int>>
.Например, для вашего примера желаемый результат предполагается равным arr1 = {0,1,...}
, arr2 = {14,2,...}
и arr3 = {150,220,...}
.
Сначала
Мы можем использовать std::istream_iterator
для извлечения целых чисел из строк.
Мы также можем применить конструктор диапазона для создания std::vector<int>
, соответствующего каждой строке.
Таким образом, следующая функция будет работать для вас, и она не выглядит как код спагетти по крайней мере для меня.Во-первых, эта функция извлекает два целочисленных массива {0,14,150,...}
и {1,2,220,...}
как матрицы из переданного строкового вектора v
.Поскольку значение по умолчанию, std::istream_iterator
, является итератором конца потока, каждый конструктор диапазона считывает каждую строку до тех пор, пока ему не удастся прочитать следующее значение.И, наконец, возвращается транспонированное:
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
template <typename T>
auto extractNumbers(const std::vector<std::string>& v)
{
std::vector<std::vector<T>> extracted;
extracted.reserve(v.size());
for(auto& s : v)
{
std::stringstream ss(s);
std::istream_iterator<T> begin(ss), end; //defaulted end-of-stream iterator.
extracted.emplace_back(begin, end);
}
// this also validates following access to extracted[0].
if(extracted.empty()){
return extracted;
}
decltype(extracted) transposed(extracted[0].size());
for(std::size_t i=0; i<transposed.size(); ++i){
for(std::size_t j=0; j<extracted.size(); ++j){
transposed.at(i).push_back(std::move(extracted.at(j).at(i)));
}
}
return transposed;
}
Затем вы можете извлечь целые числа из строкового вектора следующим образом:
DEMO
std::vector<std::string> v(n);
v[0] = "0 14 150";
v[1] = "1 2 220";
...
v[n-1] = "...";
auto matrix = extractNumbers<int>(v);
, где matrix[0]
равно arr1
, matrix[1]
равно arr2
и т. Д. Мы также можем быстро получить их внутренние указатели по auto arr1 = std::move(matrix[0]);
.