0

ID配列を2Dベクトルに変換するロジックを書くのを手伝ってくれませんか?

何かのようなもの

int array[] = {1, 4, 5, 7, 9, 3}; // dynamic array
vector <vector int> ex;

3 つの値のそれぞれ 2 つのベクトルを形成するように、配列から ex に値を配置するにはどうすればよいですか?

私は役に立たないヘルプを検索し、以下のように自分で試しました:

for(int i=0; i<2; i++)
{   
        rowTemp_ex.assign(array, array+3));
 ex.push_back(rowTemp_ex);
 rowTemp_ex.erase(rowTemp_ex.begin() , rowTemp_ex.end());
}
4

3 に答える 3

1

まず、行ベクトルの数を計算します。それぞれに 3 つの要素がある場合、合計は配列のサイズを 3 で割った値になります。

template <typename T, std::size_t N>
std::size_t size(T(&)[N]) { return N; }

int number_of_rows = size(array) / 3;

次に、それぞれ 3 つの要素を持つその数の行ベクトルを持つベクトルを作成します。

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

次に、元の配列を調べて、整数除算と剰余演算を使用して、結果の各セルを埋めます。

for(int i = 0; i < size(array); ++i) {
    v[i / 3][i % 3] = array[i];
}
于 2012-06-27T10:22:54.157 に答える
1

あなたは正しい軌道に乗っていますが、 for ループでエラーを犯しました:

rowTemp_ex.assign(array, array+3));

これにより、反復ごとに配列の同じ部分が割り当てられます。行のサイズ (3) に i を掛ける必要があります。

rowTemp_ex.assign(array + i * 3, array + (i * 3) + 3));

i = 0:      0*3                  0*3+3
i = 1:                            1*3                   1*3 + 3
array:    [  0  ][  1  ][   2  ][   3  ][  4   ][  5  ] [one past the end]

への呼び出しvector::eraseは冗長vector::assignです。次の反復では、とにかく前のコンテンツを破棄します。

これは、可能性のある奇妙な要素(テストされていない)も処理する、より一般的なものです。

const size_t arr_size = N;
const size_t n_cols = M;
const size_t n_rows = arr_size / n_cols;
const size_t n_odd = arr_size % n_cols;

int arr[arr_size] = { .... };

int* begin = arr;
int* end = arr + (n_rows * n_cols);

while( begin != end ) {
    ex.push_back(std::vector<int>(begin, begin + n_cols));
    begin += n_cols;
}

if (n_odd)
    ex.push_back(std::vector<int>(begin, begin + n_odd));
于 2012-06-27T11:08:55.923 に答える
0

サイズがそれぞれ 2 の 3 つのベクトルが常に必要であり、2D ベクトルが C 配列内でペアで整列されていると仮定すると、次のように実行します。

int array[] = {1, 4, 5, 7, 9, 3}; // dynamic array
vector<vector<int> > ex;

for(int i = 0; i < 3; ++i)
{
    vector<int> tmp;
    tmp.push_back(array[2*i]);
    tmp.push_back(array[2*i+1]);
    ex.push_back(tmp);
}
于 2012-06-27T10:23:12.813 に答える