在我正在进行的一个项目中,由于使用的数据的大小事先不知道,我需要一些动态分配。 Std::Vector似乎非常适合这个用例。 但是,由于软件环境的原因,我不能使用“现代”的C++在头。 我想转换这个向量数组,以在函数中使用与合规的头。
快速示例:
void func(int tab[][]/*Vector can not be used here*/){/*Do things*/}
int main(){
std::vector<int> vecTab[6/*Fixed, prior known, dimension*/];
//Adding a random number of values in each vector (equal number in each one)
//Transformation of vecTab
func(vecTabMod);
return 1;
}
这个网站上有很多类似的问题,没有一个真正涉及到二维数组。
加点:无需重新分配,通过指针访问
您需要将数据指针复制到一个单独的数组中,以便类型和布局与函数所期望的匹配。 这可以在没有堆分配的情况下完成,因为这个数组的大小是固定的。
int* vecTabMod[6];
std::transform(std::begin(vecTab), std::end(vecTab), std::begin(vecTabMod),
[](auto& v) { return v.data(); });
func(vecTabMod);
Std::Vector是这个灵魂的最差选择! 使用动态数组更好。
总之,您可以使用以下代码:
#include <vector>
#include <iostream>
int func(uint32_t firstDimensionSize, uint32_t* secoundDimensionSizes, int** tab){
int sum = 0;
for(uint32_t i = 0; i < firstDimensionSize; i++){
for(uint32_t j = 0; j < secoundDimensionSizes[i]; j++){
sum += tab[i][j];
}
}
return sum;
}
int main(){
std::vector<int> vecTab[6];
vecTab[0].push_back(2);
vecTab[0].push_back(5);
vecTab[3].push_back(43);
// Calculate count of elements in non dynamically arrays
uint32_t firstDimensionSize = (sizeof(vecTab) / sizeof((vecTab)[0]));
uint32_t* secoundDimensionSizes = new uint32_t[firstDimensionSize];
int**tab = new int*[firstDimensionSize];
for(uint32_t i = 0; i < firstDimensionSize; i++){
secoundDimensionSizes[i] = vecTab[i].size();
tab[i] = &(vecTab[i][0]);
}
std::cout << func(firstDimensionSize, secoundDimensionSizes, tab) << std::endl;
system("pause");
}