我在将字符串 vector 拆分为较小的整数vector \ array时遇到问题。我的输入 vector 数据如下所示:
std::vector<std::string> v(2);
v[0] = "0 14 150";
v[1] = "1 2 220";
//...
我知道一种解决方案,可以制作三个数组并使用sstream将数据转换为整数。但我要避免制作“意大利面条”代码。
谢谢,
彼得
最佳答案
编辑:我删除了详细的转置函数。
我假设您想将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>
。 因此,以下功能将为您工作,至少对我来说,它似乎不是意大利面条式的代码。
首先,此函数从传递的字符串 vector
{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;
}
然后,您可以从字符串 vector 中提取整数,如下所示:
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]);
快速获取它们的内部指针。关于c++ - 将 vector 拆分为多个数组/vector C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54424591/