提问者:小点点

转换二维C数组中的std::vector数组


在我正在进行的一个项目中,由于使用的数据的大小事先不知道,我需要一些动态分配。 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;
    }

这个网站上有很多类似的问题,没有一个真正涉及到二维数组。

加点:无需重新分配,通过指针访问


共2个答案

匿名用户

您需要将数据指针复制到一个单独的数组中,以便类型和布局与函数所期望的匹配。 这可以在没有堆分配的情况下完成,因为这个数组的大小是固定的。

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");

}