尝试创建一个 3D 矢量,该矢量将保留指向指向无符号字符的指针的指针

Trying to create a 3D vector that will hold pointers to a pointers to unsigned char

本文关键字:指针 保留 字符 无符号 创建 矢量 3D 一个      更新时间:2023-10-16

我试图创建一个向量,该向量将包含指向无符号字符的其他指针的指针。 我的向量定义如下

std::vector<unsigned char**> slices; // data for each slice, in order
//populating vector
unsigned char a = 1;
for (int k = 0; k < size; k++)
{
    unsigned char ** tempSlice = new unsigned char*;
    slices.push_back(tempSlice);
    for (int y = 0; y < height; y++)
    {
        unsigned char * tempY = new unsigned char;
        slices[k].push_back(&tempY);
        for (int x = 0; x < width; x++)
        {
            slices[k][y][x] = a;
        }
    }
}

但是,我得到的错误是以下几行:

error request for member ‘push_back’ in ‘((VolImage*)this)-     
>VolImage::slices.std::vector<_Tp, _Alloc>::operator[]<unsigned char**, 
std::allocator<unsigned char**> >(((std::vector<unsigned 
char**>::size_type)k))’, which is of non-class type 
‘__gnu_cxx::__alloc_traits<std::allocator<unsigned char**> >::value_type 
{aka unsigned 

我不知道我做错了什么。另外,如果有人可以看看我的析构函数方法,看看我是否在正确的轨道上:

VolImage::~VolImage()
{
    std::cout<<"Destructor"<<std::endl;
    //deconstructing the vector of slices
    int size = slices.size();
    for (int k = 0; k < size; k++)
    {
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                delete &slices[k][y][x];
            }
            delete[] slices[k][y];
        }
        delete[] slices[k];
   }
delete[] &slices;
}

您在这里已经有一个错误:

    slices[k].push_back(&tempY);

这是由错误消息解释的,但人们普遍认为 gcc 的 C++ 错误消息并不是最容易解析的。

"((VolImage*)this)中成员"push_back"的错误请求-
VolImage::slices.std::vector<_Tp, _Alloc>::operator[]>(((std::vector::size_type)k))',属于非类类型 'a__gnu_cxx::__alloc_traits>::value_type {又名无符号

这告诉你你正在请求一个成员函数~push_back~(大复杂的结构),它是非类类型的(更难解析的东西){aka unsigned char*}

还有一个问题:slices[k] 给你一个 ~unsigned char*~ 的引用,而 char ptrs 没有成员函数push_back。

查看代码的其余部分,看起来您想要一个 char** 的二维数组。 实现此目的的一种方法是向量向量:

std::vector<std::vector<char**>> slices;

这将为你提供一个二维向量,并允许你的第二个push_back成功,但会导致你的第一个push_back失败,因为你将尝试将字符**推入容器容器中。 稍后您将再次失败,因为您将二维向量视为三维向量。

如果你不介意一点指导,你试图一次跳过太多的抽象级别。 首先尝试char*的向量,然后可能是char**的向量,然后可能将其制作成3D向量。 这样,您一次只需要处理一类错误(概念错误和编译器错误)。

这将是一个有用的练习,因为您将更好地了解C++中的指针和向量。 完成学习过程后,您可能会找到更适合此目的的其他容器。 例如提升multi_array

从您的评论

我知道你打算使用字符**的向量作为 3D 数组...... 所以在这种情况下,char** 必须被理解为一个二维字符数组......有关说明,请参阅此处。 然后你制作这些二维数组的向量 - 下面是一个例子:

int main() {

std::vector<unsigned char**> slices; // data for each slice, in order
const unsigned int size =5;
const unsigned int rows =2;
const unsigned int cols =3;
for (int k = 0; k < size; k++)
{
    unsigned char** twoD = new unsigned char*[rows];
    for(int i = 0; i < rows; ++i)
        twoD[i] = new unsigned char[cols];
    slices.push_back(twoD);
}
slices[0][0][0] = 'x';
std::cout <<    slices[0][0][0] << std::endl;
}

向量的类型必须是 void* 类型,然后在重用该指针时需要类型转换为 char** 或 char* 或其他任何内容。