繁体   English   中英

将1D数组转换为2D矢量c ++

[英]Convert a 1D Array to 2D Vector c++

有人可以帮我写一个将ID数组转换为2D矢量的逻辑。

就像是

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

我现在如何将值放在数组中的ex ..以便它形成2个向量,每个3个值?

我一直在搜索没有用的帮助,并自己尝试了如下:

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());
}

首先,计算将有多少行向量。 如果每个元素都有三个元素,则总数是数组的大小除以3。

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

int number_of_rows = size(array) / 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];
}

你在正确的轨道上,但在你的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));

假设您总是需要三个大小为2的向量,并且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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM