【问题标题】:Build a string using recursion in c++在 C++ 中使用递归构建字符串
【发布时间】:2014-01-01 01:41:37
【问题描述】:

我有一个值矩阵(存储为值数组)和一个矩阵维数(dims[d0, d1, d2])的向量。 我需要构建一个这样的字符串: “matA(j, k, l) = x;” 其中 j, k, l 是矩阵的索引,x 是元素的值。我需要为矩阵的每个值和 2 到 n 维的矩阵写这个。

我在隔离基本情况并以有用的方式复制它时遇到了问题。我在开关盒中做了一个版本,每个维度都有一个案例,for 循环的数量等于维度的数量:

for (unsigned int k=1; k<=(dims[2]); k++)
{
for (unsigned int j=1; j<=(dims[1]); j++)
{
for (unsigned int i=1; i<=(dims[0]); i++)
{
strs << matName << "(" << i << "," << j << ","<< k << ")="<< tmp[t]<< "; ";
.... 

但这不是我想要的。对于具有可变维数的更一般情况有什么想法吗?

【问题讨论】:

  • 数据是否存储在一维数组中?
  • @interjay 是的,数据存储在一维数组中。

标签: c++ string recursion matrix


【解决方案1】:

您需要一个单独的工作函数来递归生成一系列索引和对其进行操作的主函数。

比如

void worker(stringstream& strs, int[] dims, int dims_size, int step) {
  if (step < dims_size) {
    ... // Add dims[step] to stringstream. Another if may be necessary for
    ... // whether include `,` or not
    worker(strs, dims, dims_size, step + 1);
  } else {
    ... // Add cell value to stringstream.
  }
}

string create_matrix_string(int[] dims, int dims_size, int* matrix) {
  ... // Create stringstream, etc.
  strs << ... // Add matrix name etc.
  worker(strs, dims, dims_size, 0);
  strs << ... // Add ending `;` etc.
}

这里的主要问题是值,因为在编译期间维度是未知的。您可以通过在单维表中编码矩阵来避免这种情况(嗯,这就是 C++ 对静态多维表所做的事情)并使用手动计算的索引来调用它,例如。 i + i * j(用于二维表)。再次,您可以通过递归传递累积值并在最后一步中使用它(我在上面的示例中省略)来做到这一点。而且您可能必须传递其中两个(多项式分量的运行总和,以及到目前为止已完成的步骤的索引的 i * j * k * ... * x 乘积。

所以,上面的代码远未完成(和清洁),但我希望这个想法是清晰的。

【讨论】:

    【解决方案2】:

    您可以通过在尺寸为 dim[] - 样本的容器中执行 i、j 和 k 来解决此问题:

    #include <iostream>
    #include <vector>
    
    template< typename Itr >
    bool increment( std::vector< int >& ijk, Itr idim, int start )
    {
        for( auto i = begin(ijk); i != end(ijk); ++i, ++idim )
        {
            if( ++*i <= *idim )
                return true;
            *i = start;
        }
        return false;
    }
    
    int main()
    {
        using namespace std;
        int dim[] = { 5, 7, 2, 3 };
        const int start = 1;
        vector< int > ijk( sizeof(dim)/sizeof(*dim), start );
        for( bool inc_done = true; inc_done
            ; inc_done = increment( ijk, begin(dim), start ) )
        {
            // .. here make what you want to make with ijk
            cout << "(";
            bool first = true;
            for( auto j = begin(ijk); j != end(ijk); ++j )
            {
                if( !first )
                    cout << ",";
                else
                    first = false;
                cout << *j;
            }
            cout << ")= tmp[t] " << endl;
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 2017-10-08
      • 2019-06-03
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2021-12-28
      • 2016-02-10
      • 2017-10-28
      相关资源
      最近更新 更多