1

メインメソッドで宣言された配列を、参照によって関数のパラメーターとして渡すにはどうすればよいですか? また、コンパイラは次元を必要としますが、変数を指定すると、コンパイラは配列の無効な整数次元のエラーを返します。コードは次のとおりです。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int scanV(int Row, int value, int M, int (&tableValues)[])
{
for (int i = 0; i <= M; ++i)
{
    if (tableValues[Row - 1][i] == 1)
    {
        if (i + value <= M)
        {
            tableValues[Row][i+value] == 1;
        }
        if (i - value >= 0)
        {
            tableValues[Row][i-value] = 1;
        }
    }
}
}

int main()
{
int C, B, M;
cin>>C;
int integers[C];

for (int i = 1; i < C; ++i)
{
    cin>>integers[i];
}
cin>>B;
cin>>M;
integers[0] = B;
int tableValues[C][M + 1];
tableValues[0][B] = 1;
for (int i = 1; i < C; ++i)
{
    scanV(i, integers[i], M, tableValues);
}

return 0;
}
4

2 に答える 2

3

簡単な解決策の 1 つは、ベクトルを使用することです。次の簡単な例を考えてみましょう。

#include <iostream>
#include <vector>

void f (std::vector<std::vector<int> > &v)
{
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            v[i][j] = i * 3 + j;
}

int main()
{
    std::vector<std::vector<int> > v (3, std::vector<int> (3, 0));
    f (v);

    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            std::cout << v[i][j] << ' ';
}

メインでは、int (3x3) の 2D ベクトルが作成されます。コンストラクターは 3 つの要素を示し、すべて int のベクトルで初期化され、0 に初期化された 3 つの要素で作成されます。

次に、ベクトルは参照によって関数 f に渡され、増加する値が割り当てられます。ベクトルがメインに出力されると、次のように表示されます。

0 1 2 3 4 5 6 7 8

ご覧のとおり、それらの使用は通常の配列と非常に似ていますが、実際には含まれており、STL を使用した新しいレベルのプログラミングに簡単にアクセスできます。

C++11 では、これらの使用法がさらに身近になります。次のようにベクトルを割り当てることができます。

std::vector<int> v0 = {2, 5};
std::vector<std::vector<int> > v1 { {1,2,3} , {4,5,6} , {7,8,9} };

多次元のベクトルの場合、代わりに基礎となる 1D ベクトル型を使用して何らかの行列クラスにカプセル化することをお勧めします。

編集:

1D および 2D ベクトルを指定された要素に初期化する例を次に示します。上で見たように、これは C++11 では簡単ですが、既に配列がある場合でも、かなり高速です。

int a [5] = {1,2,3,4,5}; //normal
std::vector<int> v1 (a, a +5); //create using beginning and ending addresses of a

int b[3][3] = { {1,2,3} , {4,5,6} , {7,8,9} }; //normal
std::vector<std::vector<int> > v2; //empty vector

for (int i = 0; i < 3; ++i) //3 in first dimension
    v2.push_back (std::vector<int> (b [i], b [i] + 3)); //push a vector with the appropriate 3 elements of b onto the back of v2

一度に 1 つの要素を処理するには、次のようにします。

std::vector<std::vector<int> > v (3, std::vector<int> (3));

for (int i = 0; i < v.size(); ++i) //v.size() == 3
    for (int j = 0; j < v [i].size(); ++j)
        adjustElement (v [i][j]); //replace with what you need
于 2012-04-28T01:33:51.997 に答える
1

std::vectors は、可変長配列 ( などint integers[C];) が禁止されているため、C++ で使用する方法です。

typedefコードを読みやすくするために、次のことをお勧めします。

#include <vector>

typedef std::vector<int> row_t;
typedef std::vector<row_t> table_t;

次に、次のように宣言できます。

void scanV(int Row, int value, int M, table_t& tableValues)

void何も返さないので、これを作成しました。

変数は次のint main()ようになります。

row_t integers;
table_t tableValues;

次の行に注意してください。

            tableValues[Row][i+value] == 1;

同等性をチェックするのではなく、おそらく代入するつもりでした!

Bそして、 、MC...よりも意味のある変数名を選んでみてください。

于 2012-04-28T02:36:27.960 に答える