在c ++中使用递归构建一个字符串

时间:2013-12-13 10:16:45

标签: c++ string recursion matrix

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

我有一个问题是隔离基本案例并以有用的方式复制它。我在一个开关盒中做了一个版本,每个尺寸都有一个盒子,并且周期数等于维数:

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]<< "; ";
.... 

但不是我想要的..对于具有可变维数的更一般情况的任何想法?

2 个答案:

答案 0 :(得分: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产品,用于到目前为止所做步骤的索引。

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

答案 1 :(得分:1)

你可以通过在容量大小为[]的容器中做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;
}