我在将字符串 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]arr1matrix[1]arr2,依此类推。
    我们还可以通过auto arr1 = std::move(matrix[0]);快速获取它们的内部指针。

    关于c++ - 将 vector 拆分为多个数组/vector C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54424591/

    10-09 21:19
    查看更多